ИНСТРУМЕНТЫ ДИАГНОСТИКИ ПРОИЗВОДИТЕЛЬНОСТИ
 
        Основным инструментом для мониторинга производительности  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),  и  представлен  "узлом"  на  диаграмме.  Результат
        операции, выполняемой каждым узлом, передается  соответствующему
        родительскому узлу, который использует эти данные как входные.