Как очистить кэш плана выполнения Oracle для бенчмаркинга? - PullRequest
33 голосов
/ 13 мая 2009

В Oracle 10gr2 у меня есть несколько SQL-запросов, с которыми я сравниваю производительность, но после первого запуска в таблице v $ sql хранится план выполнения для кэширования, поэтому для одного из запросов я выполняю 28 секунд при первом запуске до .5 секунд после.

Я пробовал

ALTER SYSTEM FLUSH BUFFER_CACHE; - после выполнения этого запрос постоянно выполняется в течение 5 секунд, что я не считаю точным.

подумал, может быть, удалив саму позицию из кэша: удалить из v $ sql, где sql_text, как 'выберите * из .... но получаю ошибку о невозможности удаления из вида.

Ответы [ 3 ]

51 голосов
/ 27 мая 2009

Петр дал вам ответ на вопрос, который вы задали.

alter system flush shared_pool;

Это оператор, который вы бы использовали для «удаления подготовленных операторов из кэша».

(Подготовленные операторы - не единственные объекты, очищенные от общего пула, оператор делает больше, чем это.)

Как я указывал в моем предыдущем комментарии (по вашему вопросу), v$sql не является таблицей. Это динамическое представление производительности, удобное табличное представление структур внутренней памяти Oracle. У вас есть привилегия SELECT только для динамических представлений производительности, вы не можете удалять строки из них.


очистить общий пул и буферный кеш?

Следующее не отвечает на ваш вопрос напрямую. Вместо этого он отвечает на принципиально другой (и, возможно, более важный) вопрос:

Должны ли мы обычно очищать общий пул и / или буферный кеш для измерения производительности запроса?

Короче говоря, ответ - нет.

Я думаю, что Том Кайт решает эту проблему довольно хорошо:

http://www.oracle.com/technology/oramag/oracle/03-jul/o43asktom.html
http://www.oracle.com/technetwork/issue-archive/o43asktom-094944.html

На самом деле, важно, чтобы инструмент настройки не делал этого. Важно запустить тест, проигнорировать результаты, а затем запустить его два или три раза и усреднить эти результаты. В реальном мире буферный кеш никогда не будет лишен результатов. Никогда. Когда вы настраиваетесь, ваша цель состоит в том, чтобы уменьшить логический ввод / вывод (LIO), потому что тогда физический ввод / вывод (PIO) позаботится о себе.

Обратите внимание: очистка общего пула и буферного кэша даже более искусственна, чем их очистка. Я подозреваю, что большинство людей скептически относятся к этому, потому что это противоречит общепринятому мнению. Я покажу вам, как это сделать, но не так, чтобы вы могли использовать его для тестирования. Скорее я буду использовать это, чтобы продемонстрировать, почему это бесполезное и абсолютно искусственное упражнение (и, следовательно, приводит к неправильным предположениям). Я только что запустил свой компьютер, и я выполнил этот запрос для большой таблицы. Я "очищаю" буферный кеш и запускаю его снова:

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

Давайте рассмотрим проблему производительности.

Вы говорите нам, что заметили, что первое выполнение запроса занимает значительно больше времени (~ 28 секунд) по сравнению с последующими (~ 5 секунд), даже при очистке (все индексы и блоки данных из) буферный кеш.

Для меня это говорит о том, что hard parse делает некоторую тяжелую работу. Это либо много работы, либо много ожиданий. Это можно исследовать и настраивать.

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

Если ваш запрос объединяет большое количество таблиц, CBO может рассмотреть огромное количество перестановок для порядка соединения.

Обсуждение трассировки Oracle выходит за рамки этого ответа, но это следующий шаг.

Я думаю, вы, вероятно, захотите отслеживать события 10053 и 10046.

Вот ссылка на обсуждение «события 10053» Тома Кайта, которое вам может пригодиться:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:63445044804318


тангенциально связанный анекдотический рассказ о производительности жесткого анализа

Несколько лет назад я видел один запрос, который прошел в терминах МИНУТ при первом выполнении, а последующие - в секундах. Мы обнаружили, что подавляющее большинство времени для первого исполнения было потрачено на жесткий анализ.

Этот проблемный запрос был написан разработчиком CrystalReports, который невинно (наивно?) Присоединился к двум огромным представлениям отчетов.

Одно из представлений представляло собой объединение 62 таблиц, другое - объединение 42 таблиц.

В запросе использовался Оптимизатор на основе затрат. Трассировка показала, что это было не время ожидания, а все процессорное время, затрачиваемое на оценку возможных путей соединения.

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

(Первоначальное немедленное краткосрочное исправление «помощь в полосе» состояло в том, чтобы запланировать выполнение запроса ранее утром, до запуска задачи генерации отчета. Это сделало генерацию отчета «более быстрой», поскольку использовался прогон генерации отчета) уже подготовленного оператора в общем пуле, избегая жесткого анализа.

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

Нашим следующим шагом, вероятно, было бы внедрение «сохраненной схемы» для запроса, чтобы получить стабильный план запроса.

Конечно, повторное использование операторов (избегая жесткого анализа, используя переменные связывания) является нормативным шаблоном в Oracle. Это повышает производительность, масштабируемость, yada, yada, yada.

Этот случайный случай может полностью отличаться от проблемы, которую вы наблюдаете.


НТН

17 голосов
/ 13 мая 2009

Прошло много времени с тех пор, как я работал с Oracle, но я считаю, что планы выполнения кэшируются в общем пуле. Попробуйте это:

alter system flush shared_pool;

Буферный кеш - это то место, где Oracle хранит недавно использованные данные для минимизации дискового ввода-вывода.

0 голосов
/ 17 июля 2009

В последнее время мы проделали большую работу с запросами на настройку производительности, и одним из виновников несогласованной производительности запросов является кэш файловой системы, на котором сидит Oracle.

Возможно, что во время очистки кэша Oracle файловая система все еще содержит данные, которые запрашивает ваш запрос, что означает, что запрос все равно будет возвращаться быстро.

К сожалению, я не знаю, как очистить кеш файловой системы - я просто использую очень полезный скрипт из наших очень полезных системных администраторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...