Search Postgresql Archives

Will the optimizer eliminate an unnecessary sort?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm using postgres 7.4.6 and I've created a table as follows:

    create table t(dh int, fh int, fn int, x bytea, ...)
    create index idx_dh_fh on t(dh, fh);

I have this query:

    select * 
    from t 
    where dh = 1 
    and fn > 1000 
    and x = 'abc' 
    order by fn;

The optimizer uses the index, filters, and then sorts:

    ris=# explain select * from t where dh = 1 and x = 'abc' and fn > 1000 order
by fn;
                                            QUERY PLAN
   
-------------------------------------------------------------------------------------------
     Sort  (cost=651.24..651.25 rows=2 width=195)
       Sort Key: fn
       ->  Index Scan using idx_dh_fh on t  (cost=0.00..651.23 rows=2
width=195)
             Index Cond: (dh = 1)
             Filter: ((x = 'abc'::bytea) AND (fn > 1000))
    (5 rows)

So far so good. I was hoping to avoid the sort by adding another index:
 
    create index idx_dh_fn on t(dh, fn);

The lookup on dh can use the new index. The inequality on fn should
also be able to use the index. The sort should then be unnecessary because
the index will already have the fn values in order for the given value
of dh.

But (after running vacuum analyze), the optimizer is still generating
a plan with a sort:

    ris=# explain select * from t where dh = 1 and x = 'abc' and fn > 1000 order
by fn;
                                           QUERY PLAN
   
-----------------------------------------------------------------------------------------
     Sort  (cost=604.06..604.06 rows=1 width=195)
       Sort Key: fn
       ->  Index Scan using idx_dh_fn on t  (cost=0.00..604.05 rows=1
width=195)
             Index Cond: (dh = 1)
             Filter: ((x = 'abc'::bytea) AND (fn > 1000))
    (5 rows)

Is the execution plan I'm hoping for correct? 

Is it something in the postgres optimizer's repertoire?

The user of this query is interested in only the first few rows. So
not only is the sort unnecessary, but all qualifying rows have to be
accessed before the sort. If the optimizer is not going to produce the
plan I want, is there some other way to achieve the desired effect?

Jack Orenstein


----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.


---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to majordomo@xxxxxxxxxxxxxx so that your
      message can get through to the mailing list cleanly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux