Я создаю большую базу данных postgres 9.1 на Ubuntu 12.04 с одной таблицей, которая содержит около 80 миллионов строк или около того. Всякий раз, когда я запускаю оператор SELECT:
SELECT * FROM db WHERE ID=1;
Выполнение запроса, возвращающего всего несколько тысяч строк, занимает почти 2,5 минуты. После запуска нескольких диагностик дискового ввода-вывода я думаю, что проблема не в этом, но на всякий случай ниже приведены результаты диагностики. (У меня 2 ГБ ОЗУ). Я не совсем уверен, что здесь хороший результат, но кажется приблизительным, учитывая статистику, найденную для других серверов в Интернете.
time sh -c "dd if=/dev/zero of=bigfile bs=8k count=500000 && sync"
500000+0 records in
500000+0 records out
4096000000 bytes (4.1 GB) copied, 106.969 s, 38.3 MB/s
real 1m49.091s
user 0m0.248s
sys 0m9.369s
Я значительно изменил postgresql.conf, увеличив эффективный_кэш до 75% оперативной памяти, общие_буферы до 25%, сегменты контрольных точек до 15, рабочую_память до 256 МБ, автоочистку, SHMMAX в ядре и т. д. У меня было некоторое увеличение производительности, но не более чем на 5% лучше. Сеть не должна быть проблемой, так как даже на локальном хосте она занимает много времени. Я планирую добавить еще больше данных, и время запроса, похоже, быстро растет с увеличением количества строк.
Кажется, я должен иметь возможность запускать эти операторы SELECT за несколько секунд, а не за несколько минут. Любые предложения о том, где может быть это узкое место?
create table
...). См. также здесь: wiki.postgresql.org/wiki/Slow_Query_Questions - person a_horse_with_no_name   schedule 25.11.2012