Является ли Postgres умным и использует мой не нулевой индекс в этом запросе? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть такой индекс для моих кандидатов и их столбец с именем:

CREATE INDEX ix_public_candidates_first_name_not_null 
ON public.candidates (first_name) 
WHERE first_name IS NOT NULL;

Достаточно ли умен Postgres, чтобы знать, что оператор равенства означает, что он не может быть нулевым, или мне просто повезло, что мой индекс "не равен нулю" используется в этом запросе?

выберите * от public.candidates где first_name = 'Эрик'

Анализировать вывод:

Bitmap Heap Scan on candidates  (cost=57.46..8096.88 rows=2714 width=352) (actual time=1.481..18.847 rows=2460 loops=1)
  Recheck Cond: (first_name = 'Erik'::citext)
  Heap Blocks: exact=2256
  ->  Bitmap Index Scan on ix_public_candidates_first_name_not_null  (cost=0.00..56.78 rows=2714 width=0) (actual time=1.204..1.204 rows=2460 loops=1)
        Index Cond: (first_name = 'Erik'::citext)
Planning time: 0.785 ms
Execution time: 19.340 ms

1 Ответ

0 голосов
/ 03 сентября 2018

Оптимизатор PostgreSQL не основан на удачных догадках.

Это действительно может сделать вывод, что все, что соответствует условию равенства, не может быть NULL; доказательство - план выполнения, который вы показываете.

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