Запрос Postgresql, содержащий константу в логическом или приводит к полному сканированию таблицы - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть запрос, который содержит предложение вида CONSTANT OR t.foo=:foo, где CONSTANT - это некоторое выражение, которое оценивается как постоянное логическое значение.Затем запрос выполняется как полное сканирование таблицы, даже если для столбца foo существует индекс, а простой t.foo=:foo будет использовать этот индекс.Пример запроса, который я проанализировал, имел форму :foo IS NOT NULL OR t.foo=:foo.Вот простой пример:

CREATE TABLE tst (
id serial,
name VARCHAR NOT NULL,
age INTEGER NOT NULL,
CONSTRAINT PK_ID PRIMARY KEY(ID));

EXPLAIN SELECT * FROM tst WHERE (23 IS NOT NULL OR id=23);
                       QUERY PLAN                       
--------------------------------------------------------
 Seq Scan on tst  (cost=0.00..22.00 rows=1200 width=40)

Есть ли причина для этого?Есть ли способ сказать оптимизатору логически оценить / упростить запрос?

...