Руководство по настройке SQL. Примечание 23. Выполнение трассировки приложений

Эта статья представляет собой примечания к главе 23 «Выполнение трассировки приложений» Руководства по настройке SQL .

В этой главе объясняется, что такое сквозная трассировка приложений и как создавать и читать файлы трассировки.

важные базовые понятия

23.1 Обзор сквозной трассировки приложений

Сквозная трассировка приложений может идентифицировать источники чрезмерной нагрузки на базу данных, такие как высоконагруженные операторы SQL, по идентификатору клиента, службе, модулю, операции, сеансу, экземпляру или всей базе данных .

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

23.1.1 Цель сквозной трассировки приложений

Сквозная трассировка приложений упрощает диагностику проблем с производительностью в многоуровневых средах.

Например, вы можете определить источники чрезмерной нагрузки на базу данных, такие как операторы SQL с высокой нагрузкой, и связаться с ответственным пользователем. Также с вами могут связаться пользователи, столкнувшиеся с проблемами. Затем вы можете определить, что делает этот пользовательский сеанс на уровне PDB.

Сквозная трассировка приложений также упрощает управление рабочими нагрузками приложений за счет отслеживания определенных модулей и операций в службах. Имена модулей и действий устанавливаются разработчиком приложения . Например, вы можете установить эти значения в программе PL/SQL, используя процедуры SET_MODULE и SET_ACTION в пакете DBMS_APPLICATION_INFO .

Сквозная трассировка приложений может выявить проблемы с рабочей нагрузкой в ​​базе данных:

  • Идентификатор клиента
    Указывает конечного пользователя по идентификатору входа в систему, например, HR.HR.

  • Служба
    Определяет группу приложений с общими атрибутами, пороговыми значениями уровня обслуживания и приоритетами или отдельное приложение, например, ACCTG для бухгалтерского приложения.

  • Модуль
    Определяет функциональный модуль приложения, например «Расчеты с клиентами» или «Главная книга».

  • действие
    определяет операцию в модуле, например операцию INSERT или UPDATE.

  • сеанс
    Задает сеанс локального экземпляра на основе заданного идентификатора сеанса базы данных (SID).

  • Экземпляр
    Указывает данный экземпляр базы данных по имени экземпляра.


  • назначенный контейнер

23.1.2 Сквозная трассировка приложений для PDB

Представление V$ позволяет читать файлы трассировки конкретного контейнера.

Основные варианты использования следующие:

  • Администратор CDB должен просматривать файлы трассировки из определенной PDB.
    В представлении V$DIAG_TRACE_FILE перечислены все файлы трассировки в каталоге трассировки ADR, содержащие данные трассировки из определенной PDB. V$DIAG_TRACE_FILE_CONTENTS Отображает содержимое файлов трассировки.

  • Администраторы PDB должны просматривать файлы трассировки из определенной PDB.
    Вы можете использовать SQL Trace для сбора диагностических данных для операторов SQL, выполняемых в приложении PDB. Данные трассировки включают трассировку SQL (событие 10046) и трассировку оптимизатора (событие 10053). Используя представление V$, разработчики могут получить доступ только к записям трассировки SQL или оптимизатора, не обращаясь ко всему файлу трассировки .

Чтобы пользователи и инструменты могли определить, какая PDB связана с файлом или частью файла, комментарии PDB существуют в файлах трассировки, дампах событий и файлах журналов. Информация PDB является частью структурированных метаданных, хранящихся в файле .trm каждого файла трассировки. Каждая запись содержит следующие атрибуты:

  • CON_ID, который является идентификатором контейнера, связанного с данными.
  • CON_UID — уникальный идентификатор контейнера.
  • NAME, которое является именем контейнера

23.1.3 Инструменты для сквозной трассировки приложений

SQL Trace и TKPROF — это два основных инструмента диагностики производительности , которые могут помочь вам точно оценить эффективность операторов SQL, выполняемых вашим приложением.

Для достижения наилучших результатов используйте эти инструменты вместе с EXPLAIN PLAN, а не только с EXPLAIN PLAN. После того, как информация трассировки будет записана в файл, вы можете использовать утилиту TRCSESS для консолидации этих данных , а затем использовать TKPROF или SQL Trace для их диагностики .

Рекомендуемый интерфейс для сквозной трассировки приложений — Oracle Enterprise Manager Cloud Control (Cloud Control). Используя Cloud Control, вы можете просматривать основных потребителей каждого типа потребителей, а также включать или отключать сбор статистики и трассировку SQL для определенных потребителей. Если Cloud Control недоступен, вы можете управлять этой функциональностью с помощью DBMS_MONITOR API .

23.1.3.1 Обзор средства трассировки SQL

Инструмент SQL Trace предоставляет информацию о производительности отдельных операторов SQL.

SQL Trace генерирует следующую статистику для каждого оператора:

  • Разобрать, выполнить и подсчитать
  • ЦП и время выполнения
  • физическое чтение и логическое чтение
  • количество обработанных строк
  • промах библиотечного кеша
  • Имя пользователя для каждого случая разрешения
  • Каждый коммит и откат
  • Данные о событиях ожидания для каждого оператора SQL и сводка для каждого файла трассировки.

Если курсор оператора SQL закрыт, SQL Trace также предоставляет информацию об источнике строки, в том числе:

  • Отображает операции со строками фактического плана выполнения для каждого оператора SQL.
  • Количество строк, согласованное чтение, физическое чтение, физическая запись и время, затрачиваемое на каждую операцию над строкой.

Хотя вы можете включить средство SQL Trace для сеанса или экземпляра, Oracle рекомендует вместо этого использовать пакеты DBMS_SESSION или DBMS_MONITOR . Когда средство трассировки SQL включено для сеанса или экземпляра, статистика производительности для всех операторов SQL, выполненных в сеансе или экземпляре пользователя, помещается в файл трассировки. Использование инструмента SQL Trace может повлиять на производительность и привести к увеличению нагрузки на систему, высокой загрузке ЦП и нехватке места на диске .

Утилита командной строки TRCSESS объединяет информацию трассировки из нескольких файлов трассировки на основе определенных критериев, таких как сеанс или идентификатор клиента.

23.1.3.2 Обзор ТКПРОФ

Чтобы отформатировать содержимое файла трассировки и поместить вывод в удобочитаемый выходной файл, запустите программу TKPROF.

ТКПРОФ также может:

  • Создание SQL-скриптов, сохраняющих статистику в базе данных
  • Определить план выполнения оператора SQL

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

23.2 Включение сбора статистики для сквозной трассировки

Для сбора надлежащей статистики с помощью PL/SQL необходимо включить сбор статистики для идентификатора клиента, службы, модуля или операции с использованием процедур в DBMS_MONITOR.

Уровень по умолчанию — сбор статистики на уровне сеанса . Сбор статистики является глобальным для базы данных и продолжается при перезапуске экземпляра базы данных.

23.2.1 Включение сбора статистики для идентификатора клиента

Процедура CLIENT_ID_STAT_ENABLE включает сбор статистики для данного идентификатора клиента, а процедура CLIENT_ID_STAT_DISABLE отключает его.

Вы можете просмотреть идентификатор клиента в столбце CLIENT_IDENTIFIER V$SESSION.

