Индексите работят добре, за да направят сканиране само на съответните дялове в PostgreSQL. Но трябва да настроите всичко правилно, за да работи, и е лесно да пропуснете стъпка в дългия списък с неща, документирани на http://www.postgresql.org/docs/current/static/ddl-partitioning.html
Основното нещо, което трябва да разберете е, че за да избегнете последователно сканиране, трябва да предоставите достатъчно информация на PostgreSQL, за да може да докаже, че някои дялове не могат да имат данните, които търсите; тогава те се пропускат като потенциални източници за резултатите от заявката. Статията, към която препращате, посочва това като решение на проблема със сканирането на seq:„Ако добавите ограничения на обхвата към полето за дата на всеки дял, тази заявка може да бъде оптимизирана в цикъл, където първо правите заявка за „последния“ дял и работите назад, докато не намерите една единствена стойност, която е по-висока от обхвата на всички останали дялове."--но не показва подобрения план, който ще видите след тази промяна.
Някои често срещани грешки, които може да сте направили:
- Параметърът constraint_exclusion във файла postgresql.conf е изключен по подразбиране. С това по подразбиране няма да получите това, което очаквате.
-Не е създал неприпокриващи се дялове с помощта на CHECK, което не позволява на плановия да знае какво има вътре във всеки от тях. Възможно е да пропуснете тази стъпка, но все пак да поставите данните си в правилните дялове правилно, плановият просто няма да разбере това.
-Не постави индекс на всеки дял, създаде само един на главната таблица. Това ще ви даде последователно сканиране само на съответния дял, така че не е толкова лошо, колкото горното, но не е и добро.
Има малко работа, за да се направи всичко това по-лесно в предстоящите издания на PostgreSQL (настройката на constraint_partition е сравнително автоматична в 8.4 и се работи по някакъв вид автоматизация на настройката на дялове). Точно сега, ако следвате инструкциите внимателно и избегнете всички тези проблеми, трябва да работи.