From: | Willy-Bas Loos <willybas(at)gmail(dot)com> |
---|---|
To: | pgsql-performance(at)postgresql(dot)org |
Subject: | not using partial index |
Date: | 2011-04-20 08:46:59 |
Message-ID: | BANLkTikUt403PkMGb4bFMHMBZsJZRPV5Bw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Hi,
I'm using PostgreSQL 8.4 (and also 8.3).
A partial index like this:
CREATE INDEX table2_field1_idx
ON table2 (field1)
WHERE NOT field1 ISNULL;
Will not be used when select one record from 100K records:
explain select * from table2 where field1 = 256988
'Seq Scan on table2 (cost=0.00..1693.01 rows=1 width=4)'
' Filter: (field1 = 256988)'
But it WILL be used like this:
explain select * from table2 where field1 = 256988 and not field1 isnull
'Index Scan using table2_field1_idx on table2 (cost=0.00..8.28 rows=1
width=4)'
' Index Cond: (field1 = 256988)'
But, when i change the index from"NOT field1 ISNULL " to "field1 NOTNULL",
then the index WILL be used in both queries:
explain select * from table1 where field1 = 256988
'Index Scan using table1_field1_idx on table1 (cost=0.00..8.28 rows=1
width=4)'
' Index Cond: (field1 = 256988)'
'Index Scan using table1_field1_idx on table1 (cost=0.00..8.28 rows=1
width=4)'
' Index Cond: (field1 = 256988)'
' Filter: (NOT (field1 IS NULL))'
Any ideas why this might be?
Cheers,
WBL
Code below:
--drop table table1;
create table table1(field1 integer);
CREATE INDEX table1_field1_idx
ON table1 (field1)
WHERE field1 NOTNULL;
insert into table1 values(null);
insert into table1 select generate_series(1,100000);
vacuum analyze table1;
explain select * from table1 where field1 = 256988
explain select * from table1 where field1 = 256988 and not field1 isnull
--drop table table2;
create table table2(field1 integer);
CREATE INDEX table2_field1_idx
ON table2 (field1)
WHERE NOT field1 ISNULL;
insert into table2 values(null);
insert into table2 select generate_series(1,100000);
vacuum analyze table2;
explain select * from table2 where field1 = 256988
explain select * from table2 where field1 = 256988 and not field1 isnull
--
"Patriotism is the conviction that your country is superior to all others
because you were born in it." -- George Bernard Shaw
From | Date | Subject | |
---|---|---|---|
Next Message | Jeff | 2011-04-20 12:39:07 | Re: postgresql random io test with 2 SSD Kingston V+100 500GB in (software) Raid1 |
Previous Message | Joby Joba | 2011-04-20 07:58:10 | Re: Two different execution plans for similar requests |