Як правило, 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 - це милиці, які регулярно не вдається отримати повний потенціал з ваших RDBMS.