Если кластеризация и разбиение не работают, я начинаю подозревать, что у вас есть серьезные проблемы с вашей системой хранения.10 секунд для сканирования кучи 35К строк на несколько порядков медленнее.Какую версию Postgres вы используете?Как выглядит ваше хранилище?Проверьте свои iostats.
Я организовал эксперимент на маленькой виртуальной машине (1 дробный процессор, 1 Гб памяти, монтирование диска NFS) с Pg 9.0.4, создавая вашу таблицу и индекс и добавляя 1000 пакетов по 36000 записей в каждой.
insert into r(loop,value,xfrom,xto,material,transport,pk) select 0,0,0,0,0,0,i from generate_series(0,35999) i;
insert into r(loop,value,xfrom,xto,material,transport,pk) select 1,0,0,0,0,0,i from generate_series(36000,71999) i;
...
Выполнение выбора в любом пакете не должно превышать 40 мсек:
explain analyze select exp(least(709,a.value)), a.xfrom, a.xto, a.material,a.transport from r a where a.loop=31;
Index Scan using "resultTable_idx_mo" on r a (cost=0.00..1596.35 rows=37680 width=21) (actual time=0.087..34.038 rows=36000 loops=1)
Index Cond: (loop = 31)
Total runtime: 36.332 ms
explain analyze select exp(least(709,a.value)), a.xfrom, a.xto,a.material,a.transport from r a where a.loop=87;
Index Scan using "resultTable_idx_mo" on r a (cost=0.00..1421.35 rows=33480 width=21) (actual time=0.105..37.357 rows=36000 loops=1)
Index Cond: (loop = 87)
Total runtime: 39.365 ms
Обратите внимание, что мои планы предусматривают использование обычного IndexScan вместо BitmapScans, а затем HeapScans.Вы внесли изменения в конфигурацию оптимизации плана, чтобы повлиять на план?
В ваших пояснениях я отмечаю, что предполагаемое количество строк намного меньше фактического количества строк (1649 против 34640).Это указывает на то, что у вас неточная статистика в таблице.Вам следует запустить ANAYLZE resultTable;
Я полагаю, что в вашей конфигурации postgres или в вашей системе хранения есть что-то не так, когда эти простые операции сканирования индекса занимают более нескольких десятков мс.Есть ли другая активность в этой базе данных, когда вы выполняете свои запросы?Возможно, ваши результаты - это конкуренция за ресурсы с другими запросами?