Zasadniczo col IS NULL
jest możliwym kandydatem do (domyślnego) wyszukiwania indeksu b-drzewa. Podręcznik :
Można również użyć warunku IS NULL
lub IS NOT NULL
w kolumnie indeksu z indeksem B-drzewa.
Aby uzyskać dowód, wyłącz skanowanie sekwencyjne (tylko w sesji testowej!):
SET enable_seqscan = OFF;
Przytaczam instrukcję tutaj :
enable_seqscan (boolean)
Włącza lub wyłącza użycie przez planer zapytań typów planów skanowania sekwencyjnego. Niemożliwe jest całkowite wyeliminowanie skanowania sekwencyjnego, ale wyłączenie tej zmiennej zniechęca planistę do korzystania z niej, jeśli dostępne są inne metody. Domyślnie jest włączony.
Następnie spróbuj ponownie:
EXPLAIN ANALYZE SELECT * FROM tbl WHERE auto_renew IS NULL;
Prawdopodobnie spowoduje to skanowanie indeksu map bitowych, które będzie wolniejsze niż skanowanie sekwencyjne na stole.
Zresetuj lub zamknij sesję (ustawienie to sesja lokalna).
RESET enable_seqscan;
Indeksy na boolean
kolumnach są użyteczne tylko w niektórych przypadkach. Planista używa indeksu tylko wtedy, gdy oczekuje, że będzie on szybszy. Obliczenia są oparte na ustawieniach kosztów i statystykach gromadzonych przez ANALYZE
. Jeśli znaczna część tabeli odpowiada twojemu warunkowi (około 5% lub więcej, to zależy), zwykle zamiast tego wykonuje się pełne skanowanie tabeli.
Pozostawia to rzadką wartość w boolean
kolumnie jako jedynego przydatnego kandydata na zwykły indeks. Zwykle bardziej efektywne jest utworzenie (bardziej wyspecjalizowanego) indeksu częściowego w tym celu - który jest tańszy w utrzymaniu, mniejszy, szybszy i stosowany łatwiej, jeśli warunki zapytania są zgodne.
Jeśli masz wiele zapytań szukających wierszy, auto_renew IS NULL
a wielkość NULL
liter nie jest zbyt powszechna (i / lub potrzebujesz określonej kolejności sortowania), ten indeks pomoże szybko znaleźć / posortować te wiersze:
CREATE INDEX index_tbl_tbl_id_auto_renew_null ON tbl (tbl_id)
WHERE auto_renew IS NULL;
Warunek indeksu częściowego należy powtórzyć w WHERE
klauzuli zapytania mniej więcej dokładnie, aby planista zapytań zdał sobie sprawę, że indeks ma zastosowanie.
Zindeksowana kolumna ( tbl_id
) jest dowolnym wyborem. Ważną częścią jest WHERE
klauzula. Ten konkretny indeks byłby najbardziej efektywny w przypadku zapytań z ORDER BY tbl_id
dodatkowym filtrem lub dołączenia tbl_id
. Możesz ustawić indeks wielokolumnowy . Kolumny logiczne są często bardziej przydatne w połączeniu z innymi.
Poza tym: ORM to kule, które regularnie nie wykorzystują pełnego potencjału RDBMS.