ВЫБЕРИТЕ отчетливо, избавляясь от растрового сканирования кучи - PullRequest
0 голосов
/ 18 марта 2011

Учитывая таблицу

create table a (x int, y int);
create index a_x_y on a(x, y);

Я ожидаю, что запрос типа select distinct x from a where y = 1 будет использовать только индекс, вместо этого он использует индекс для фильтрации по y, а затем Сканирование битовой карты чтобы получить все значения x.

---------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=15.03..15.05 rows=2 width=4) (actual time=0.131..0.131 rows=0 loops=1)
   ->  Bitmap Heap Scan on a  (cost=4.34..15.01 rows=11 width=4) (actual time=0.129..0.129 rows=0 loops=1)
         Recheck Cond: (y = 1)
         ->  Bitmap Index Scan on a_x_y  (cost=0.00..4.33 rows=11 width=0) (actual time=0.125..0.125 rows=0 loops=1)
               Index Cond: (y = 1)

Какой тип индекса потребуется для запроса такого типа?

Ответы [ 2 ]

3 голосов
/ 18 марта 2011

Поскольку вы фильтруете второй столбец индекса, он не будет использоваться для прямого сканирования индекса.Если вы измените индекс на y, x вместо x, y, он может дать вам искомое сканирование.

Кроме того, вы вполне можете получить другой план запроса, если вы поставите фактическийданные в вашей таблице, поэтому вы должны провести тестирование с реалистичными данными.

Наконец, я думаю, вы неправильно понимаете узлы растрового сканирования.Сканирование битовой карты не означает, что выполняется сканирование кучи.Он использует индексы, чтобы узнать, на каких страницах есть интересные строки, и затем сканирует эти страницы только в таблице во второй операции.

1 голос
/ 18 марта 2011

Сканирование растровой кучи занимает 0,129 миллисекунды, разве это не достаточно быстро?

Если вы думаете о «сканировании только индекса», PostgreSQL пока не может этого сделать.

...