Предположим, вы хотите включить, а затем отключить сбор статистики для клиента с идентификатором oe.oe.

-- 为 oe.oe 启用统计信息收集。
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_ENABLE(client_id => 'OE.OE');
-- 为 oe.oe 禁用统计信息收集。
EXECUTE DBMS_MONITOR.CLIENT_ID_STAT_DISABLE(client_id => 'OE.OE');

23.2.2 Включение сбора статистики для сервисов, модулей и действий

Процедура SERV_MOD_ACT_STAT_ENABLE включает сбор статистики для комбинации службы, модуля и операции, а процедура SERV_MOD_ACT_STAT_DISABLE отключает сбор статистики для комбинации службы, модуля и операции.

Когда вы изменяете модуль или операцию с помощью предыдущей процедуры DBMS_MONITOR, изменение вступает в силу при следующем вызове пользователя в сеансе. Например, если модуль установлен в модуль1 в сеансе, и если модуль сброшен в модуль2 в пользовательском вызове в сеансе, модуль остается модулем1 на время этого пользовательского вызова. При следующем вызове пользователя в сеансе модуль меняется на module2.

-- 启用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(
    service_name => 'ACCTG'   
,   module_name  => 'PAYROLL' );
END;

BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_STAT_ENABLE(
    service_name => 'ACCTG'      
,   module_name  => 'GLEDGER'     
,   action_name  => 'INSERT ITEM' );
END;

-- 禁用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_STAT_DISABLE(
    service_name => 'ACCTG'       
,   module_name  => 'GLEDGER'     
,   action_name  => 'INSERT ITEM' );
END;

23.3 Включение сквозной трассировки приложений

Чтобы включить трассировку клиентских идентификаторов, служб, модулей, операций, сеансов, экземпляров или баз данных, выполните соответствующую процедуру в пакете DBMS_MONITOR.

На основе предоставленных вами критериев конкретная информация трассировки записывается в набор файлов трассировки и объединяется в один выходной файл трассировки. Вы можете включить трассировку для определенной диагностики и управления рабочей нагрузкой при следующих условиях.

23.3.1 Включение отслеживания для идентификатора клиента

-- 要启用和禁用对客户端标识符的跟踪
BEGIN 
  DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE(
    client_id => 'OE.OE' ,      
    waits     => true    ,      
    binds     => false   );
END;

-- 禁用
EXECUTE DBMS_MONITOR.CLIENT_ID_TRACE_DISABLE(client_id => 'OE.OE');

23.3.2 Включение трассировки для службы, модуля и действия

Процедура DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE включает трассировку SQL для указанной комбинации имени службы, модуля и операции глобально для базы данных, если в процедуре не указано имя экземпляра базы данных.

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

-- 启用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_ENABLE(
    service_name  => 'ACCTG'   ,
    module_name   => 'PAYROLL' ,
    waits         =>  true     ,
    binds         =>  false    ,
    instance_name => 'inst1'   );
END;

-- 禁用
BEGIN 
  DBMS_MONITOR.SERV_MOD_ACT_TRACE_DISABLE(
    service_name  => 'ACCTG'   ,
    module_name   => 'PAYROLL' ,
    instance_name => 'inst1'   );
END;

23.3.3 Включение трассировки для сеанса

Процедура SESSION_TRACE_ENABLE включает трассировку для заданного идентификатора сеанса базы данных (SID) в локальном экземпляре.

Хотя пакет DBMS_MONITOR может вызываться только пользователями с ролью DBA, пользователи также могут включить трассировку SQL для своих сеансов, вызвав процедуру DBMS_SESSION.SESSION_TRACE_ENABLE.

-- 为当前会话启用跟踪
BEGIN 
  DBMS_SESSION.SESSION_TRACE_ENABLE(
    waits => true
  , binds => false);
END;

-- 为指定会话启用跟踪
SELECT SID, SERIAL#, USERNAME 
FROM   V$SESSION
WHERE  USERNAME = 'OE';

       SID    SERIAL# USERNAME
---------- ---------- ------------------------------
        27         60 OE

BEGIN 
  DBMS_MONITOR.SESSION_TRACE_ENABLE(
    session_id => 27 
  , serial_num => 60
  , waits      => true
  , binds      => false);
END;

-- 为指定会话禁用跟踪
BEGIN
  DBMS_MONITOR.SESSION_TRACE_DISABLE(
    session_id => 27
  , serial_num => 60);
END;

23.3.4 Включение трассировки для экземпляра или базы данных

Процедура DBMS_MONITOR.DATABASE_TRACE_ENABLE переопределяет всю другую трассировку на уровне сеанса, но является дополнением к трассировке идентификатора клиента, службы, модуля и операции . Включите трассировку для всех текущих и будущих сеансов.

Все новые сеансы наследуют информацию об ожидании и связывании, указанную в этой процедуре, до тех пор, пока вы не вызовете процедуру DATABASE_TRACE_DISABLE. При вызове этой процедуры с параметром instance_name процедура сбрасывает трассировку SQL на уровне сеанса для именованного экземпляра. Если вы вызываете эту процедуру без параметра instance_name, процедура сбрасывает трассировку SQL на уровне сеанса для всей базы данных.

Предварительное условие: у вас должны быть права администратора для выполнения процедуры DATABASE_TRACE_ENABLE.

-- 启用
BEGIN 
  DBMS_MONITOR.DATABASE_TRACE_ENABLE(
    waits         => true
  , binds         => false
  , instance_name => 'inst1' );
END;

-- 禁用
EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE(instance_name => 'inst1');

-- 整库禁用
EXECUTE DBMS_MONITOR.DATABASE_TRACE_DISABLE();

23.4 Генерация выходных файлов с помощью SQL Trace и TKPROF

В этом разделе описаны основные процедуры использования SQL Trace и TKPROF.
Процесс создания выходного файла выглядит следующим образом:

  1. Установите параметры инициализации для управления файлом трассировки.
  2. Включите средство трассировки SQL для нужного сеанса, затем запустите приложение. На этом шаге создается файл трассировки, содержащий статистику для операторов SQL, выдаваемых приложением.
  3. Запустите TKPROF, чтобы преобразовать файл трассировки, созданный на шаге 2, в читаемый выходной файл. На этом шаге можно дополнительно создать сценарий SQL, который можно использовать для хранения статистики в базе данных.
  4. Либо запустите сценарий SQL, созданный на шаге 3, чтобы сохранить статистику в базе данных.

23.4.1 Шаг 1: Установка параметров инициализации для управления файлами трассировки

Чтобы включить файлы трассировки, необходимо убедиться, что установлены определенные параметры инициализации.

Когда средство трассировки SQL включено для сеанса, база данных Oracle создает файл который содержит статистику для SQL-операторов трассировки сеанса. Когда средство трассировки SQL включено для экземпляра, Oracle Database создает отдельный файл трассировки для каждого процесса .

Задайте параметры инициализации для управления файлом трассировки:

  1. Проверьте настройки параметров инициализации TIMED_STATISTICS, MAX_DUMP_FILE_SIZE и DIAGNOSTIC_DEST, как показано в «Табл. 23-1».
