Почему нельзя увидеть индекс типа enum в запросе объяснения? - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь добавить индекс, который является полем типа enum (status), но не может видеть index scan для этого индекса в запросе объяснения. Не могу понять, о чем я скучаю.

-- t_post_status = ('waiting', 'published', 'deleted')

create index status ON public."Post" USING btree ((status::t_post_status))

Итак, когда я запускаю запросы ниже, я получаю следующий результат:

explain select id from "Post" where status = 'published' limit 1
explain select id from "Post" where status = 'published'::t_post_status limit 1

Limit  (cost=0.00..0.20 rows=1 width=4)
  ->  Seq Scan on "Post"  (cost=0.00..5692.64 rows=29192 width=4)
        Filter: (status = 'published'::t_post_status)

Но, когда они, я могу видеть index scan для идентификатора (или другого индекса, когда я изменяю запрос);

explain select id from "Post" where status = 'published' and id = 1 limit 1
explain select id from "Post" where status = 'published'::t_post_status and id = 1 limit 1

Limit  (cost=0.29..8.31 rows=1 width=4)
  ->  Index Scan using "Post_pkey" on "Post"  (cost=0.29..8.31 rows=1 width=4)
        Index Cond: (id = 1)
        Filter: (status = 'published'::t_post_status)

1 Ответ

2 голосов
/ 14 марта 2019

Поскольку значение published настолько «популярно» в таблице, кажется, что оптимизатор SQL в PostgreSQL решил, что дешевле использовать последовательное сканирование таблиц, чем использовать индекс.

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

Альтернативный вариант использования индекса (тот, который вы ожидали) потребует:

  • Индексwalk.
  • Затем читается одна куча.

Скорее всего, это дороже, чем ударить кучу сразу.

Довольно умно.

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