X-Original-To: pgsql-performance-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 0BBCD52869 for ; Tue, 31 May 2005 00:37:47 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 39963-07 for ; Tue, 31 May 2005 03:37:41 +0000 (GMT) Received: from wolff.to (wolff.to [66.93.197.194]) by svr1.postgresql.org (Postfix) with SMTP id C08555294F for ; Tue, 31 May 2005 00:37:36 -0300 (ADT) Received: (qmail 20260 invoked by uid 500); 31 May 2005 03:36:33 -0000 Date: Mon, 30 May 2005 22:36:33 -0500 From: Bruno Wolff III To: Tobias Brox Cc: pgsql-performance@postgresql.org Subject: Re: Index on a NULL-value Message-ID: <20050531033633.GA20015@wolff.to> Mail-Followup-To: Bruno Wolff III , Tobias Brox , pgsql-performance@postgresql.org References: <20050531030207.GD26100@tobias.exoweb.net> <20050531032119.GH26100@tobias.exoweb.net> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050531032119.GH26100@tobias.exoweb.net> User-Agent: Mutt/1.5.6i X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.008 tagged_above=0 required=5 tests=AWL X-Spam-Level: X-Archive-Number: 200505/458 X-Sequence-Number: 12622 On Tue, May 31, 2005 at 11:21:20 +0800, Tobias Brox wrote: > [Tobias Brox - Tue at 11:02:07AM +0800] > > test=# explain select * from mock where b is NULL; > > QUERY PLAN > > -------------------------------------------------------------------- > > Seq Scan on mock (cost=100000000.00..100000020.00 rows=6 width=8) > > Filter: (b IS NULL) > > (2 rows) > > (...) > > > ---------------------------(end of broadcast)--------------------------- > > TIP 9: the planner will ignore your desire to choose an index scan if your > > joining column's datatypes do not match > > That tip helped me :-) > > test=# explain select * from mock where (b IS NULL)=true; > QUERY PLAN > > ---------------------------------------------------------------------- > Index Scan using b_is_null on mock (cost=0.00..4.68 rows=1 width=8) > Index Cond: ((b IS NULL) = true) > (2 rows) Looked back at your first example and saw that you didn't use a partial index which is why you had to contort things to make it possible to use an indexed search. (Though the planner really should have done this since all of the rows should be in one disk block and doing an index scan should require doing more disk reads than a sequential scan for the test case you used.) You want something like this: CREATE INDEX b_is_null ON mock(b) WHERE b IS NULL; The advantage is that the index can be a lot smaller than an index over all of the rows in the case where only a small fraction of rows have a null value for b. (If this isn't the case you probably don't want the index.)