параметр описывать
ДИАГНОСТИКА_DEST Указывает расположение домашней страницы репозитория автоматизированной диагностики (ADR). Файлы диагностики для каждого экземпляра базы данных расположены в этом специальном каталоге.
MAX_DUMP_FILE_SIZE Когда средство SQL Trace включено на уровне экземпляра базы данных, каждый вызов базы данных записывает строку текста в файл в формате файла операционной системы. Максимальный размер этих файлов в блоке операционной системы ограничен этим параметром инициализации. По умолчанию неограничен.
TIMED_STATISTICS Включайте и отключайте сбор запланированной статистики, такой как ЦП и затраченное время, с помощью средства трассировки SQL, а также сбор различной статистики в представлении V$.
Значение по умолчанию TIMED_STATISTICS равно true, если для параметра STATISTICS_LEVEL установлено значение TYPICAL или ALL. Если для STATISTICS_LEVEL установлено значение BASIC, значение по умолчанию для TIMED_STATISTICS равно false.
Включение синхронизации вызывает дополнительные вызовы синхронизации для низкоуровневых операций. Это динамический параметр. Это также параметр сеанса.
  1. Разработайте способ идентификации сгенерированных файлов трассировки.
    Убедитесь, что вы знаете, как различать файлы трассировки по имени. Вы можете пометить файл трассировки, включив в свою программу такой оператор, как SELECT имя_программы FROM DUAL. Затем вы можете отследить каждый файл до процесса, который его создал.
    Вы также можете установить параметр инициализации TRACEFILE_IDENTIFIER, чтобы указать пользовательский идентификатор, который будет частью имени файла трассировки.
ALTER SESSION SET TRACEFILE_IDENTIFIER = 'my_trace_id';
  1. Если операционная система хранит несколько версий файлов, убедитесь, что предел версии достаточно высок, чтобы вместить количество файлов трассировки, которые вы хотите создать с помощью SQL Trace.

  2. Если сгенерированные файлы трассировки могут принадлежать другому пользователю операционной системы, убедитесь, что у вас есть необходимые разрешения для их форматирования с помощью TKPROF.

23.4.2 Шаг 2. Включение средства трассировки SQL

Вы можете включить трассировку SQL на уровне экземпляра или сеанса.

Используемый пакет зависит от уровня:

  • Экземпляр базы данных
    включает трассировку с помощью процедуры DBMS_MONITOR.DATABASE_TRACE_ENABLE и отключает трассировку с помощью процедуры DBMS_MONITOR.DATABASE_TRACE_DISABLE.

  • Трассировка сеансов базы данных
    включается (true) или отключается (false) с помощью процедуры DBMS_SESSION.SET_SQL_TRACE.

Примечание. Из-за накладных расходов на запуск инструмента SQL Trace включайте его только при настройке операторов SQL и отключайте его, когда закончите.

-- 数据库层面
EXEC DBMS_MONITOR.DATABASE_TRACE_ENABLE(INSTANCE_NAME => 'orcl');
EXEC DBMS_MONITOR.DATABASE_TRACE_DISABLE(INSTANCE_NAME => 'orcl');

-- 会话级层面
EXEC DBMS_SESSION.SET_SQL_TRACE(sql_trace => true);
EXEC DBMS_SESSION.SET_SQL_TRACE(sql_trace => false);

23.4.3 Шаг 3: Создание выходных файлов с помощью TKPROF

TKPROF принимает в качестве входных данных файл трассировки, сгенерированный инструментом трассировки SQL, и создает отформатированный выходной файл. ТКПРОФ также может формировать планы выполнения.

После того как инструмент SQL Trace создаст файл трассировки, вы сможете:

  • Запустите TKPROF для каждого отдельного файла трассировки, создав несколько отформатированных выходных файлов, по одному для каждого сеанса.
  • Прикрепите файл трассировки, затем запустите TKPROF для результатов, чтобы создать отформатированный выходной файл для всего экземпляра.
  • Запустите утилиту командной строки TRCSESS, чтобы объединить информацию трассировки из нескольких файлов трассировки, а затем запустите TKPROF для результатов.

TKPROF не сообщает об операторах COMMIT и ROLLBACK, зарегистрированных в файлах трассировки.

Примечание. Следующие операторы SQL усекаются до 25 символов в файле трассировки SQL:

SET ROLE
GRANT
ALTER USER
ALTER ROLE
CREATE USER
CREATE ROLE

Пример 23-1 Выход TKPROF

SELECT * FROM emp, dept 
WHERE emp.deptno = dept.deptno;

call   count      cpu    elapsed     disk    query current    rows
---- -------  -------  --------- -------- -------- -------  ------
Parse      1     0.16      0.29         3       13       0       0
Execute    1     0.00      0.00         0        0       0       0
Fetch      1     0.03      0.26         2        2       4      14 
 
Misses in library cache during parse: 1 
Parsing user id: (8) SCOTT 

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 Trace в табличной форме
  • Количество промахов библиотечного кэша при анализе и выполнении операторов.
  • Сначала пользователь анализирует оператор.
  • План выполнения, сгенерированный EXPLAIN PLAN.

TKPROF также предоставляет сводку операторов пользовательского уровня и рекурсивных вызовов SQL к файлу трассировки.

23.4.4 Шаг 4. Хранение статистики средства трассировки SQL

Вы можете сохранить историю статистики, сгенерированной инструментом SQL Trace для вашего приложения, и сравнивать ее с течением времени.

ТКПРОФ может генерировать SQL-скрипт, который создает таблицу и вставляет в нее строки статистики. Скрипт содержит следующее:

  • Оператор CREATE TABLE, который создает выходную таблицу с именем TKPROF_TABLE.
  • Операторы INSERT, добавляющие строки статистики в TKPROF_TABLE, по одному на каждый отслеживаемый оператор SQL.

После запуска ТКПРОФ запустите этот скрипт для сохранения статистики в базе данных.

23.4.4.1 Генерация выходного SQL-скрипта TKPROF

При запуске TKPROF используйте параметр INSERT, чтобы указать имя сгенерированного сценария SQL.

Если параметр INSERT опущен, TKPROF не генерирует скрипты.

23.4.4.2 Редактирование выходного SQL-скрипта TKPROF

После того, как ТКПРОФ создал сценарий SQL, вы можете отредактировать сценарий перед его запуском.

Если вы уже создали выходную таблицу для ранее собранной статистики и хотите добавить в эту таблицу новую статистику, удалите оператор CREATE TABLE из сценария. Затем сценарий вставляет новую строку в существующую таблицу. Если вы создали несколько выходных таблиц, возможно, для хранения статистики из разных баз данных в разных таблицах, отредактируйте операторы CREATE TABLE и INSERT, чтобы изменить имена выходных таблиц.

23.4.4.3 Запрос выходной таблицы

После создания выходной таблицы используйте оператор SELECT для запроса.

Следующая инструкция CREATE TABLE создает TKPROF_TABLE:

