Как правило, col IS NULL
это возможный кандидат для поиска по индексу b-дерева (по умолчанию). Руководство :
Кроме того, условие IS NULL
или IS NOT NULL
столбец индекса может использоваться с индексом B-дерева.
Чтобы получить подтверждение, отключите последовательное сканирование (только в тестовой сессии!):
SET enable_seqscan = OFF;
Я цитирую руководство здесь :
enable_seqscan (boolean)
Включает или отключает использование планировщиком запросов типов планов последовательного сканирования. Невозможно полностью отключить последовательное сканирование, но отключение этой переменной не позволяет планировщику использовать один, если есть другие доступные методы. По умолчанию включено.
Тогда попробуйте еще раз:
EXPLAIN ANALYZE SELECT * FROM tbl WHERE auto_renew IS NULL;
Это, вероятно, приведет к сканированию индекса растрового изображения, которое будет медленнее, чем последовательное сканирование таблицы.
Сбросьте или закройте сеанс (параметр является локальным для сеанса).
RESET enable_seqscan;
Индексы по boolean
столбцам полезны только в определенных случаях. Планировщик использует индекс, только если ожидает, что он будет быстрее. Расчеты основаны на ваших настройках стоимости и статистике, собранной ANALYZE
. Если значительная часть таблицы соответствует вашим условиям (около 5% или более, это зависит от ситуации), вместо этого обычно быстрее выполнить полное сканирование таблицы.
Это оставляет редкое значение в boolean
столбце в качестве единственного полезного кандидата для простого индекса. И для этого, как правило, более эффективно создать (более специализированный) частичный индекс - который дешевле поддерживать, меньше, быстрее и легче использовать, если условие запроса совпадает.
Если у вас есть много запросов, ищущих строки с, auto_renew IS NULL
и NULL
случай не очень распространен (и / или вам нужен определенный порядок сортировки), тогда этот индекс поможет быстро найти / отсортировать эти строки:
CREATE INDEX index_tbl_tbl_id_auto_renew_null ON tbl (tbl_id)
WHERE auto_renew IS NULL;
Условие частичного индекса должно повторяться в WHERE
предложении запроса более или менее точно, чтобы планировщик запросов понял, что индекс применим.
Индексированный столбец ( tbl_id
) - это произвольный выбор. Важной частью является WHERE
пункт. Этот конкретный индекс будет наиболее эффективным для запросов с ORDER BY tbl_id
дополнительным фильтром или присоединением tbl_id
. Вы можете сделать это многоколоночным индексом . Булевы столбцы часто более полезны в сочетании с другими.
Кроме того: ORM - это костыли, которые регулярно не в состоянии полностью раскрыть потенциал вашей СУБД.