Очистка кэша в PostgreSQL

#postgresql #performance #caching #sql-execution-plan #explain

Вопрос:

Мой вопрос: Как удалить кэш базы данных, чтобы один и тот же запрос всегда выполнялся» в реальном » времени.

Контекст: Я пытаюсь улучшить время выполнения запроса. План состоит в том, чтобы выполнить запрос один раз, затем выполнить explain его и добавить некоторые соответствующие индексы на основе explain выходных данных операции и, наконец, выполнить запрос снова.

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

Каков самый простой способ очистить кэш или начать с чистого листа для тестов в целом?

Ответ №1:

Перезапуск базы данных очистит кэш shared_buffers базы данных. Это не очистит кэш файловой системы, на который сильно полагается PostgreSQL.

В Linux запись 1 в файл /proc/sys/vm/drop_caches приведет к удалению кэша FS. (Сделайте это после перезапуска базы данных) Но для этого вам нужно быть привилегированным пользователем. У других ОС будут другие методы.

Сомнительно, что это приводит к более «реальным»временам. Они легко могли бы быть менее «реальными». Как часто вы перезагружаете свой рабочий сервер в реальности? Обычно лучше было бы написать сценарий драйвера, который многократно выполняет один и тот же запрос, но с разными параметрами, чтобы он попадал в разные части данных.

Комментарии:

1. Может быть, перезапуск pg_prewarm приведет к наиболее «реальным» временам?

Ответ №2:

УДАЛЕНИЕ освобождает внутренние ресурсы, связанные с сеансом базы данных. Эта команда полезна для частичного или полного сброса состояния сеанса. Существует несколько подкоманд для освобождения различных типов ресурсов; вариант ОТБРОСИТЬ ВСЕ включает в себя все остальные, а также сбрасывает дополнительное состояние. Пожалуйста, попробуйте это

 SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD SEQUENCES;
DISCARD TEMP;
 

N. B.: ОТБРОСИТЬ ВСЕ не может быть выполнено внутри блока транзакций.

Комментарии:

1. Спасибо! Что из вышеперечисленного на самом деле очищает так называемый «кэш»? Это клонированная база данных, над которой работаю только я, по одному запросу за раз — действительно ли мне нужны все эти команды или это перебор? Кроме того, что такое «блок транзакций»?

2. Блокировка транзакции означает НАЧАЛО .. совершить. Эта команда в основном используется для удаления предыдущего плана выполнения текущего сеанса.