CREATE TABLE TKPROF_TABLE (

DATE_OF_INSERT    DATE,
CURSOR_NUM        NUMBER,
DEPTH             NUMBER,
USER_ID           NUMBER,
PARSE_CNT         NUMBER,
PARSE_CPU         NUMBER,
PARSE_ELAP        NUMBER,
PARSE_DISK        NUMBER,
PARSE_QUERY       NUMBER,
PARSE_CURRENT     NUMBER,
PARSE_MISS        NUMBER,
EXE_COUNT         NUMBER,
EXE_CPU           NUMBER,
EXE_ELAP          NUMBER,
EXE_DISK          NUMBER,
EXE_QUERY         NUMBER,
EXE_CURRENT       NUMBER,
EXE_MISS          NUMBER,
EXE_ROWS          NUMBER,
FETCH_COUNT       NUMBER,
FETCH_CPU         NUMBER,
FETCH_ELAP        NUMBER,
FETCH_DISK        NUMBER,
FETCH_QUERY       NUMBER,
FETCH_CURRENT     NUMBER,
FETCH_ROWS        NUMBER,
CLOCK_TICKS       NUMBER,
SQL_STATEMENT     LONG);

Большинство столбцов выходной таблицы напрямую соответствуют статистике, отображаемой в отформатированном выходном файле. Например, значение столбца PARSE_CNT соответствует статистике количества шагов синтаксического анализа в выходном файле.

Столбцы в приведенной ниже таблице помогают определить строку статистики.

Таблица 23-2 Столбцы TKPROF_TABLE, используемые для идентификации строк статистики

Список описывать
SQL_STATEMENT Это оператор SQL, для которого инструмент SQL Trace собирает строки статистики. Поскольку тип данных этого столбца — LONG, его нельзя использовать в выражениях или условиях предложения WHERE.
DATE_OF_INSERT Это дата и время, когда строка была вставлена ​​в таблицу. Это значение отличается от случая, когда инструмент SQL Trace собирает статистику.
ГЛУБИНА Это указывает уровень рекурсии, на котором выполняются операторы SQL. Например, значение 0 указывает, что оператор выдал оператор. Значение 1 указывает, что Oracle Database генерирует оператор как рекурсивный вызов для обработки оператора со значением 0 (оператор, выданный пользователем). Значение n указывает, что Oracle Database генерирует операторы как рекурсивные вызовы операторов обработки со значением n-1.
ID ПОЛЬЗОВАТЕЛЯ Это идентифицирует пользователя, выпустившего выписку. Это значение также появляется в отформатированном выходном файле.
CURSOR_NUM База данных Oracle использует это значение столбца, чтобы отслеживать, какому курсору назначен каждый оператор SQL.

В выходной таблице не хранится план выполнения оператора. Следующий запрос возвращает статистику в выходной таблице.

SELECT * FROM TKPROF_TABLE;

DATE_OF_INSERT CURSOR_NUM DEPTH USER_ID PARSE_CNT PARSE_CPU PARSE_ELAP
-------------- ---------- ----- ------- --------- --------- ---------- 
21-DEC-2017          1      0     8         1        16         22

PARSE_DISK PARSE_QUERY PARSE_CURRENT PARSE_MISS EXE_COUNT EXE_CPU 
---------- ----------- ------------- ---------- --------- ------- 
    3          11           0            1           1         0 

EXE_ELAP EXE_DISK EXE_QUERY EXE_CURRENT EXE_MISS EXE_ROWS FETCH_COUNT 
-------- -------- --------- ----------- -------- -------- ----------- 
    0        0        0          0          0        0         1 

FETCH_CPU FETCH_ELAP FETCH_DISK FETCH_QUERY FETCH_CURRENT FETCH_ROWS 
--------- ---------- ---------- ----------- ------------- ---------- 
     2        20          2          2            4           10 

SQL_STATEMENT 
---------------------------------------------------------------------
SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO 

23.5 Рекомендации по интерпретации выходных данных TKPROF

Хотя ТКПРОФ обеспечивает полезный анализ, наиболее точным показателем эффективности является производительность приложения . В конце вывода TKPROF приводится сводка работы, выполненной процессом во время выполнения трассировки.

23.5.1 Руководство по интерпретации разрешения статистики

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

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

23.5.2 Руководство по рекурсивным операторам SQL

Рекурсивный SQL — это дополнительный SQL , который должна выдать база данных Oracle, чтобы выполнить оператор SQL, введенный пользователем .

Концептуально рекурсивный SQL является «побочным эффектом SQL». Например, если сеанс вставляет строку в таблицу, в которой недостаточно места для строки, база данных выполняет рекурсивные вызовы SQL для динамического выделения места. База данных также генерирует рекурсивные вызовы, когда информация словаря данных недоступна в памяти и поэтому должна быть получена с диска.

Если при включенном средстве трассировки SQL возникают рекурсивные вызовы, TKPROF генерирует статистику для рекурсивных операторов SQL и четко помечает их как рекурсивные операторы SQL в выходном файле. Вы можете запретить вывод внутренних рекурсивных вызовов Oracle Database (например, управления пространством) в выходной файл, задав для параметра командной строки SYS значение NO. Статистика для рекурсивных операторов SQL включена в листинг для этого оператора, а не в листинг для оператора SQL, вызвавшего рекурсивный вызов. Поэтому при расчете общих ресурсов, необходимых для обработки инструкции SQL, учитывайте статистику для этой инструкции и статистику рекурсивных вызовов, которые выполняет инструкция.

Примечание. Операции на уровне SQL не включают рекурсивную статистику SQL.

23.5.3 Руководство по выбору операторов для настройки

Вы должны определить, какие операторы SQL используют больше всего ресурсов процессора или диска .

Если параметр TIMED_STATISTICS включен, вы можете обнаружить высокую активность ЦП в столбце ЦП. Если параметр TIMED_STATISTICS не включен, проверьте столбцы QUERY и CURRENT.

Помимо проблем с блокировкой и неэффективных циклов PL/SQL, для поиска описания проблемы не требуется ни процессорного времени, ни времени выполнения. Ключ — это количество обращений к блоку , как запросов (то есть с учетом ограничений согласованности чтения), так и текущих (то есть без ограничений согласованности чтения). Заголовки разделов и блоки, подлежащие обновлению, извлекаются текущим способом, но все запросы и подзапросы, обрабатывающие данные, запрашиваются в режиме запроса. Они точно такие же, как статистика экземпляра CONSISTENT GETS и DB BLOCK GETS . Вы можете найти высокую активность диска в столбце диска.

В следующем листинге показан вывод TKPROF для оператора SQL в том виде, в каком он отображается в выходном файле:

SELECT * 
FROM emp, dept 
WHERE emp.deptno = dept.deptno;

call   count      cpu    elapsed     disk    query current    rows
---- -------  -------  --------- -------- -------- -------  ------
Parse     11     0.08      0.18        0       0       0         0
Execute   11     0.23      0.66        0       3       6         0
Fetch     35     6.70      6.83      100   12326       2       824
------------------------------------------------------------------
total     57     7.01      7.67      100   12329       8       826

Misses in library cache during parse: 0 

Если 7,01 секунды ЦП и извлеченные 824 строки являются приемлемыми, вам не нужно дополнительно изучать этот вывод трассировки. Фактически, одно из основных применений отчетов ТКПРОФ в упражнениях по настройке состоит в том, чтобы исключить процессы из этапа детальной настройки.

Вывод показывает, что было сделано 10 ненужных вызовов синтаксического анализа (поскольку для этого единственного оператора было выполнено 11 вызовов синтаксического анализа) и была выполнена выборка массива. Выбрано больше строк, чем выполнено. Большие промежутки между CPU и истекшим временем указывают на физический ввод-вывод .

