#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. Блокировка транзакции означает НАЧАЛО .. совершить. Эта команда в основном используется для удаления предыдущего плана выполнения текущего сеанса.