У меня есть запрос, который содержит предложение вида 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)
Есть ли причина для этого?Есть ли способ сказать оптимизатору логически оценить / упростить запрос?