23.5.4 Рекомендации по обходу ловушек в интерпретации TKPROF

При интерпретации выходных данных TKPROF полезно знать об распространенных ловушках.

23.5.4.1 Рекомендации по избеганию ловушки аргументов

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

EXPLAIN PLAN не может определить тип переменной связывания по тексту оператора SQL, он всегда предполагает, что это тип VARCHAR. Если переменные связывания на самом деле являются числами или датами, TKPROF вызывает неявное преобразование данных, что может привести к неэффективным планам выполнения. Чтобы этого избежать, пробуйте разные типы данных в своих запросах и выполняйте преобразование самостоятельно.

23.5.4.2 Руководство по избеганию ловушки непротиворечивости чтения

Не зная, что незафиксированная транзакция произвела серию обновлений в столбце, трудно понять, почему происходит так много обращений к блокам.

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

SELECT name_id
FROM cq_names 
WHERE name = 'FLOOR';

call     count     cpu     elapsed     disk     query current     rows
----     -----     ---     -------     ----     ----- -------     ----
Parse        1    0.10        0.18        0         0       0        0
Execute      1    0.00        0.00        0         0       0        0
Fetch        1    0.11        0.21        2       101       0        1

Misses in library cache during parse: 1
Parsing user id: 01 (USER1)

Rows     Execution Plan
----     --------- ----
   0     SELECT STATEMENT
   1       TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
   2         INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON_UNIQUE) 

23.5.4.3 Руководство по избеганию ловушки схемы

В некоторых случаях кажущийся простым индексный запрос просматривает множество блоков базы данных и обращается к ним в текущей схеме.

В следующем примере показан крайний (и поэтому легко обнаруживаемый) пример архитектурной ловушки:

SELECT name_id
FROM cq_names 
WHERE name = 'FLOOR';

call        count        cpu      elapsed     disk  query current rows
--------  -------   --------    ---------  ------- ------ ------- ----
Parse           1       0.06         0.10        0      0       0    0
Execute         1       0.02         0.02        0      0       0    0 
Fetch           1       0.23         0.30       31     31       3    1

Misses in library cache during parse: 0
Parsing user id: 02  (USER2)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT
   2340    TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
      0      INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON-UNIQUE)

Две статистики указывают на то, что запрос мог быть выполнен с полным сканированием таблицы: текущий доступ к блоку схемы и количество строк в плане из источника строк доступа к таблице. Объяснение состоит в том, что требуемый индекс строится после создания файла трассировки, но до запуска TKPROF. Создание нового файла трассировки предоставляет следующие данные:

SELECT name_id
FROM cq_names 
WHERE name = 'FLOOR'; 

call    count    cpu   elapsed  disk  query current     rows
-----  ------ ------  -------- ----- ------ -------    -----
Parse       1   0.01      0.02     0      0       0        0
Execute     1   0.00      0.00     0      0       0        0
Fetch       1   0.00      0.00     0      2       0        1

Misses in library cache during parse: 0
Parsing user id: 02  (USER2)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT
      1    TABLE ACCESS (BY ROWID) OF 'CQ_NAMES'
      2      INDEX (RANGE SCAN) OF 'CQ_NAMES_NAME' (NON-UNIQUE)

В правильной версии вызов синтаксического анализа занимал 10 мс процессорного времени и 20 мс времени выполнения, но очевидно, что запрос не требовал времени для выполнения и выполнения выборки. Эти исключения возникают из-за того, что 10 миллисекунд тактов часов слишком велики по сравнению со временем, которое требуется для выполнения и выборки данных. В этом случае важно выполнить оператор несколько раз, чтобы получить статистически достоверные числа.

23.5.4.4 Руководство по избеганию ловушки времени

В некоторых случаях запрос занимает необъяснимо много времени.

Например, обновление следующих 7 строк заняло 19 секунд:

UPDATE cq_names 
  SET ATTRIBUTES = lower(ATTRIBUTES)
  WHERE ATTRIBUTES = :att 

call       count       cpu    elapsed     disk    query current        rows
-------- -------  --------  --------- -------- -------- -------  ----------
Parse          1      0.06       0.24        0        0       0           0
Execute        1      0.62      19.62       22      526      12           7
Fetch          0      0.00       0.00        0        0       0           0

Misses in library cache during parse: 1
Parsing user id: 02  (USER2)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  UPDATE STATEMENT
   2519  TABLE ACCESS (FULL) OF 'CQ_NAMES'

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

23.6 Утилиты отслеживания приложений

Утилиты трассировки Oracle: TKPROF и TRCSESS.

23.6.1 TRCSESS

Утилита TRCSESS объединяет выходные данные трассировки из выбранных файлов трассировки в соответствии с заданными пользователем критериями.

После того, как TRCSESS объединит информацию трассировки в один выходной файл, TKPROF может обработать выходной файл.

23.6.1.1 Цель

TRCSESS полезен для консолидации трассировок для конкретных сеансов в целях повышения производительности или отладки.

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

23.6.1.2 Рекомендации

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

Если вы укажете более одного параметра, TRCSESS объединит все файлы трассировки, соответствующие указанным критериям, в выходной файл.

23.6.1.3 Синтаксис

trcsess  [output=output_file_name]
         [session=session_id]
         [clientid=client_id]
         [service=service_name]
         [action=action_name]
         [module=module_name]
         [trace_files]

23.6.1.4 Опции

TRCSESS поддерживает множество параметров командной строки.

параметр описывать
выход Указывает файл, в котором создаются выходные данные. Если эта опция не указана, утилита будет писать в стандартный вывод.
сеанс Объединить данные трассировки для указанных сеансов. Идентификатор сеанса представляет собой комбинацию индекса сеанса и порядкового номера сеанса, например 21.2371. Вы можете найти эти значения в представлении V$SESSION.
ID клиента Объедините данные трассировки для указанного идентификатора клиента.
услуга Объедините данные трассировки для указанного имени службы.
действие Объедините данные трассировки для указанного имени операции.
модуль Объединить информацию трассировки для указанного имени модуля.
trace_files Перечислите имена файлов трассировки, разделенные пробелами, в которых TRCSESS должен искать информацию трассировки. Вы можете использовать подстановочные знаки (*) для указания имен файлов трассировки. Если файл трассировки не указан, TRCSESS будет использовать в качестве входных данных все файлы в текущем каталоге.

23.6.1.5 Примеры

Пример 23-2 Отслеживание одного сеанса:

trcsess session=21.2371
trcsess session=21.2371 main_12359.trc main_12995.trc

Результат:

