Re: View not using index

From: Igor Neyman <ineyman(at)perceptron(dot)com>
To: gmb <gmbouwer(at)gmail(dot)com>, "pgsql-sql(at)postgresql(dot)org" <pgsql-sql(at)postgresql(dot)org>
Subject: Re: View not using index
Date: 2015-09-15 13:29:09
Message-ID: A76B25F2823E954C9E45E32FA49D70ECCD515FDC@mail.corp.perceptron.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

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.59 rows=4 width=68)
Recheck Cond: (COALESCE(info[3], 0) = 1)
-> Bitmap Index Scan on detail_ix_info3 (cost=0.00..4.13 rows=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 table in 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

In response to

Browse pgsql-sql by date

  From Date Subject
Next Message gmb 2015-09-16 04:45:44 Re: View not using index
Previous Message Brice André 2015-09-15 13:18:08 Re: View not using index