Как уменьшить planning time в postgresql?

Сервер сайта использует laravel и postgresql.
Для поиска используется полнотекстовый поиск (tsearch2) использующий русские словари.
Проблема в том, что поиск русского текста длится дольше чем текста из латинских символов.
Покажу на примере
Запрос с русским текстом
explain analyze
SELECT *
FROM lots 
WHERE search_index @@@ to_tsquery('рус:*') 
LIMIT 100 
OFFSET 100

Получаем
Planning time: 494.529 ms
Execution time: 3.871 ms


Запрос с английским текстом
explain analyze
SELECT *
FROM lots 
WHERE search_index @@@ to_tsquery('eng:*') 
LIMIT 100 
OFFSET 100

Получаем
Planning time: 2.229 ms
Execution time: 0.700 ms


По результатам видно, что в первом случае Planning Time почти половина секунды, когда во втором случае 2.229 мс.
Вот этот Planning Time хотелось бы уменьшить.

Важно. Заметил одну особенность. Приведенные выше запросы я выполняю через pgAdmin3. Открываю окошко для ввода sql запроса, ввожу запрос, выполняю, Planning Time = 0.5 сек. Но если, не закрывая окна, выполнить этот запрос второй раз, то Planning Time = 0.3 мс. Но на сервере получается что каждый запрос делается как первый раз, то есть с большим Planning Time.
  • Вопрос задан
  • 1301 просмотр
Решения вопроса 1
He11ion
@He11ion
PHP-monkey
Я думаю потому что план попадает в кэш.
Как вариант - использовать подготовленные запросы или не разрывать соединение (pgbouncer в помощь).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Неплохо было бы взглянуть на полный вывод EXPLAIN ANALYZE, но предполагаю, что причина в том, что первый запрос вытаскивает все данные с диска, а при запуске второго запроса postgresql уже закешировал часть данных. Ну и как сказал He11ion, план запроса тоже кешируется на сессию. Соответственно сравнение не корректное получилось. Если первым запустить поиск с английским словам, а потом по русским, я думаю результат эксперимента будет обратным.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы