CREATE TABLE detail ( invno VARCHAR, accno INTEGER, info INTEGER[] );
CREATE OR REPLACE VIEW detailview AS
( SELECT invno , accno , COALESCE( info[1],0 ) info1, COALESCE( info[2],0 ) info2, COALESCE( info[3],0 ) info3,
COALESCE(info[4],0 ) info4 FROM detail );
CREATE INDEX detail_ix_info3 ON detail ( ( info[3] ) ) WHERE COALESCE(
info[3],0 ) = 1;
EXPLAIN SELECT * FROM detail WHERE COALESCE( info[3],0 ) =1;
QUERY PLAN
------------------------------------------------------------------------------Bitmap Heap Scan on detail
(cost=4.13..12.59rows=4 width=68) Recheck Cond: (COALESCE(info[3], 0) = 1) -> Bitmap Index Scan on detail_ix_info3
(cost=0.00..4.13rows=4
width=0)
(3 rows)
EXPLAIN SELECT * FROM detailview WHERE COALESCE( info3,0 ) =1;
QUERY PLAN
--------------------------------------------------------Seq Scan on detail (cost=0.00..20.38 rows=4 width=68) Filter:
(COALESCE(COALESCE(info[3],0), 0) = 1)
(2 rows)
This is an oversimplified example; the view in our production env provides for 20 elements in the info array column. My
tablein productions env contains ~10mil rows.
Is there any way in which I can force the view to use the index?
_______________________
Why are you applying "extra" COALESCE when querying the view?
Why not just:
SELECT * FROM detailview WHERE infor3 = 1;
?
Regards,
Igor Neyman