PostgreSQL: почему этот простой запрос не использует индекс? - PullRequest
9 голосов
/ 05 февраля 2011

У меня есть таблица t со столбцом c, которая является целым числом и имеет индекс btree.

Почему следующий запрос не использует этот индекс?

explain select c from t group by c;

Результат, который я получаю:

HashAggregate  (cost=1005817.55..1005817.71 rows=16 width=4)
  ->  Seq Scan on t  (cost=0.00..946059.84 rows=23903084 width=4)

Мое понимание индексов ограничено, но я думал, что такие запросы были целью индексов.

Ответы [ 3 ]

6 голосов
/ 05 февраля 2011

Этот запрос может быть выполнен с использованием оптимизации, называемой сканирование свободного индекса .Однако PostgreSQL еще не реализует эту оптимизацию, поэтому вместо этого он использует сканирование таблиц.

Из основных баз данных, насколько мне известно, только В MySQL реализовано свободное сканирование индексов (возможно, Oracleтоже?).PostgreSQL не не реализовал эту функцию.

4 голосов
/ 06 февраля 2011

Запрос, конечно, может использовать индекс.Причина, по которой это не так, в вашем конкретном случае зависит от конкретного размера и распределения данных.Вы можете использовать SET enable_seqscan TO off для расследования.

3 голосов
/ 05 февраля 2011

Поскольку требуется сканирование всей таблицы, выполнение этого с помощью индекса бесполезно.(«Индексы покрытия» не полезны в качестве метода производительности в PostgreSQL из-за его реализации MVCC).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...