[PROCESS ID = 12359] 
*** 2014-04-02 09:48:28.376 
PARSING IN CURSOR #1 len=17 dep=0 uid=27 oct=3 lid=27 tim=868373970961 hv=887450622 ad='22683fb4' 
select * from cat 
END OF STMT 
PARSE #1:c=0,e=339,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=868373970944 
EXEC #1:c=0,e=221,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=4,tim=868373971411 
FETCH #1:c=0,e=791,p=0,cr=7,cu=0,mis=0,r=1,dep=0,og=4,tim=868373972435 
FETCH #1:c=0,e=1486,p=0,cr=20,cu=0,mis=0,r=6,dep=0,og=4,tim=868373986238 
*** 2014-04-02 10:03:58.058 
XCTEND rlbk=0, rd_only=1 
STAT #1 id=1 cnt=7 pid=0 pos=1 obj=0 op='FILTER  ' 
STAT #1 id=2 cnt=7 pid=1 pos=1 obj=18 op='TABLE ACCESS BY INDEX ROWID OBJ$ ' 
STAT #1 id=3 cnt=7 pid=2 pos=1 obj=37 op='INDEX RANGE SCAN I_OBJ2 ' 
STAT #1 id=4 cnt=0 pid=1 pos=2 obj=4 op='TABLE ACCESS CLUSTER TAB$J2 ' 
STAT #1 id=5 cnt=6 pid=4 pos=1 obj=3 op='INDEX UNIQUE SCAN I_OBJ# ' 
[PROCESS ID=12995] 
*** 2014-04-02 10:04:32.738 
Archiving is disabled  

23.6.2 ТКПРОФ

Программа TKPROF форматирует содержимое файла трассировки и помещает вывод в удобочитаемый выходной файл.

ТКПРОФ также может:

  • Создание SQL-скриптов, сохраняющих статистику в базе данных
  • Определить план выполнения оператора SQL

Примечание. Выходные данные TKPROF не включают автоматически фактический план выполнения оператора SQL, если курсор оператора SQL не закрыт. В этом случае используйте опцию EXPLAIN с TKPROF для создания плана выполнения.
TKPROF сообщает о ресурсах, потребленных каждым выполненным оператором, количестве его вызовов и количестве обработанных строк.

23.6.2.1 Цель

ТКПРОФ находит операторы, потребляющие больше всего ресурсов .

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

23.6.2.2 Рекомендации

Входные и выходные файлы являются единственными обязательными параметрами.

Если вы вызываете TKPROF без аргументов, инструмент отображает интерактивную справку.

23.6.2.3 Синтаксис

tkprof input_file output_file
  [ waits=yes|no ] 
  [ sort=option ] 
  [ print=n ]
  [ aggregate=yes|no ] 
  [ insert=filename3 ] 
  [ sys=yes|no ]
  [ table=schema.table ]
  [ explain=user/password ] 
  [ record=filename4 ] 
  [ width=n ]

23.6.2.4 Опции

ТКПРОФ поддерживает множество параметров командной строки.

параметр описывать
входной_файл Указывает входной файл, который представляет собой файл трассировки, содержащий статистику, сгенерированную средством трассировки SQL. Этот файл может быть файлом трассировки, созданным для одного сеанса, или путем объединения одного файла трассировки из нескольких сеансов.
выходной файл Указывает файл, в который TKPROF записывает форматированный вывод.
ЖДЕТ Указывает, следует ли регистрировать сводку любых событий ожидания, обнаруженных в файле трассировки. Допустимые значения: ДА (по умолчанию) и НЕТ.
СОРТИРОВАТЬ Сортирует отслеживаемые операторы SQL в порядке убывания указанных параметров сортировки, прежде чем перечислять их в выходном файле. Если указано более одного параметра, вывод сортируется в порядке убывания суммы значений, указанных в параметрах сортировки. Если вы опустите этот параметр, TKPROF перечислит операторы в выходном файле в порядке их первого использования. Варианты сортировки следующие:
РАСПЕЧАТАТЬ Укажите в выходном файле только первый целочисленный оператор SQL. Если этот параметр опущен, TKPROF перечисляет все отслеживаемые операторы SQL. Этот параметр не влияет на необязательные сценарии SQL. Сценарии SQL всегда генерируют данные вставки для всех отслеживаемых операторов SQL.
АГРЕГАТ Если вы укажете AGGREGATE = NO, TKPROF не будет объединять многократное использование одного и того же литерала SQL.
ВСТАВЛЯТЬ Создайте сценарий SQL, который сохраняет статистику файла трассировки в базе данных. ТКПРОФ создает этот скрипт с именем filename3. Этот сценарий создает таблицу и вставляет в нее строку статистики для каждого отслеживаемого оператора SQL.
СИС Включает и отключает перечисление операторов SQL, выданных пользователем SYS, или рекурсивных операторов SQL в выходной файл. Значение по умолчанию YES заставляет TKPROF отображать эти операторы. Значение NO заставляет ТКПРОФ их игнорировать. Этот параметр не влияет на необязательные сценарии SQL. Сценарии SQL всегда вставляют статистику для всех отслеживаемых операторов SQL, включая рекурсивные операторы SQL.
СТОЛ Указывает схему и имя таблицы, в которую TKPROF временно помещает план выполнения перед его записью в выходной файл. Если указанная таблица существует, ТКПРОФ удаляет все строки в таблице, использует их в операторе EXPLAIN PLAN (записывает дополнительные строки в таблицу), а затем удаляет строки. Если таблицы не существует, ТКПРОФ создает ее, использует и удаляет.
ОБЪЯСНЯТЬ Определяет план выполнения для каждого оператора SQL в файле трассировки и записывает эти планы выполнения в выходной файл. ТКПРОФ также отображает количество строк, обработанных каждым шагом плана выполнения.
ЗАПИСЫВАТЬ Создает сценарий SQL с указанным именем файла, используя весь нерекурсивный SQL в файле трассировки. Этот сценарий можно использовать для воспроизведения пользовательских событий в файле трассировки.
ШИРИНА Целое число, которое управляет шириной выходной строки определенных выходных данных TKPROF, таких как планы объяснения. Этот параметр полезен для постобработки вывода TKPROF.

Опции после параметра SORT следующие: префикс PRS указывает на фазу PARSE, EXE указывает на фазу EXECUTE, а FCH указывает на фазу FETCH:

PRSCNT - 解析次数
PRSCPU - 解析所花费的 CPU 时间
PRSELA - 解析所用时间
PRSDSK - 解析期间从磁盘物理读取的次数
PRSQRY - 解析期间一致模式块读取数
PRSCU - 解析期间读取的当前模式块数
PRSMIS - 分析期间库高速缓存未命中数
EXECNT - 执行次数
EXECPU - 执行所花费的 CPU 时间
EXEELA - 执行所花费的时间
EXEDSK - 执行期间从磁盘物理读取的次数
EXEQRY - 执行期间一致模式块读取数
EXECU - 执行期间当前模式块读取数
EXEROW - 执行期间处理的行数
EXEMIS - 执行期间库缓存未命中数
FCHCNT - 提取次数
FCHCPU - 获取数据所花费的 CPU 时间
FCHELA - 提取所用的时间
FCHDSK - 提取期间从磁盘物理读取的次数
FCHQRY - 获取期间一致模式块读取数
FCHCU - 获取期间当前模式块读取数
FCHROW - 获取的行数
USERID - 解析游标的用户 ID

23.6.2.5 Выход

В этом разделе объясняется вывод TKPROF.

23.6.2.5.1 Идентификация пользователя, выдающего оператор SQL в TKPROF

TKPROF перечисляет идентификатор пользователя, выполнившего каждый оператор SQL.

