PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL не използва частичен индекс

Частичен индекс е добра идея за да изключите половината редове на таблицата, които очевидно не ви трябват. По-просто:

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(*)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Връзката е отказана (PGError) (postgresql и rails)

  2. Как да настроите отдалечена връзка с PostgreSQL

  3. Индекс на долните букви на Flask-SQLAlchemy - функция за пропускане, не се поддържа от отражението на SQLAlchemy

  4. Динамична алтернатива на завъртане с CASE и GROUP BY

  5. Пролетна конференция FLOSS UK