ИНСТРУМЕНТЫ ДИАГНОСТИКИ ПРОИЗВОДИТЕЛЬНОСТИ
Основным инструментом для мониторинга производительности ORACLE
является коллекция динамических таблиц производительности. Эти
таблицы имеют имена, начинающиеся с "V$", и упоминаются в тех
частях настоящего руководства, которые описывают отслеживание
производительности. Все динамические таблицы производительности
перечислены в приложении B "Справочник по словарю данных" в
документе ORACLE7 Server Administrator's Guide.
Эта глава описывает дополнительные инструменты диагностики
производительности. Эти инструменты, вместе с динамическими
таблицами производительности, могут помочь вам в мониторинге и
настройке приложений ORACLE.
В этой главе описываются следующие инструменты:
* средство трассировки SQL
* команда EXPLAIN PLAN
Вывод команды EXPLAIN PLAN отражает поведение оптимизатора
ORACLE. Поскольку оптимизатор развивается от версии к версии
ORACLE, вывод команды EXPLAIN PLAN также имеет тенденцию к
изменениям. Аналогично, средство трассировки SQL и программа
TKPROF также подвержены изменениям в будущих версиях ORACLE.
Эти изменения будут описаны в последующих выпусках документации
ORACLE.
Средство трассировки SQL
Средство трассировки SQL выдает информацию о производительности
по индивидуальным предложениям SQL. Средство трассировки SQL
генерирует для каждого предложения следующие статистики:
* счетчики разборов, исполнений и извлечений
* время процессора и затраченное время
* число физических и логических чтений
* число обработанных строк
* число промахов в библиотечном кэше
Вы можете включить средство трассировки SQL для сессии или для
всей инстанции. Когда средство трассировки SQL включено,
статистика производительности для всех предложений SQL,
исполняемых в сессии пользователя или в инстанции, записывается
в файл трассировки. Чтобы транслировать файл трассировки в
читабельную форму, вы можете использовать программу TKPROF.
Если угодно, программа TKPROF выдает также план исполнения для
предложения SQL. Чтобы запросить эту информацию, используйте
аргумент EXPLAIN в командной строке TKPROF. Синтаксис команды
TKPROF приведен на странице B-4. Для дополнительной информации о
команде EXPLAIN PLAN обратитесь к секции "Команда EXPLAIN PLAN"
на странице B-10.
Так как запуск средства трассировки SQL увеличивает накладные
расходы системы, вы должны включать это средство только во время
настройки ваших предложений SQL, и выключать его, когда
заканчиваете настройку.
Использование средства трассировки SQL
--------------------------------------
Чтобы использовать средство трассировки SQL, выполните следующие
шаги:
1. Установите параметры инициализации, чтобы подготовить ORACLE
к использованию средства трассировки SQL.
2. Прогоните ваше приложение со средством трассировки SQL,
включенным для сессии или для всей инстанции. Этот шаг
создаст файл трассировки.
3. Выполните TKPROF, чтобы получить статистику в читабельной
форме. Этот шаг принимает ввод из файла трассировки и выдает
статистики в выходной файл.
4. Проанализируйте результирующий файл.
Каждый из этих шагов подробно обсуждается ниже.
Установка параметров инициализации для средства трассировки SQL
Прежде, чем выполнять ваше приложение с включенным средством
трассировки SQL, запустите вашу инстанцию ORACLE со следующими
значениями параметров инициализации:
TIMED_STATISTICS Значение TRUE этого параметра включает
измерение процессорного и затраченного
времени средством трассировки SQL.
Включение TIMED_STATISTICS приводит к
дополнительным вызовам для измерения
времени во время низкоуровневых
операций. Этот параметр включает также
сбор некоторых статистик в динамических
таблицах производительности.
MAX_DUMP_FILE_SIZE Этот параметр задает максимальный размер
файлов трассировки в блоках операционной
системы. Если вы обнаружите, что ваш
файл трассировки усечен, увеличьте
значение этого параметра и повторите
генерацию файла трассировки.
USER_DUMP_DEST Этот параметр указывает назначение для
файла трассировки. Назначение должно
быть полностью специфицированным,
согласно соглашениям вашей операционной
системы. Если вы на задаете значение
этого параметра, то файл трассировки
будет записываться в назначение для
системных дампов вашей операционной
системы.
Включение трассировки для сессии
Чтобы включить средство трассировки SQL для индивидуальной
сессии, выдайте следующее предложение SQL:
ALTER SESSION
SET SQL_TRACE = TRUE
Чтобы выключить средство трассировки SQL, выдайте следующее
предложение SQL:
ALTER SESSION
SET SQL_TRACE = FALSE
Средство трассировки SQL также отключается автоматически, когда
ваше приложение отсоединяется от ORACLE.
Вам может потребоваться модифицировать свое приложение, чтобы
включить в него команду ALTER SESSION. Например, чтобы выдать
команду ALTER SESSION в SQL*Forms версии 3.0, вызовите SQL*Forms
с опцией -s, или вызовите SQL*Forms (Design) с опцией
статистики. Для дополнительной информации о продукте SQL*Forms
обратитесь к документу SQL*Forms Designer's Reference.
Включение трассировки для инстанции
Чтобы включить средство трассировки SQL для всех пользователей
ORACLE, установите в TRUE параметр инициализации SQL_TRACE. Это
значение заставит собирать статистики для всех пользовательских
сессий. Для индивидуальной сессии можно выключить средство
трассировки, выдав следующее предложение SQL:
ALTER SESSION
SET SQL_TRACE = FALSE
Когда средство трассировки SQL включено для инстанции, ORACLE
создает отдельный файл трассировки для каждой сессии. Прежде
чем выполнять TKPROF, вы можете пожелать объединить все файлы
трассировки, чтобы создать единый файл трассировки, содержащий
информацию для всех сессий.
Замечание: Первые несколько файлов трассировки, создаваемых
после запуска инстанции, содержат данные, отражающие
деятельность процесса запуска. В частности, эти файлы содержат
статистики, отражающие необычную активность ввода-вывода; это
объясняется заполнением различных кэшей базы данных. Эти
несколько файлов трассировки обычно могут игнорироваться.
Имена и версии файлов трассировки SQL
-------------------------------------
Когда вы включаете средство трассировки для инстанции, ORACLE
пишет отдельный файл трассировки для каждой сессии. Эта запись
ведется одновременно в несколько файлов, находящихся в одном и
том же назначении (USER_DUMP_DEST), так что вы должны знать, как
различать эти файлы по их именам. Если ваша операционная
система поддерживает множественные версии файлов, обеспечьте,
чтобы ваш лимит версий был достаточно высоким для ожидаемого
количества генерируемых файлов трассировки SQL.
Запуск TKPROF
-------------
TKPROF транслирует файл трассировки, сгенерированный средством
трассировки SQL, в читабельный формат. TKPROF может также
использоваться для генерации вывода EXPLAIN PLAN. Вызов TKPROF
имеет следующий синтаксис:
команда TKPROF ::=
--- TKPROF filename1 filename2 --T---------------------------------T-
L-- SORT = -T- опция -----------T--
¦ ¦
¦ --- , --¬ ¦
L- ( --опция-+- ) --
-----T---------------------T--T-----------------------------T--------
L-- PRINT = integer --- L-- EXPLAIN = user/password ---
Если вы вызываете TKPROF без аргументов, на экран выдается текст
помощи.
Ниже описаны аргументы команды TKPROF. О том, как задавать эти
аргументы, см. секцию "Пример TKPROF" на странице B-6.
filename1 специфицирует входной файл, - файл трассировки,
содержащий статистики, сгенерированные средством
трассировки SQL. Этот файл может быть как файлом
трассировки, созданным для индивидуальной
сессии, так и файлом, полученным объединением
индивидуальных файлов трассировки для нескольких
сессий.
filename2 специфицирует файл, в который TKPROF записывает
свой форматированный вывод.
SORT сортирует трассируемые предложения SQL в порядке
убывания значения заданной опции сортировки,
прежде чем помещать их в выходной файл. Если
задано несколько опций, вывод сортируется по
сумме значений всех заданных опций. Например,
если вы специфицируете EXECPU и FCHCPU, то
предложения SQL сортируются по сумме времени
процессора и затраченного времени. Если этот
параметр опущен, TKPROF выдает предложения в
порядке возрастания времени их первой выдачи.
Опции сортировки могут быть следующими:
PRSCNT количество раз разбора
PRSCPU время процессора на разбор
PRSELA затраченное время на разбор
PRSDSK число физических чтений во время разбора
PRSQRY число чтений блоков в режиме consistent во время
разбора
PRSCU число чтений блоков в режиме current во время
разбора
PRSMIS число промахов в библиотечном кэше во время
разбора
EXECNT число исполнений
EXECPU время процессора на исполнения
EXEELA затраченное время на исполнения
EXEDSK число физических чтений во время исполнения
EXEQRY число чтений блоков в режиме consistent во время
исполнения
EXECU число чтений блоков в режиме current во время
исполнения
EXEROW число строк, обработанных во время исполнения
EXEMIS число промахов в библиотечном кэше во время
исполнения
FCHCNT число извлечений
FCHCPU время процессора на извлечения
FCHELA затраченное время на извлечения
FCHDSK число физических чтений во время извлечения
FCHQRY число чтений блоков в режиме consistent во время
извлечения
FCHCU число чтений блоков в режиме current во время
извлечения
FCHROW число извлеченных строк
PRINT выдает лишь первые integer отсортированных
предложений SQL в выходной файл. Если этот
параметр опущен, TKPROF выдает в выходной файл
все трассируемые предложения SQL.
EXPLAIN Заставляет TKPROF выдавать команду EXPLAIN PLAN
для каждого предложения SQL в файле трассировки.
Команда EXPLAIN PLAN генерирует план исполнения
для предложения SQL. TKPROF соединяется с ORACLE
с именем и паролем, заданными этим параметром,
создает выходную таблицу с именем
PROF$PLAN_TABLE, а в конце выполнения удаляет
эту таблицу. Для информации о команде EXPLAIN
PLAN обратитесь к секции "Команда EXPLAIN PLAN"
на странице B-10.
Пользователь user должен иметь системные
привилегии CREATE SESSION и CREATE TABLE, а
также квоту в своем умалчиваемом табличном
пространстве, или системную привилегию UNLIMITED
TABLESPACE.
Пример TKPROF
Следующий пример показывает, как можно запускать TKPROF:
TKPROF SQLDBA_JRL_005.TRC R1.PRF SORT=(EXECPU,FCHCPU) \
EXPLAIN=SCOTT/TIGER
В этом примере файл трассировки, который был сгенерирован
средством трассировки SQL, имеет имя SQLDBA_JRL_005.TRC. TKPROF
генерирует статистики для каждого трассируемого предложения SQL.
Эти статистики сортируются по сумме времени процессора на
исполнение и времени процессора на извлечение строк. Результаты
сортировки, а также план исполнения для каждого предложения SQL,
помещаются в результирующий файл R1.PRF.
Вывод TKPROF
------------
Следующий пример показывает вывод TKPROF для приведенного ниже
предложения SQL, как оно появляется в выходном файле:
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno
call count cpu elapsed disk query current rows
---------- ----- ------- --------- -------- -------- ------- ------
Parse 1 0.43 0.58 6 35 4 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 1 0.03 0.08 2 2 4 14
Misses in library cache during parse: 1
Parsing user id: 6
Rows Execution Plan
------- -------------------------------------------
14 MERGE JOIN
4 SORT JOIN
4 TABLE ACCESS (FULL) OF 'DEPT'
14 SORT JOIN
14 TABLE ACCESS (FULL) OF 'EMP'
Для данного предложения, вывод TKPROF состоит из следующих
частей:
* текст предложения SQL
* статистики трассировки SQL в табличной форме
* число промахов в библиотечном кэше при разборе и
исполнении этого предложения
* пользователь, первым выполнивший разбор предложения
* план исполнения, сгенерированный командой EXPLAIN PLAN
Статистики средства трассировки SQL
TKPROF выдает статистики, которые были сгенерированы для
предложения SQL, в виде строк и столбцов. Каждая строка
соответствует одному из трех шагов обработки предложения SQL:
Parse Этот шаг транслирует предложение SQL в план
(разбор) исполнения. На этом шаге выполняются проверки
полномочий и проверки существования таблиц,
столбцов и других адресуемых объектов.
Execute На этом шаге ORACLE исполняет предложение. Для
(исполнение) предложений INSERT, UPDATE и DELETE этот шаг
выполняет модификацию данных. Для предложений
SELECT на этом шаге идентифицируются выбираемые
строки.
Fetch Этот шаг извлекает строки, удовлетворяющие
(извлечение) запросу. ORACLE выполняет этот шаг только для
предложений SELECT.
Название шага, для которого выдается строка статистик, приведено
в столбце call.
Остальные столбцы вывода трассировки SQL содержат
комбинированные статистики для всех разборов, всех исполнений и
всех извлечений данного предложения:
count число раз, когда для предложения выполнялся
разбор, исполнение или извлечение.
cpu общее время процессора, в секундах, на все
вызовы разбора, исполнения и извлечения для
предложения.
elapsed общее затраченное время, секундах, на все вызовы
разбора, исполнения и извлечения для
предложения.
disk общее число блоков данных, физически прочитанных
из файлов данных для всех вызовов разбора,
исполнения и извлечения.
query общее число буферов, извлеченных в режиме
consistent для всех вызовов разбора, исполнения
и извлечения. Этот режим обычно используется
для запросов.
current общее число буферов, извлеченных в режиме curent
для всех вызовов разбора, исполнения и
извлечения. Этот режим обычно используется для
предложений INSERT, UPDATE и DELETE.
Сумма query и current дает общее число буферов,
к которым были обращения.
rows общее число строк, обработанных предложением
SQL. В эту сумму не входят строки, обработанные
подзапросами данного предложения SQL.
Для предложений SELECT этот столбец показывает
число строк, извлеченных на шаге fetch.
Для предложений INSERT, UPDATE и DELETE этот
столбец показывает число строк, обработанных на
шаге execute.
ТОЧНОСТЬ СТАТИСТИК. Поскольку статистики времени имеют
разрешение в одну сотую секунды, любая операция на курсоре,
которая занимает менее одной сотой доли секунды, не может быть
измерена точно. Имейте это в виду, когда интерпретируете эти
статистики. В частности, будьте осторожны при интерпретации
результатов для простых запросов, которые выполняются очень
быстро.
РЕКУРСИВНЫЕ ВЫЗОВЫ. Для того, чтобы выполнить предоложение SQL,
ORACLE может потребоваться выполнить дополнительные предложения
SQL. Такие предложения называются РЕКУРСИВНЫМИ ВЫЗОВАМИ.
Например, если вы пытаетесь вставить строку в таблицу, которой
не хватает пространства, то ORACLE делает рекурсивный вызов,
чтобы динамически распределить дополнительную память.
Рекурсивные вызовы также генерируются в тех случаях, когда
информация словаря данных отсутствует в кэше словаря данных и
должна быть извлечена с диска.
Если рекурсивные вызовы встречаются при включенном средстве
трассировки SQL, то TKPROF выдает статистики по этим
предложениям, в дополнение к предложениям, которыми они были
инициированы. Эти рекурсивные статистики четко отмечаются как
рекурсивные предложения SQL. Однако статистики cpu, elapsed,
disk, query и current для рекурсивных предложений SQL включаются
в статистики для того предложения SQL, которое вызвало
рекурсивное выполнение. Суммируя статистики для нескольких
предложений SQL, будьте внимательны, чтобы не засчитать
статистики рекурсивных вызовов дважды.
Промахи в библиотечном кэше
TKPROF также выдает количество промахов в библиотечном кэше на
шагах разбора и исполнения для каждого предложения SQL. Эти
статистики выдаются в отдельных строках после табличных
статистик. Если предложение не привело к промахам в кэше, то
TKPROF не выдает соответствующих статистик. В нашем примере,
предложение привело к одному промаху в библиотечном кэше на шаге
разбора, а на шаге исполнения не было ни одного промаха.
Пользователь, выдавший предложение SQL
TKPROF также выдает идентификатор пользователя, выдавшего каждое
предложение SQL. Если входной файл TKPROF содержит статистики от
многих пользователей, и данное предложение было выдано более чем
одним пользователем, то TKPROF выдает идентификатор последнего
пользователя, выдавшего это предложение. Идентификаторы всех
пользователей базы данных появляются в словаре данных в столбце
ALL_USERS.USER_ID.
План исполнения
Если вы специфицируете параметр EXPLAIN в командной строке
TKPROF, то TKPROF выдает команду EXPLAIN PLAN, чтобы
сгенерировать план исполнения для каждого предложения SQL в
файле трассировки. Для дополнительной информации о том, как
интерпретировать планы исполнения, обратитесь к секции "Примеры
вывода EXPLAIN PLAN" на странице B-16. TKPROF также выдает
число строк, обработанных на каждом шаге плана исполнения.
Команда EXPLAIN PLAN
Команда EXPLAIN PLAN выдает план исполнения, выбранный
оптимизатором ORACLE для предложений SELECT, UPDATE, INSERT и
DELETE. План исполнения предложения представляет собой
последовательность операций, которые ORACLE выполняет для
исполнения предложения. Изучив план исполнения, вы можете точно
увидеть, как ORACLE исполняет ваше предложение. Эта информация
может помочь вам определить, например, использует ли предложение
SQL, которое вы написали, имеющиеся индексы.
Создание выходной таблицы
-------------------------
Прежде чем выдавать предложение EXPLAIN PLAN, вы должны создать
таблицу, в которую будет помещены результаты. При выдаче
предложения EXPLAIN PLAN вы должны иметь привилегии для вставки
данных в эту таблицу. Должно быть соблюдено одно из следующих
условий:
* Выходная таблица должна быть в вашей собственной схеме.
* Вы должны иметь привилегию INSERT по выходной таблице.
* Вы должны иметь системную привилегию INSERT ANY TABLE.
После выполнения предложения EXPLAIN PLAN, для того, чтобы вы
могли проанализировать результаты, вы должны иметь привилегии
выбирать данные из выходной таблицы. Должно быть соблюдено одно
из следующих условий:
* Выходная таблица должна быть в вашей собственной схеме.
* Вы должны иметь привилегию SELECT по выходной таблице.
* Вы должны иметь системную привилегию SELECT ANY TABLE.
Вы можете создать выходную таблицу одним из следующих способов:
* Вы можете запустить скрипт UTLXPLAN.SQL, чтобы создать
выходную таблицу с именем PLAN_TABLE в вашей схеме.
Точное имя и местоположение этого скрипта может зависеть
от вашей операционной системы. PLAN_TABLE - это таблица,
в которую предложение EXPLAIN PLAN выдает свои результаты
по умолчанию.
* Вы можете выдать предложение CREATE TABLE, чтобы создать
выходную таблицу с любым именем по вашему выбору. В этом
случае вы можете выдать предложение EXPLAIN PLAN и
направить его вывод в эту таблицу.
Любая таблица, используемая для сохранения вывода команды
EXPLAIN PLAN, должна иметь такие же имена и типы данных
столбцов, что и показанная здесь таблица PLAN_TABLE:
CREATE TABLE plan_table
(statement_id VARCHAR2(30),
timestamp DATE,
remarks VARCHAR2(80),
operation VARCHAR2(30),
options VARCHAR2(30),
object_node VARCHAR2(30),
object_owner VARCHAR2(30),
object_name VARCHAR2(30),
object_instance NUMERIC,
object_type VARCHAR2(30),
search_columns NUMERIC,
id NUMERIC,
parent_id NUMERIC,
position NUMERIC,
other LONG)
Столбцы выходной таблицы
------------------------
Таблица PLAN_TABLE, используемая командой EXPLAIN PLAN, содержит
следующие столбцы:
STATEMENT_ID Значение необязательного параметра STATEMENT_ID,
специфицированного в предложении EXPLAIN PLAN.
TIMESTAMP Дата и время, когда было выдано предложение
EXPLAIN PLAN.
REMARKS Любой комментарий (до 80 байт), который вы
хотите ассоциировать с каждым шагом плана
исполнения. Чтобы добавить или изменить
комментарий в любой строке таблицы PLAN_TABLE,
используйте предложение UPDATE.
OPERATION Имя внутренней операции, выполняемой на этом
шаге. Возможные значения этого столбца
приведены в таблице B-1 на странице B-13.
В первой строке, генерируемой для предложения,
этот столбец содержит одно из следующих
значений, в зависимости от типа предложения:
'DELETE STATEMENT'
'INSERT STATEMENT'
'SELECT STATEMENT'
'UPDATE STATEMENT'
OPTIONS Разновидность (режим) операции, описываемой
столбцом OPERATION. Возможные значения этого
столбца приведены в таблице B-1 на странице
B-13.
OBJECT_NODE Имя связи баз данных, использующейся для
обращения к объекту (таблице или обзору).
OBJECT_OWNER Имя пользователя, владеющего схемой, в которой
содержится таблица или индекс.
OBJECT_NAME Имя таблицы или индекса.
OBJECT_INSTANCE Номер, соответствующий порядковой позиции
объекта в исходном предложении. Нумерация
ведется слева направо и снаружи внутрь, по
отношению к тексту исходного предложения.
Заметим, что расширение обзора приводит к
непредсказуемости этих номеров.
OBJECT_TYPE Модификатор, предоставляющий описательную
информацию об объекте; например, NON-UNIQUE для
индексов.
SEARCH_COLUMNS В настоящее время не используется.
ID Номер, назначенный каждому шагу в плане
исполнения.
PARENT_ID ID следующего шага исполнения, который оперирует
на результатах текущего шага. Описание того,
как столбцы ID и PARENT_ID показывают порядок
работы плана исполнения, приведено в секции
"Пример вывода EXPLAIN PLAN" на странице B-16.
POSITION Порядок обработки шагов, имеющих один и тот же
PARENT_ID.
В первой строке, сгенерированной для предложения
SQL, этот столбец содержит стоимость
предложения, как она оценена стоимостным
подходом оптимизатора. Для предложений,
использующих регулярный подход, этот столбец
содержит пустое значение в первой строке.
OTHER Прочая информация, специфичная для данного шага
исполнения, которую пользователь может найти
полезной. Например, для распределенного запроса
столбец OTHER может содержать текст предложения
SQL, посылаемого в удаленную базу данных.
Табл.B-1 показывает все возможные комбинации значений OPERATION
и OPTION, которые могут быть сгенерированы командой EXPLAIN
PLAN, и их смысл в плане исполнения.
Табл.B-1
Значения OPERATION и OPTION, генерируемые командой EXPLAIN PLAN
г=============T===========T====================================¬
¦OPERATION ¦OPTION ¦Описание ¦
¦=============+===========+====================================¦
¦AGGREGATE ¦GROUP BY ¦Извлечение единственной строки как ¦
¦ ¦ ¦результат применения групповой функ-¦
¦ ¦ ¦ции к группе выбираемых строк. ¦
¦-------------+-----------+------------------------------------¦
¦AND-EQUAL ¦ ¦Операция, которая принимает несколь-¦
¦ ¦ ¦ко множеств ROWID и возвращает пере-¦
¦ ¦ ¦сечение этих множеств, устраняя пов-¦
¦ ¦ ¦торения. Эта операция используется ¦
¦ ¦ ¦для пути доступа через одностолбцо- ¦
¦ ¦ ¦вый индекс. ¦
¦-------------+-----------+------------------------------------¦
¦CONNECT BY ¦ ¦Извлечение строк в иерархическом по-¦
¦ ¦ ¦рядке для запроса, содержащего фразу¦
¦ ¦ ¦CONNECT BY. ¦
¦-------------+-----------+------------------------------------¦
¦CONCATENATION¦ ¦Операция, которая принимает несколь-¦
¦ ¦ ¦ко множеств строк и возвращает их ¦
¦ ¦ ¦полное объединение (UNION ALL). ¦
¦-------------+-----------+------------------------------------¦
¦COUNTING ¦ ¦Операция, которая подсчитывает число¦
¦ ¦ ¦строк, выбираемых из таблицы. ¦
¦-------------+-----------+------------------------------------¦
¦FILTER ¦ ¦Операция, которая принимает множест-¦
¦ ¦ ¦во строк, отбрасывает некоторые из ¦
¦ ¦ ¦них и возвращает результат. ¦
¦-------------+-----------+------------------------------------¦
¦FIRST ROW ¦ ¦Извлечение лишь первой строки, выб- ¦
¦ ¦ ¦ранной запросом. ¦
¦-------------+-----------+------------------------------------¦
¦FOR UPDATE ¦ ¦Операция, которая возвращает и бло- ¦
¦ ¦ ¦кирует строки, выбранные запросом, ¦
¦ ¦ ¦содержащим фразу FOR UPDATE. ¦
¦=============+===========+====================================¦
¦INDEX(*) ¦UNIQUE SCAN¦Извлечение единственного ROWID из ¦
¦ ¦ ¦индекса. ¦
¦ +-----------+------------------------------------¦
¦ ¦RANGE SCAN ¦Извлечение одного или нескольких ¦
¦ ¦ ¦ROWID из индекса. Значения индекса ¦
¦ ¦ ¦просматриваются в порядке возраста- ¦
¦ ¦ ¦ния. ¦
¦ +-----------+------------------------------------¦
¦ ¦RANGE SCAN ¦Извлечение одного или нескольких ¦
¦ ¦DESCENDING ¦ROWID из индекса. Значения индекса ¦
¦ ¦ ¦просматриваются в порядке убывания. ¦
¦-------------+-----------+------------------------------------¦
¦INTERSECTION ¦ ¦Операция, которая принимает два мно-¦
¦ ¦ ¦жества строк и возвращает их пересе-¦
¦ ¦ ¦чение, устраняя дубликаты. ¦
¦-------------+-----------+------------------------------------¦
¦MERGE JOIN(+)¦ ¦Операция, которая принимает два мно-¦
¦ ¦ ¦жества строк, каждая из которых от- ¦
¦ ¦ ¦сортирована по некоторому значению, ¦
¦ ¦ ¦комбинирует каждую строку одного ¦
¦ ¦ ¦множества с соответствующими строка-¦
¦ ¦ ¦ми другого, и возвращает результат. ¦
¦ +-----------+------------------------------------¦
¦ ¦OUTER ¦Операция MERGE JOIN, выполняющая ¦
¦ ¦ ¦внешнее соединение. ¦
¦-------------+-----------+------------------------------------¦
¦MINUS ¦ ¦Операция, которая принимает два мно-¦
¦ ¦ ¦жества строк и возвращает те строки,¦
¦ ¦ ¦которые встречаются в первом мно- ¦
¦ ¦ ¦жестве, но не во втором, устраняя ¦
¦ ¦ ¦дубликаты. ¦
¦-------------+-----------+------------------------------------¦
¦NESTED LOOPS ¦ ¦Операция, которая принимает два мно-¦
¦(+) ¦ ¦жества строк, внешнее и внутреннее. ¦
¦ ¦ ¦ORACLE сравнивает каждую строку из ¦
¦ ¦ ¦внешнего множества с каждой строкой ¦
¦ ¦ ¦из внутреннего множества и возвраща-¦
¦ ¦ ¦ет строки, удовлетворяющие условию. ¦
¦ +-----------+------------------------------------¦
¦ ¦OUTER ¦Операция NESTED LOOPS, выполняющая ¦
¦ ¦ ¦внешнее соединение. ¦
¦-------------+-----------+------------------------------------¦
¦PROJECTION ¦ ¦Внутренняя операция. ¦
¦-------------+-----------+------------------------------------¦
¦REMOTE ¦ ¦Извлечение данных из удаленной базы ¦
¦ ¦ ¦данных. ¦
¦=============+===========+====================================¦
¦SEQUENCE ¦ ¦Операция, включающая обращение к ¦
¦ ¦ ¦значениям последовательности. ¦
¦-------------+-----------+------------------------------------¦
¦SORT ¦UNIQUE ¦Операция, которая сортирует множест-¦
¦ ¦ ¦во строк, чтобы устранить дубликаты.¦
¦ +-----------+------------------------------------¦
¦ ¦GROUP BY ¦Операция, которая сортирует множест-¦
¦ ¦ ¦во строк по группам для запроса, со-¦
¦ ¦ ¦держащего фразу GROUP BY. ¦
¦ +-----------+------------------------------------¦
¦ ¦JOIN ¦Операция, которая сортирует множест-¦
¦ ¦ ¦во строк перед операцией соединения ¦
¦ ¦ ¦через слияние (MERGE JOIN). ¦
¦ +-----------+------------------------------------¦
¦ ¦ORDER BY ¦Операция, которая сортирует множест-¦
¦ ¦ ¦во строк для запроса, содержащего ¦
¦ ¦ ¦фразу ORDER BY. ¦
¦-------------+-----------+------------------------------------¦
¦TABLE ACCESS ¦FULL ¦Извлечение всех строк из таблицы. ¦
¦(*) +-----------+------------------------------------¦
¦ ¦CLUSTER ¦Извлечение строк из таблицы на базе ¦
¦ ¦ ¦значения ключа индексированного ¦
¦ ¦ ¦кластера. ¦
¦ +-----------+------------------------------------¦
¦ ¦HASH ¦Извлечение строк из таблицы на базе ¦
¦ ¦ ¦значения ключа хэш-кластера. ¦
¦ +-----------+------------------------------------¦
¦ ¦BY ROWID ¦Извлечение строки из таблицы на базе¦
¦ ¦ ¦значения ROWID. ¦
¦-------------+-----------+------------------------------------¦
¦UNION ¦ ¦Операция, которая принимает два мно-¦
¦ ¦ ¦жества строк и возвращает объедине- ¦
¦ ¦ ¦ние этих множеств, устраняя дублика-¦
¦ ¦ ¦ты. ¦
¦-------------+-----------+------------------------------------¦
¦VIEW ¦ ¦Операция, которая выполняет запрос ¦
¦ ¦ ¦обзора и возвращает результирующие ¦
¦ ¦ ¦строки другой операции. ¦
L=============¦===========¦====================================-
(*) Эти операции являются методами доступа.
(+) Эти операции являются операциями соединения (join).
Как методы доступа, так и операции соединения обсуждаются в
главе 13 "Оптимизатор" документа ORACLE7 Server Concepts Manual.
Пример вывода EXPLAIN PLAN
--------------------------
Следующий пример показывает предложение SQL и его
соответствующий план исполнения, сгенерированный с помощью
команды EXPLAIN PLAN.
Этот запрос извлекает имена и другую информацию о тех
сотрудниках, оклады которых не попадают ни в один из допустимых
диапазонов, содержащихся в таблице SALGRADE:
SELECT ename, job, sal, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND NOT EXISTS
(SELECT *
FROM salgrade
WHERE emp.sal BETWEEN losal AND hisal)
Следующее предложение EXPLAIN PLAN генерирует план исполнения
для этого предложения и помещает свой вывод в таблицу
PLAN_TABLE:
EXPLAIN PLAN
SET STATEMENT_ID = 'Emp Sal'
FOR SELECT ename, job, sal, dname
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND NOT EXISTS
(SELECT *
FROM salgrade
WHERE emp.sal BETWEEN losal AND hisal)
Табличный формат вывода EXPLAIN PLAN
Следующее предложение SELECT генерирует показанный ниже вывод:
SELECT operation, options, object_name, id, parent_id, position
FROM plan_table
WHERE statement_id = 'Emp Sal'
ORDER BY id
OPERATION OPTIONS OBJECT_NAME ID PARENT_ID POSITION
------------------------------------------------------------------
SELECT STATEMENT 0 5
FILTER 1 0 0
NESTED LOOPS 2 1 1
TABLE ACCESS FULL EMP 3 2 1
TABLE ACCESS FULL DEPT 4 2 2
TABLE ACCESS FULL SALGRADE 5 1 3
Фраза ORDER BY возвращает шаги плана исполнения в порядке их
значений ID. Однако, ORACLE не выполняет шаги в этом порядке.
Поскольку PARENT_ID принимает информацию от ID, вы можете
заметить, что один родительский шаг (PARENT_ID) может питаться
информацией из более чем одного порожденного шага (ID).
Например, шаг 3 и шаг 4 поставляют свой вывод шагу 2.
Графическое представление этой последовательности обработки
показано в следующей секции.
Значение столбца POSITION в первой строке вывода указывает, что
оптимизатор оценивает стоимость исполнения этого приложения при
данном плане исполнения как 5.
Иерархический формат вывода EXPLAIN PLAN
Тип предложения SELECT, приведенный ниже, геренирует
иерархическое представление вывода, которое более точно
воспроизводит порядок выполнения шагов при обработке предложения
SQL. Этот порядок напоминает структуру дерева, которая показана
на рис.B-1 на следующей странице.
SELECT LPAD(' ',2*(LEVEL-1)||operation||' '||options||' ' ||object_name||' '||DECODE(id, 0, 'Cost = '||position)
"Query Plan"
FROM plan_table
START WITH id = 0 AND statement_id = 'Emp Sal'
CONNECT BY PRIOR id = parent_id AND statement_id = 'Emp Sal'
Query Plan
------------------------------
SELECT STATEMENT Cost = 5
FILTER
NESTED LOOPS
TABLE ACCESS FULL EMP
TABLE ACCESS FULL DEPT
TABLE ACCESS FULL SALGRADE
Рис.B-1
Иерархическая структура плана исполнения
ФИЛЬТР
------¬
-----------+ 1 +----------¬
¦ L------ ¦
¦ ¦
---+--¬ВЛОЖЕННЫЕ ЦИКЛЫ ---+--¬ДОСТУП К ТАБЛИЦЕ
-----------+ 2 +----------¬ ¦--5--¦(ПОЛНЫЙ)
¦ L------ ¦ L------salgrade
¦ ¦
---+--¬ДОСТУП К ТАБЛИЦЕ ---+--¬ДОСТУП К ТАБЛИЦЕ
¦--3--¦(ПОЛНЫЙ) ¦--4--¦(ПОЛНЫЙ)
L------emp L------dept
Иерархическая структура позволяет видеть, как операции, которые
выполняются при исполнении предложения SQL, поставляют
информацию друг другу. Каждый шаг плана исполнения имеет
назначенный ему номер (представленный столбцом ID в таблице
PLAN_TABLE), и представлен "узлом" на диаграмме. Результат
операции, выполняемой каждым узлом, передается соответствующему
родительскому узлу, который использует эти данные как входные.