如果 SQL 跟踪输入文件包含来自多个用户的统计信息,并且如果该语句是由多个用户发出的,那么 TKPROF 会列出最后一个用户的 ID 来解析该语句。 所有数据库用户的用户 ID 出现在数据字典中的 ALL_USERS.USER_ID 列中。

23.6.2.5.2 Tabular Statistics in TKPROF

TKPROF 列出发出每个 SQL 语句的用户的用户 ID。

如果 SQL 跟踪输入文件包含来自多个用户的统计信息,并且如果该语句是由多个用户发出的,那么 TKPROF 会列出最后一个用户的 ID 来解析该语句。 所有数据库用户的用户 ID 出现在数据字典中的 ALL_USERS.USER_ID 列中。

表 23-4 CALL 列值

CALL值 含义
PARSE 将 SQL 语句转换为执行计划,包括检查是否有适当的安全授权以及检查表、列和其他引用对象是否存在。
EXECUTE Oracle 数据库实际执行的语句。 对于 INSERT、UPDATE、DELETE 和 MERGE 语句,这会修改数据。 对于 SELECT 语句,这标识了选定的行。
FETCH 检索查询返回的行。 仅对 SELECT 语句执行提取。

SQL 跟踪工具输出的其他列是语句的所有解析、执行和提取的组合统计信息。 query 和 current 的总和是访问的缓冲区总数,也称为逻辑 I/O (LIO)。 请参见表 23-5。

表 23-5 解析、执行和获取的 SQL 跟踪统计信息。

SQL Trace统计 含义
COUNT 语句被解析、执行或提取的次数。
CPU 语句的所有解析、执行或提取调用的总 CPU 时间(以秒为单位)。 如果未启用 TIMED_STATISTICS,则此值为零 (0)。
ELAPSED 语句的所有解析、执行或提取调用的总耗用时间(以秒为单位)。 如果未启用 TIMED_STATISTICS,则此值为零 (0)。
DISK 为所有解析、执行或提取调用从磁盘上的数据文件物理读取的数据块总数。
QUERY 在一致模式下为所有解析、执行或提取调用检索的缓冲区总数。 通常,缓冲区以查询的一致模式检索。
CURRENT 当前模式中检索到的缓冲区总数。 在当前模式下检索缓冲区以用于 INSERT、UPDATE 和 DELETE 等语句。

有关已处理行的统计信息显示在 ROWS 列中。 该列显示 SQL 语句处理的行数。 此总数不包括由 SQL 语句的子查询处理的行。 对于 SELECT 语句,返回的行数出现在提取步骤中。 对于 UPDATE、DELETE 和 INSERT 语句,处理的行数出现在执行步骤中。

注意:关闭游标时会显示行源计数。 在SQL*Plus中,只有一个用户游标,所以每执行一条语句都会导致前一个游标关闭; 因此,显示行源计数。 PL/SQL 有自己的游标处理,并且在父游标关闭时不会关闭子游标。 退出或重新连接会导致显示计数。

23.6.2.5.3 Library Cache Misses in TKPROF

TKPROF 还列出了每个 SQL 语句的解析和执行步骤导致的库缓存未命中数。

这些统计数据出现在表格统计数据之后的单独行中。 如果该语句导致没有库高速缓存未命中,则 TKPROF 不会列出统计信息。 在“示例”中,该语句导致解析步骤有一次库缓存未命中,而执行步骤没有未命中。

23.6.2.5.4 Row Source Operations in TKPROF

在 TKPROF 输出中,行源操作显示对行执行的每个操作处理的行数,以及其他行源信息,例如物理读取和写入。

表 23-6 行源操作

行源操作 含义
cr 行源执行的一致读取。
r 行源执行的物理读取
w 行源执行的物理写入
time 以微秒为单位的时间

在以下示例 TKPROF 输出中,注意行源操作列下的 cr、r、w 和时间值:

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  DELETE  (cr=43141 r=266947 w=25854 time=60235565 us)
  28144   HASH JOIN ANTI (cr=43057 r=262332 w=25854 time=48830056 us)
  51427    TABLE ACCESS FULL STATS$SQLTEXT (cr=3465 r=3463 w=0 time=865083 us)
 647529    INDEX FAST FULL SCAN STATS$SQL_SUMMARY_PK 
                      (cr=39592 r=39325 w=0 time=10522877 us) (object id 7409)
23.6.2.5.5 Wait Event Information in TKPROF

如果存在等待事件信息,则 TKPROF 输出包括等待事件部分。

输出类似于以下内容:

Elapsed times include waiting on following events:

  Event waited on                 Times Waited   Max. Wait  Total Waited
  ---------------------------     ------------   ---------  ------------
  db file sequential read                 8084        0.12          5.34
  direct path write                        834        0.00          0.00
  direct path write temp                   834        0.00          0.05
  db file parallel read                      8        1.53          5.51
  db file scattered read                  4180        0.07          1.45
  direct path read                        7082        0.00          0.05
  direct path read temp                   7082        0.00          0.44
  rdbms ipc reply                           20        0.00          0.01
  SQL*Net message to client                  1        0.00          0.00
  SQL*Net message from client                1        0.00          0.00

此外,在文件末尾对整个跟踪文件的等待事件进行汇总。

要确保将等待事件信息写入会话的跟踪文件,请运行以下 SQL 语句:

ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';

23.6.2.6 Examples

本节演示常见的 TKPROF 用例。

示例 23-4 打印资源最密集的语句

如果您正在使用 SORT 参数和 PRINT 参数的组合处理大型跟踪文件,那么您可以生成仅包含最高资源密集型语句的 TKPROF 输出文件。 以下语句打印跟踪文件中产生最多物理 I/O 的 10 个语句:

TKPROF ora53269.trc ora53269.prf SORT = (PRSDSK, EXEDSK, FCHDSK) PRINT = 10

示例 23-5 生成 SQL 脚本

此示例运行 TKPROF,接受名为 examp12_jane_fg_sqlplus_007.trc 的跟踪文件,并写入名为 outputa.prf 的格式化输出文件:

TKPROF examp12_jane_fg_sqlplus_007.trc OUTPUTA.PRF EXPLAIN=hr 
  TABLE=hr.temp_plan_table_a INSERT=STOREA.SQL SYS=NO SORT=(EXECPU,FCHCPU)

此示例可能比屏幕上的单行长,您可能需要使用连续字符,具体取决于操作系统。

请注意此示例中的其他参数:

  • EXPLAIN 值导致 TKPROF 作为用户 hr 连接并使用 EXPLAIN PLAN 语句为每个跟踪的 SQL 语句生成执行计划。 您可以使用它来获取访问路径和行源计数。
    注意:如果 SQL 语句的游标没有关闭,则 TKPROF 输出不会自动包含 SQL 语句的实际执行计划。 在这种情况下,您可以使用带有 TKPROF 的 EXPLAIN 选项来生成执行计划。
  • TABLE 值导致 TKPROF 使用模式 scott 中的表 temp_plan_table_a 作为临时计划表。
  • INSERT 值导致 TKPROF 生成名为 STOREA.SQL 的 SQL 脚本,该脚本存储数据库中所有跟踪的 SQL 语句的统计信息。
  • 值为 NO 的 SYS 参数导致 TKPROF 从输出文件中省略递归 SQL 语句。 这样就可以忽略临时表操作等Oracle数据库内部语句。
  • SORT 值导致 TKPROF 按照执行所花费的 CPU 时间和在将它们写入输出文件之前获取行所花费的 CPU 时间的总和对 SQL 语句进行排序。 为了获得最高效率,请始终使用 SORT 参数。

