On Thu, Sep 1, 2011 at 12:09 AM, David Johnston <pol...@yahoo.com> wrote:

> ** **
>
> *From:* pgsql-sql-ow...@postgresql.org [mailto:
> pgsql-sql-ow...@postgresql.org] *On Behalf Of *Viktor Bojovic
> *Sent:* Wednesday, August 31, 2011 5:27 PM
> *To:* pgsql-sql@postgresql.org; pgsql-ad...@postgresql.org
> *Subject:* [SQL] function based index problem****
>
> ** **
>
> Hi,
> on table entry (17M records) there is one index:
>
> CREATE INDEX ndxlen
>   ON uniprot_frekvencije.entry
>   USING btree
>   (length(sequence::text));
>
> When using ">=" in search which returns only two records, query runs much
> (hundred times) slower. i don't know why it doesn't use index scan. I just
> wanted to ask how can i modify the query to use that index? Explain plans
> are pasted below.
>
> bioinf=> explain select * from entry where length(sequence)=36805;
>                                  QUERY PLAN
>
>
> ----------------------------------------------------------------------------
>  Bitmap Heap Scan on entry  (cost=1523.54..294886.26 rows=81226 width=1382)
>    Recheck Cond: (length((sequence)::text) = 36805)
>    ->  Bitmap Index Scan on ndxlen  (cost=0.00..1503.23 rows=81226 width=0)
>          Index Cond: (length((sequence)::text) = 36805)
> (4 rows)
>
> bioinf=> explain select * from entry where length(sequence)>=36805;
>                              QUERY PLAN
> --------------------------------------------------------------------
>  Seq Scan on entry  (cost=0.00..5400995.21 rows=5415049 width=1382)
>    Filter: (length((sequence)::text) >= 36805)
> (2 rows)
>
> Thanx in advance
> --
> ---------------------------------------
> Viktor Bojović
> ---------------------------------------
> Wherever I go, Murphy goes with me****
>
> ** **
>
> Some observations/suggestions:****
>
> ** **
>
> Please do not Cross-Post****
>
> You have not provided your PostgreSQL version****
>
> ** **
>
> You state the “>=” query only returns 2 rows but the plan expects to return
> 5.4 MILLION – with that many results Sequential Scan is going to be faster
> than an Index****
>
> Either you have not run “ANALYZE” or you have more data than you think
> matching your criteria.  Try “EXPLAIN ANALYZE” to actually run the query and
> see what you get.****
>
> ** **
>
> It is likely that a simple ANALYZE on the table will solve your problem
> (ALWAYS RUN ANALYZE BEFORE POSTING QUESTIONS LIKE THIS); in the unlikely
> event it does not please post the “EXPLAIN ANALYZE” results so we can see
> exactly how many records each query returned.****
>
> ** **
>
> David J.****
>
> ** **
>

It works now after "analyze entry" was executed. thanx a lot.


-- 
---------------------------------------
Viktor Bojović
---------------------------------------
Wherever I go, Murphy goes with me

Reply via email to