Частичен индекс е добра идея за да изключите половината редове на таблицата, които очевидно не ви трябват. По-просто:
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(*)