Optimizer: limit not taken into account

Поиск
Список
Период
Сортировка
От Craig A. James
Тема Optimizer: limit not taken into account
Дата
Msg-id 446B474C.2050803@modgraph-usa.com
обсуждение исходный текст
Ответ на Re: Pgsql (and mysql) benchmark on T2000/Solaris and some  (Arjen van der Meijden <acmmailing@tweakers.net>)
Ответы Re: Optimizer: limit not taken into account  (Bruno Wolff III <bruno@wolff.to>)
Re: Optimizer: limit not taken into account  (Simon Riggs <simon@2ndquadrant.com>)
Re: Optimizer: limit not taken into account  ("Jim C. Nasby" <jnasby@pervasive.com>)
Список pgsql-performance
Here's a "corner case" that might interest someone.  It tripped up one of our programmers.

We have a table with > 10 million rows.  The ID column is indexed, the table has been vacuum/analyzed.  Compare these
twoqueries: 

   select * from tbl where id >= 10000000 limit 1;
   select * from tbl where id >= 10000000 order by id limit 1;

The first takes 4 seconds, and uses a full table scan.  The second takes 32 msec and uses the index.
Details are below.

I understand why the planner makes the choices it does -- the "id > 10000000" isn't very selective and under normal
circumstancesa full table scan is probably the right choice.  But the "limit 1" apparently doesn't alter the planner's
strategyat all.  We were surprised by this. 

Adding the "order by" was a simple solution.

Craig



pg=> explain analyze select url, url_digest from url_queue where priority >= 10000000 limit 1;
                       QUERY PLAN
------------------------------------------------------------------------------------------
 Limit  (cost=0.00..0.65 rows=1 width=108) (actual time=4036.113..4036.117 rows=1 loops=1)
   ->  Seq Scan on url_queue  (cost=0.00..391254.35 rows=606176 width=108) (actual time=4036.101..4036.101 rows=1
loops=1)
         Filter: (priority >= 10000000)
 Total runtime: 4036.200 ms
(4 rows)

pg=> explain analyze select url, url_digest from url_queue where priority >= 10000000 order by priority limit 1;
                       QUERY PLAN
--------------------------------------------------------------------------------------
 Limit  (cost=0.00..2.38 rows=1 width=112) (actual time=32.445..32.448 rows=1 loops=1)
   ->  Index Scan using url_queue_priority on url_queue  (cost=0.00..1440200.41 rows=606176 width=112) (actual
time=32.434..32.434rows=1 loops=1) 
         Index Cond: (priority >= 10000000)
 Total runtime: 32.566 ms

В списке pgsql-performance по дате отправления:

Предыдущее
От: "Jim C. Nasby"
Дата:
Сообщение: Re: IMMUTABLE?
Следующее
От: john_oshea@wordbank.com
Дата:
Сообщение: Re: SQL CPU time usage