Назад | Перейти на главную страницу

PostgreSQL + JDBC: слишком медленный синтаксический анализ первого запроса

Я использую Aqua Data Studio в OS X для выполнения запросов на сервере PostgreSQL, но первый запрос дня выполняется слишком медленно.

Это не зависит от SQL, простой SELECT current_timestamp проанализирует и выполнит примерно за 5 секунд, любой последующий запрос займет почти 30 мс. Если я закрою приложение, снова открою и попробую еще раз, этого не произойдет, только при перезапуске компьютера.

Если я использую PgAdmin, он отлично работает с первого запроса. В Aqua будет очень ясно, что причиной этого является не время выполнения, а время синтаксического анализа.

Теперь у нас есть сервер непрерывной интеграции, который запускает множество тестов при каждой фиксации, но дает сбой при каждой первой сборке дня, и пока мы не выполним вторую фиксацию (или не выполним принудительную сборку), она не будет выполнена. Это машина Linux, а сборка представляет собой Java-приложение, использующее JDBC, что заставляет меня отказаться от проблемы с ОС и больше рассматривать проблему PostgreSQL + JDBC.

Основной сервер, на котором я работаю:

PostgreSQL 8.4.4 on x86_64-unknown-linux-gnu, compiled by GCC gcc (Debian 4.3.2-1.1) 4.3.2, 64-bit

Но бывает на нескольких серверах и версиях:

PostgreSQL 8.4.1 on x86_64-unknown-linux-gnu, compiled by GCC gcc (Debian 4.3.2-1.1) 4.3.2, 64-bit

PostgreSQL 9.1alpha3 on x86_64-unknown-linux-gnu, compiled by GCC gcc (Debian 4.3.2-1.1) 4.3.2, 64-bit

Если я выполню первый запрос на любом сервере, все последующие на любом сервере будут в порядке.

Кто-нибудь испытал это? Как я могу попытаться определить причину этого?

Это очень похоже на то, что ваша база данных будет выгружена за ночь или после запуска системы, когда другим процессам потребуется много памяти.

Я думаю, что имеет смысл добавить больше памяти на сервер db. Другой вариант - указать, что выше select current_timestamp из сценария до того, как сервер CI запустит тесты (например, на некоторой предварительно созданной фазе), чтобы получить доступ к базе данных. Сценарий вызовет утилиту командной строки psql для выполнения выбора.