Частичен индекс е добра идея за да изключите половината редове на таблицата, които очевидно не ви трябват. По-просто:
CREATE INDEX name_idx ON table (text_col)
WHERE text_col IS NOT NULL;
Не забравяйте да стартирате ANALYZE table
след създаване на индекса. (Автовакуумът прави това автоматично след известно време, ако не го направите ръчно, но ако тествате веднага след създаването, тестът ви ще се провали.)
След това, за да убедите планировщика на заявки, че може да се използва определен частичен индекс, повторете WHERE
условие в заявката - дори ако изглежда напълно излишно:
SELECT col1,col2, .. colN
FROM table
WHERE text_col = 'my_value'
AND text_col IS NOT NULL; -- repeat condition
Авоа.
По документация:
Имайте предвид обаче, че предикатът трябва да съответства на условията, използвани в заявките, за които се предполага, че се възползват от индекса. За да бъдем точни, частичен индекс може да се използва в заявка само ако системата може да разпознае, че
WHERE
условието на заявката математически предполага предиката на индекса. PostgreSQL няма усъвършенствано средство за доказване на теореми, което може да разпознава математически еквивалентни изрази, които са написани в различни форми. (Не само, че е изключително трудно да се създаде такова общо доказателство на теорема, но и вероятно би било твърде бавно, за да бъде от каквато и да е реална употреба.) Системата може да разпознае прости последици за неравенството, например "x <1" означава "x <2"; в противен случай предикатът условието трябва точно да съвпада с част отWHERE
на заявката условие или индексът няма да бъде разпознат като използваем. Съпоставянето се извършва по време на планиране на заявката, а не по време на изпълнение. В резултат на това параметризираните клаузи за заявка не работят с частичен индекс.
Що се отнася до параметризираните заявки:отново добавете (излишния) предикат на частичния индекс като допълнителен постоянен WHERE
състояние и работи добре.
Важна актуализация в Postgres 9.6 до голяма степен подобрява шансовете за сканиране само с индекс (което може да направи заявките по-евтини и плановникът на заявки ще избере по-лесно такива планове за заявки). Свързано:
- PostgreSQL не използва индекс по време на count(*)