Hello!
I have a partial index (btree(col) WHERE col > 0) on table2 ('col' contains
alot of NULL-values).
There's also a foreign key on the column pointing to the primary key of table1
(ON UPDATE CASCADE ON DELETE SET NULL). During update/delete, it seems like it
cannot use the partial index to find corresponding rows matching the foreign
key (doing a full seqscan instead)?
Is there any special reason for not letting the planner use the partial index
when appropriate?
\d table1
Table "public.table1"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
text | text |
Indexes:
"table1_pkey" primary key, btree (id)
\d table2
Table "public.table2"
Column | Type | Modifiers
--------+---------+-----------
id | integer | not null
col | integer |
value | integer |
Indexes:
"table2_pkey" primary key, btree (id)
CREATE INDEX col_part_key ON table2 USING btree(col) WHERE col > 0;
ANALYZE table2;
EXPLAIN ANALYZE DELETE FROM table2 WHERE col=1;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------
Index Scan using col_part_key on table2 (cost=0.00..6.01 rows=6 width=6)
(actual time=0.592..1.324 rows=8 loops=1)
Index Cond: (col = 1)
Total runtime: 4.904 ms
Delete manually WITHOUT foreign key:
test=> begin work;
BEGIN
Time: 0.808 ms
test=> explain analyze delete from table1 where id=1;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Index Scan using table1_pkey on table1 (cost=0.00..3.01 rows=2 width=6)
(actual time=0.312..0.324 rows=1 loops=1)
Index Cond: (id = 1)
Total runtime: 0.623 ms
(3 rows)
Time: 3.912 ms
test=> explain analyze delete from table2 where col=1;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Index Scan using col_part_key on table2 (cost=0.00..14.70 rows=36 width=6)
(actual time=0.338..0.557 rows=8 loops=1)
Index Cond: (col = 1)
Total runtime: 0.881 ms
(3 rows)
Time: 3.802 ms
test=> rollback;
ROLLBACK
Delete WITH foreign key:
test=> ALTER TABLE table2 ADD CONSTRAINT col_fkey FOREIGN KEY (col) REFERENCES
table1(id) ON UPDATE CASCADE ON DELETE SET NULL;
ALTER TABLE
Time: 3783.009 ms
test=> begin work;
BEGIN
Time: 1.509 ms
test=> explain analyze delete from table1 where id=1;
rollback;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Index Scan using table1_pkey on table1 (cost=0.00..3.01 rows=2 width=6)
(actual time=0.769..0.781 rows=1 loops=1)
Index Cond: (id = 1)
Total runtime: 1.027 ms
(3 rows)
Time: 3458.585 ms
test=> rollback;
ROLLBACK
Time: 1.506 ms
/Nichlas
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend