Упрощенный вариант:
id INT
data VARCHAR
name_id INT
ext_id INT.
Записей около 30млн.
При запуске фунции выполняется 200 раз поиск по name_id или ext_id или name_id&ext_id.
Время поиск не должно превышать 0.5 сек.
Для ускорения поиска секционировал таблицы на 2 уровня. Скачало по name_id, потом это секцию еще по ext_id.
Стало быстрее на порядок.
Но это решение не подходит т.к. есть ограничение на константы в where, а у меня их в функции не может быть в принципе, везде переменные.
Вариант с Execute (динамический SQL) тоже не подходит, т.к. из-за отсутствия компиляции запросов функция работает еще дольше чем без секционирования.
Выходит на практике секционирование почти бесполезная фича PostgreSql?
Какие еще есть методы оптимизации в данной ситуации?
Вообще для
Вообще для таких ситуаций как раз и советуют делать partition больших таблиц.
http://postgresql.ru.net/manual/ddl-partitioning.html
Читайте. Вполне возможно - это всё что вам нужно!