Низкая производительность по запросу PostgreSQL
ОБНОВЛЕНИЕ: Только что пришло мне в голову: Возможно ли, что pgAdmin считает не фактическое время запроса, а время, необходимое для получения результатов в сетке?
Я просто выполнил запрос с помощью командной строки (psql) и вывел результаты в текстовый файл, и он был очень быстрым (1-2 секунды).
В этом случае проблема не в конфигурации сервера postgresql / ubuntu; это скорее проблема адаптера дисплея.
Я прав или ищу в неправильном направлении?
На моем "старом" компьютере (Core 2 Duo, 4 ГБ ОЗУ, 250 ГБ SATA HD), работающем в Arch Linux 64bit, я могу выполнить простой запрос "SELECT * FROM sometable" за 0,4 мс (я использую pgAdmin 3). База данных - это PostgreSQL 9.1 (с PostGIS), и таблица содержит около 60000 строк.
Я перенес базу данных на более новый компьютер (Core i5, 8 ГБ ОЗУ, 1 ТБ Western Digital Black SATA III), и тот же запрос занимает целых 22 секунды (!!!). На новом компьютере установлен Ubuntu Server 13.04 64bit.
Для дальнейшего тестирования я скопировал базу данных на 64-битный ПК с Windows 7 (Core i5, 6 ГБ ОЗУ), и запрос выполняется примерно за 10 секунд.
Это явно проблема конфигурации, но меня немного смущает, является ли это проблемой конфигурации PostgreSQL или Ubuntu Server.
Я уже пытался поиграться с conf-файлами PostgreSQL (kernel.shmmax, shared_buffers и т. Д.), Но безрезультатно. И, конечно, я VACUUMed, VACUUM ANALYZed и воссоздал все показатели.
Есть идеи? Я заинтересован в решении Ubuntu Server, а не о Windows 7.
Заранее спасибо,
Ebl
2 ответа
Чтобы получить время выполнения на сервере без передачи данных клиенту, используйте EXPLAIN ANALYZE
,
Или используйте сочетание клавиш в инструменте запросов pgAdmin: SHIFT F7 (в зависимости от вашей ОС и версии проверьте меню запросов на наличие сочетаний клавиш).
Кстати, если вы обратитесь к руководству pgAdmin, используйте текущий выпуск - 1.18 на данный момент:
http://www.pgadmin.org/docs/1.18/query.html
Вы измеряете время, необходимое для передачи строк в pgAdmin:
http://www.pgadmin.org/docs/1.4/query.html
"Если набор данных был возвращен, отображается не только истекшее время выполнения сервера, но и время получения данных с сервера на страницу" Вывод данных "."
Если вы попробуете "выбрать количество (*) из sometable", это будет так же быстро, как на старом компьютере.