示例 23-6 TKPROF 标头

此示例显示了 TKPROF 报告的样本标题。

TKPROF: Release 12.1.0.0.2
 
Copyright (c) 1982, 2012, Oracle and/or its affiliates.  All rights reserved.
 
Trace file: /disk1/oracle/log/diag/rdbms/orcla/orcla/trace/orcla_ora_917.trc
Sort options: default
 
***************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
***************************************************************************

示例 23-7 TKPROF 主体

此示例显示了 TKPROF 报告的样本主体。

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      0.01       0.00          0          0          0           0

Misses in library cache during parse: 1
Optimizer mode: FIRST_ROWS
Parsing user id: 44  

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1       28.59         28.59
********************************************************************************

select condition 
from
 cdef$ where rowid=:1

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          2          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          2          0           1

Misses in library cache during parse: 1
Optimizer mode: CHOOSE
Parsing user id: SYS   (recursive depth: 1)

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  TABLE ACCESS BY USER ROWID OBJ#(31) (cr=1 r=0 w=0 time=151 us)

********************************************************************************

SELECT last_name, job_id, salary
  FROM employees
WHERE salary =
  (SELECT max(salary) FROM employees)

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.02       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         15          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.02       0.01          0         15          0           1

Misses in library cache during parse: 1
Optimizer mode: FIRST_ROWS
Parsing user id: 44  

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  TABLE ACCESS FULL EMPLOYEES (cr=15 r=0 w=0 time=1743 us)
      1   SORT AGGREGATE (cr=7 r=0 w=0 time=777 us)
    107    TABLE ACCESS FULL EMPLOYEES (cr=7 r=0 w=0 time=655 us)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  SQL*Net message from client                     2        9.62          9.62
********************************************************************************

********************************************************************************
 delete
         from stats$sqltext st
        where (hash_value, text_subset) not in
             (select --+ hash_aj
                     hash_value, text_subset
                from stats$sql_summary ss
               where (   (   snap_id     < :lo_snap
                          or snap_id     > :hi_snap
                         )
                         and dbid            = :dbid
                         and instance_number = :inst_num
                     )
                  or (   dbid            != :dbid
                      or instance_number != :inst_num)
              )

call     count       cpu    elapsed       disk      query    current rows
------- ------  -------- ---------- ---------- ---------- ---------- ----------
Parse        1      0.00       0.00          0          0          0          0
Execute      1     29.60      60.68     266984      43776     131172      28144
Fetch        0      0.00       0.00          0          0          0          0
------- ------  -------- ---------- ---------- ---------- ---------- ----------
total        2     29.60      60.68     266984      43776     131172      28144

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: CHOOSE
Parsing user id: 22

Rows     Row Source Operation
-------  ---------------------------------------------------
      0  DELETE  (cr=43141 r=266947 w=25854 time=60235565 us)
  28144   HASH JOIN ANTI (cr=43057 r=262332 w=25854 time=48830056 us)
  51427    TABLE ACCESS FULL STATS$SQLTEXT (cr=3465 r=3463 w=0 time=865083 us)
 647529    INDEX FAST FULL SCAN STATS$SQL_SUMMARY_PK 
                      (cr=39592 r=39325 w=0 time=10522877 us) (object id 7409)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  db file sequential read                      8084        0.12          5.34
  direct path write                             834        0.00          0.00
  direct path write temp                        834        0.00          0.05
  db file parallel read                           8        1.53          5.51
  db file scattered read                       4180        0.07          1.45
  direct path read                             7082        0.00          0.05
  direct path read temp                        7082        0.00          0.44
  rdbms ipc reply                                20        0.00          0.01
  SQL*Net message to client                       1        0.00          0.00
  SQL*Net message from client                     1        0.00          0.00
********************************************************************************

示例 23-8 TKPROF 摘要

此示例显示 TKPROF 报告的摘要。

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        4      0.04       0.01          0          0          0           0
Execute      5      0.00       0.04          0          0          0           0
Fetch        2      0.00       0.00          0         15          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       11      0.04       0.06          0         15          0           1

Misses in library cache during parse: 4
Misses in library cache during execute: 1
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       6        0.00          0.00
  SQL*Net message from client                     5       77.77        128.88

OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          2          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          2          0           1

Misses in library cache during parse: 1
    5  user  SQL statements in session.
    1  internal SQL statements in session.
    6  SQL statements in session.
********************************************************************************
Trace file: main_ora_27621.trc
Trace file compatibility: 9.00.01
Sort options: default
       1  session in tracefile.
       5  user  SQL statements in trace file.
       1  internal SQL statements in trace file.
       6  SQL statements in trace file.
       6  unique SQL statements in trace file.
      76  lines in trace file.
     128  elapsed seconds in trace file.

23.7 Views for Application Tracing

您可以使用数据字典和 V$ 视图来监视跟踪。

23.7.1 Views Relevant for Trace Statistics

您可以显示使用以下 V$ 和 DBA 视图收集的统计信息。

表 23-7 诊断视图

视图 描述
DBA_ENABLED_AGGREGATIONS 当前启用的统计信息的累积全局统计信息
V$CLIENT_STATS 指定客户端标识符的累积统计信息
V$SERVICE_STATS 指定服务的累计统计信息
V$SERV_MOD_ACT_STATS 指定服务、模块和操作的组合的累积统计信息
V$SERVICEMETRIC 数据库调用经过时间和 CPU 使用的累积统计信息
V$DIAG_TRACE_FILE 有关当前容器的 ADR 中所有跟踪文件的信息
V$DIAG_APP_TRACE_FILE 有关当前容器的 ADR 中包含应用程序跟踪数据(SQL_TRACE 或 OPTIMIZER_TRACE 事件数据)的所有跟踪文件的信息
V$DIAG_TRACE_FILE_CONTENTS ADR 中跟踪文件中的跟踪数据
V$DIAG_SQL_TRACE_RECORDS ADR 中跟踪文件中的 SQL_TRACE 数据
V$DIAG_OPT_TRACE_RECORDS ADR 中跟踪文件中的优化器跟踪事件数据
V$DIAG_SESS_SQL_TRACE_RECORDS 当前用户会话的 ADR 跟踪文件中的 SQL_TRACE 数据
V$DIAG_SESS_OPT_TRACE_RECORDS 当前用户会话的 ADR 跟踪文件中的优化器跟踪事件数据
V$DIAG_ALERT_EXT 当前容器的 ADR 中基于 XML 的警报日志的内容

23.7.2 Views Related to Enabling Tracing

Cloud Control 报告或 DBA_ENABLED_TRACES 视图可以显示未完成的跟踪。

在 DBA_ENABLED_TRACES 视图中,您可以确定有关如何启用跟踪的详细信息,包括跟踪类型。 跟踪类型指定是否为客户端标识符、会话、服务、数据库或服务、模块和操作的组合启用跟踪。

рекомендация

отblog.csdn.net/stevensxiao/article/details/128891358