From: Bruce Momjian Date: Tue, 20 Apr 2004 01:00:26 +0000 (+0000) Subject: > >> My question is whether postgres can index null values, and if not, do I X-Git-Tag: REL8_0_0BETA1~804 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ef77149f7ed29d65096b126d9b062dc110b5b74;p=postgresql > >> My question is whether postgres can index null values, and if not, do I > >> have to accept a full table scan when locating records. > > > > It indexes them, but "is null" is not an indexable operator, so you > > can't directly solve the above with a 3-column index. What you can do > > instead is use a partial index, for instance > > > > create index i on CUSTOMER.WCCustOrderStatusLog (WCOrderStatusID) > > where Acknowledged is null and Processing is null; > > That's a very nifty trick and exactly the sort of answer I was after! Add CREATE INDEX doc mention of using partial indexes for IS NULL indexing; idea from Tom. --- diff --git a/doc/src/sgml/ref/create_index.sgml b/doc/src/sgml/ref/create_index.sgml index abd0987b15..34e12c6a5d 100644 --- a/doc/src/sgml/ref/create_index.sgml +++ b/doc/src/sgml/ref/create_index.sgml @@ -1,5 +1,5 @@ @@ -66,7 +66,7 @@ CREATE [ UNIQUE ] INDEX name ON WHERE clause is present, a partial index is created. A partial index is an index that contains entries for only a portion of - a table, usually a portion that is somehow more interesting than the + a table, usually a portion that is more useful for indexing than the rest of the table. For example, if you have a table that contains both billed and unbilled orders where the unbilled orders take up a small fraction of the total table and yet that is an often used section, you @@ -76,10 +76,18 @@ CREATE [ UNIQUE ] INDEX name ON + + NULL values are not indexed by default. The best way + to index NULL values is to create a partial index using + an IS NULL comparison. IS NULL is more + of a function call than a value comparison, and this is why a partial + index works. + + The expression used in the WHERE clause may refer - only to columns of the underlying table (but it can use all columns, - not only the one(s) being indexed). Presently, subqueries and + only to columns of the underlying table, but it can use all columns, + not just the ones being indexed. Presently, subqueries and aggregate expressions are also forbidden in WHERE. The same restrictions apply to index fields that are expressions.