oracle autotrace что это такое
Инструменты для настройки производительности SQL
Инструменты для настройки производительности SQL чрезвычайно важны. Разработчики могут использовать их для изучения хороших стратегий выполнения, а в производственной базе данных они оказывают неоценимую помощь при реактивной настройке. Эти инструменты могут давать хорошее представление об используемых запросами ресурсах. В их число входят такие утилиты, как EXPLAIN PLAN, Autotrace, SQL Trace и TKPROF.
Использование инструмента EXPLAIN PLAN
Утилита EXPLAIN PLAN помогает настраивать SQL за счет того, что позволяет просматривать план выполнения, выбираемый для SQL-оператора оптимизатором Oracle. Во время настройки SQL может возникать необходимость переписывать запросы и экспериментировать с подсказами для оптимизатора. Инструмент EXPLAIN PLAN просто замечательно подходит для таких экспериментов, потому что позволяет немедленно узнавать, как будет работать запрос при каждом изменении в коде. Поскольку эта утилита дает возможность видеть план выполнения без выполнения кода, она избавляет от необходимости запускать ненастроенный код для выяснения того, принесли ли изменения какую-то выгоду. Понимание работы EXPLAIN PLAN является важным в оценке производительности запросов. Она, по сути, приоткрывает окно в логику, которой пользуется оптимизатор Oracle при выборе планов выполнения.
Анализ вывода EXPLAIN PLAN позволяет видеть шаги, которые будет предпринимать CBO для выполнения данного SQL-оператора. Утилита EXPLAIN PLAN четко показывает, будет ли оптимизатор, например, использовать индекс. Вдобавок она сообщает о порядке, в котором будут соединяться таблицы, и помогает оценить производительность запросов. Если более конкретно, то в выводе этой утилиты отображается следующая информация:
Создание вывода EXPLAIN PLAN
Сгенерировать вывод EXPLAIN PLAN для любого оператора языка манипулирования данными SQL можно примерно так, как показано в листинге 2.
Получение вывода EXPLAIN PLAN
Просто так выбирать столбцы из таблицы PLAN_TABLE нельзя из-за иерархической природы взаимоотношений между ними. В листинге 3 приведен код, который можно использовать для того, чтобы вывод EXPLAIN PLAN распечатывался в читабельном виде и ясно показывал, как выглядит план выполнения оператора.
Другие способы отображения результатов EXPLAIN PLAN
Сначала потребуется создать сам оператор EXPLAIN PLAN для SQL-оператора:
Затем необходимо задать в SQL*Plus надлежащий размер строк и страниц:
Теперь можно отобразить вывод EXPLAIN PLAN :
Интерпретирование вывода EXPLAIN PLAN
Поначалу интерпретировать вывод EXPLAIN PLAN немного сложно, поэтому не помешает запомнить перечисленные ниже простые принципы.
В примере, показанном ранее в листинге 3 (где отражающий план вывод идет сразу же после кода), Oracle использует таблицу INVENTORIES в качестве управляющей таблицы и применяет следующий путь выполнения:
Этот вывод говорит о следующем.
Используя вывод EXPLAIN PLAN, можно быстро определять, почему некоторые из запросов занимают больше времени, чем ожидалось. Обладая такими знаниями, можно легко настраивать запрос до тех пор, пока не будет достигнут приемлемый порог по производительности. Замечательным в утилите EXPLAIN PLAN является то, что в случае ее применения никогда не требуется выполнять ни одного оператора в самой базе данных для отслеживания плана его выполнения. В следующем разделе предлагаются еще некоторые примеры использования этой утилиты.
Другие примеры планов
В этом разделе приводится еще несколько примеров, показывающих, как интерпретировать различные планы выполнения, получаемые с помощью утилиты EXPLAIN PLAN. В первом примере предлагается посмотреть, что будет происходить в случае использования функции в отношении индексированного столбца. Oracle будет полностью игнорировать индекс! Как не трудно заметить, оптимизатор может делать ошибки. Хорошие программисты должны помочь оптимизатору понимать подобные вещи правильно за счет применения методов наподобие надлежащего индексирования таблиц, подсказок для оптимизатора и т.д.
В третьем примере для извлечения результатов запроса осуществляется соединение двух таблиц ( customers и orders ):
В листинге 4 показано, как будет выглядеть вывод EXPLAIN PLAN в таком случае.
На шаге 4 строки, полученные из таблицы orders на шаге 3, будут соединяться со строками, полученными из таблицы customers на шаге 2, на основании соблюдения условия WHERE o.customer_id=c.customer_id.
Как видно по предыдущим примерам, утилита EXPLAIN PLAN позволяет получать четкое представление об используемых оптимизатором методах доступа, и делать это без выполнения самого запроса. Зачастую она помогает оперативно узнать, почему SQL-код работает медленно. Вывод EXPLAIN PLAN может позволить определить, насколько избирательными являются индексы, и экспериментировать с быстрым внесением соответствующих изменений в код.
Использование утилиты Autotrace
Утилита Autotrace (Автотрассировка) позволяет получать вывод EXPLAIN PLAN автоматически при выполнении SQL-оператора в SQL*Plus. В случае входа в систему от имени пользователя SYS или SYSTEM привилегии, необходимые для использования этой утилиты, предоставляются автоматически.
Перед использованием утилиты Autotrace необходимо создать в своей схеме таблицу плана ( PLAN_TABLE ). Она будет применяться для всех последующих выполнений утилиты Autotrace. В случае отсутствия такой таблицы в схеме, при попытке запустить утилиту Autotrace будет появляться сообщение об ошибке:
Если роли PLUSTRACE еще не существует в базе данных, как в показанном выше примере, тогда пользователь SYS должен запустить сценарий plustrace.sql (см. листинг 6) для ее создания.
Затем роль PLUSTRACE должна предоставляться тому пользователю, который желает использовать утилиту Autotrace:
После этого данный пользователь может активизировать утилиту Autotrace и просматривать вывод EXPLAIN PLAN для любого запроса, который использует в сеансе. Утилита Autotrace может активизироваться с различными опциями.
Для всех SQL-операторов, выполняемых после активизации утилиты Autotrace, будут генерироваться планы выполнения (до тех пор, пока утилита Autotrace не будет отключена с помощью команды SET AUTOTRACE OFF ), как показано в листинге 7.
Как видно в этом листинге, после отображения плана выполнения для SQL-оператора утилита Autotrace отображает детали о количестве рекурсивных вызовов SQL, произошедших во время выполнения исходного оператора, количестве операций физического и логического чтения, количестве операций сортировки в памяти и на диске и количестве обработанных строк.
Далее предлагаются примеры оптимизации SQL-запросов с применением утилиты Autotrace. В этих примерах один и тот же запрос выполняется в отношении таблицы courses дважды: один раз без индекса, а другой — с индексом. После индексирования таблицы этот запрос выполняется перед ее анализом. Результаты говорят сами за себя.
Как здесь видно, в запросе была использована операция полного сканирования таблицы по причине отсутствия у этой таблицы каких-либо индексов. Из-за этого всего было выполнено 338 операций физического чтения. Обратите внимание, что общее количество строк в таблице courses составляет 98 384. Из этого количества предметов по теме “медицина” оказалось 98 304. Это значит, что значения в таблице совершенно не распределяются равномерно среди предметов. Теперь давайте посмотрим, что произойдет в случае использования индекса.
В следующем примере выполняется аналогичный запрос, но с индексом. Однако никакие статистические данные ни по таблице, ни по индексу не собираются. Результаты создания индекса по таблице courses и выполнения в его отношении такого же запроса, получаются довольно интересными. Увидеть это можно в листинге 9.
В третьем примере запрос с индексом выполняется после сбора статистических данных по таблице. Теперь у Oracle есть все необходимые статистические данные и потому на этот раз применяется оптимизатор CBO. Оптимизатор CBO принимает решение использовать индекс только в том случае, если стоимость применения индекса будет ниже стоимости полного сканирования таблицы. В данном случае принято решение не использовать индекс, потому что запросу придется считывать 98 304 из общих 98 384 строк. Oracle правильно решает выполнять вместо этого полное сканирование таблицы. Результаты показаны в листинге 10.
В этом листинге первый элемент — recursive calls (рекурсивные вызовы) — отражает количество дополнительных операторов, которые Oracle приходится выполнять при обработке SQL-оператора пользователя. Например, такие рекурсивные вызовы (или рекурсивные SQL-операторы) приходится выполнять для выделения пространства или для выполнения запросов в таблицы словаря данных на диске. В данном примере Oracle пришлось сделать 290 подобных внутренних вызов.
Использование утилит SQL Trace и TKPROF
SQL Trace (Трассировка SQL) представляет собой утилиту Oracle, которая помогает отслеживать выполнение SQL-операторов, а TKPROF — еще одну утилиту Oracle, которая помогает преобразовывать генерируемые SQL Trace файлы трассировки в удобный для чтения формат. Если утилита EXPLAIN PLAN предоставляет ожидаемый план выполнения, то утилита SQL Trace выдает уже фактические результаты выполнения SQL-запроса. Иногда бывает невозможно идентифицировать точный код, скажем, генерируемых динамическим образом SQL-операторов. Файлы SQL Trace могут легко перехватывать такой код. Помимо всего прочего, SQL Trace позволяет отслеживать следующие переменные.
Совет. Если в приложении много SQL-кода генерируется динамически, утилита SQL Trace является идеальным средством для настройки SQL-операторов.
Хотя утилита EXPLAIN PLAN и важна для определения пути доступа, который будет использовать оптимизатор, SQL Trace предлагает массу чрезвычайно полезной информации о потреблении ресурсов и эффективности операторов. Она позволяет получать четкое представление о том, не подвергается ли оператор излишнему синтаксическому анализу. Показатели по количеству выполнений и выборки иллюстрируют степень его эффективности. Хорошо видно, сколько времени ЦП расходуется на обработку запросов и сколько операций ввода-вывода происходит на этапе их выполнения. Это помогает выявлять в приложении те SQL-операторы, которые отнимают больше всего ресурсов, и настраивать их. Вывод EXPLAIN PLAN, который является необязательной частью вывода SQL Trace, отражает количество строк, извлекаемых на отдельных шагах плана выполнения, и тем самым помогает выявлять шаги, на которых выполняется больше всего работы. Путем сравнения объема потребляемых ресурсов с количеством выбираемых строк можно легко определять, насколько продуктивным является конкретный оператор.
В следующих разделах показано, как использовать утилиту SQL Trace для сбора трассировочных данных и интерпретировать их с помощью утилиты TKPROF на примере простого SQL-оператора. Сначала рассказывается о настройке нескольких необходимых для этого параметров инициализации.
Установка параметров инициализации, касающихся трассировки
Сбор трассировочных статистических данных сказывается на производительности и поэтому Oracle не производит трассировку автоматически для всех сеансов. Трассировка представляет собой совершенно необязательный процесс, который активизируется на ограниченное количество времени для сбора метрических показателей по производительности критичных SQL-операторов. Чтобы процесс трассировки SQL происходил в Oracle правильно, сначала необходимо соответствующим образом установить четыре параметра инициализации и перезапустить базу данных после получения уверенности в том, что они сконфигурированы так, как надо. Три из этих параметров представляют собой динамические параметры, которые можно изменять на уровне сеанса.
Параметр STATISTICS_LEVEL
Параметр TIMED_STATISTICS
Параметр USER_DUMP_DEST
Параметр MAX_DUMP_FILE_SIZE
Некоторые процессы трассировки очень быстро могут приводить к созданию больших файлов трассировки, поэтому нужно обязательно проверять, что для параметра инициализации MAX_DUMP_FILE_SIZE выбрано достаточно высокое значение. Размер, используемый в этом параметре по умолчанию, может оказаться слишком маленьким для некоторых трассировок. В случае заполнения файла дампа процесс трассировки не будет завершаться, но информация в этом файле будет усекаться.
Активизация механизма трассировки SQL
А вот пример установки SQL_TRACE в TRUE с помощью пакета DBMS_SESSION :
Часто пользователи просят администратора баз данных помочь со сбором трассировочных данных по их SQL-операторам.
Интерпретирование трассировочных файлов с помощью TKPROF
Отличать трассировочный файл, созданный в результате выполнения SQL Trace, от остальных файлов в каталоге дампа можно по его размеру: такие трассировочные файлы обычно имеют гораздо больший размер по сравнению с остальными файлами в каталоге. Эти трассировочные файлы являются подробными и сложными. К счастью, есть легко запускаемая утилита TKPROF, которая умеет преобразовывать вывод таких файлов в удобный для чтения формат. Она принимает эти файлы в качестве входных данных вместе с несколькими другими параметрами.
В табл. 1 показаны основные параметры, которые можно передавать утилите TKPROF для получения желаемого формата. Введя в командной строке команду tkprof, можно получить список всех допустимых параметров утилиты TKPROF.
Совет. Введя tkprof в приглашении операционной системы, можно быстро получить справку по использованию утилиты TKPROF.
Изучение файла с отформатированным выводом
В листинге 11 показана верхняя часть файла test.txt, в которой объясняются ключевые термины, используемые утилитой.
В каждом отчете TKPROF для каждого SQL-оператора, выполнявшегося во время отслеживавшегося сеанса пользователя, отображается следующая информация:
Следовательно, по листингу 12 можно сделать такие выводы.
Ниже показана следующая часть вывода TKPROF, отражающая план выполнения, который был запрошен явным образом при вызове утилиты TKPROF. Обратите внимание на то, что вместо показателей по стоимости, которые возвращаются при использовании утилиты EXPLAIN PLAN, в данном случае возвращается информация о количестве строк вывода на каждом этапе выполнения.
И, наконец, в последней части вывода TKPROF отображается сводный отчет, сообщающий, сколько всего SQL-операторов было отслежено. Ниже показано, как выглядит эта часть:
Вывод TKPROF позволяет легко выявлять неэффективные SQL-операторы. TKPROF может упорядочивать SQL-операторы по затраченному на их выполнение времени и тем самым помогать определить, какие из SQL-операторов нуждаются в оптимизации.
Утилита SQL Trace является очень мощным инструментом для настройки SQL, поскольку выходит далеко за рамки той информации, которую предоставляет утилита EXPLAIN PLAN. Она предоставляет точные сведения о количестве различных вызовов, которые выполнялись к Oracle во время выполнения оператора, а также о том, как потреблялись ресурсы на различных этапах его выполнения.
На заметку! Сеансы отдельных пользователей еще очень удобно отслеживать с помощью интерфейса OEM Database Control.
Настройка средства AUTOTRACE в SQL*Pius
Начальная установка AUTOTRACE
Средство AUTOTRACE полагается на доступность таблицы по имени PLAN_ТАВLЕ. Начиная с версии Oracle 10g, схема SYS содержит глобальную временную таблицу под названием PLAN_TABLE$. Все необходимые привилегии для работы с этой таблицей выданы пользователю PUBLIC и определен открытый синоним (с именем PLAN_TABLE, который указывает на SYS.PLAN_TABLE$). Это значит, что получать доступ к этой таблице может любой пользователь.
Вы должны также создать и назначить роль PLUSTRACE:
При желании можете заменить PUBLIC в команде GRANT другим именем пользователя.
Управление отчетом AUTOTRACE
Отчет о пути выполнения, который используется оптимизатором SQL, и статистику по выполнению операторов можно получать автоматически. Отчет генерируется после успешного выполнения операторов SQL DML (т.е, SELECT, DELETE, UPDATE, MERGE и INSERT). Он полезен ля отслеживания и настройки производительности перечисленных операторов. Отчетом можно управлять посредством настройки системной переменной AUTOTRACE.
• SET AUTOTRACE OFF. Отчет AUTOTRACE не генерируется. Это принято по умолчанию.
• SET AUTOTRACE ON EXPLAIN. Отчет AUTOTRACE будет отображать только путь выполнения, применяемый оптимизатором.
• SET AUTOTRACE ON STATISTICCS. Отчет AUTOTRACE будет отображать толь-ко статистику по выполнению SQL-операторов.
• SET AUTOTRACE ON. Отчет AUTOTRACE будет содержать путь выполнения, используемый оптимизатором, и статистику по выполнению SQL-операторов.
• SET AUTOTRACE TRACEONLY. Похоже на SET AUTOTRACE ON, но подавляет вывод запроса пользователя, если он есть.
• SET AUTOTRACE TRACEONLY EXPLAIN: Похоже на SET AUTOTRACE ON, но подавляет вывод запроса пользователя (если он есть) и также статистику по выполнению.
11
Using Autotrace in SQL*Plus
This chapter contains the following sections:
Controlling the Autotrace Report
You can control the report by setting the AUTOTRACE system variable.
Autotrace Setting | Result | ||||||
---|---|---|---|---|---|---|---|
Column Name | Description | ||||
---|---|---|---|---|---|
Database Statistic Name | Description | ||
---|---|---|---|
Column Name | Description |
---|---|
Statistic | Description |
---|---|