Запускаем трассировку запроса.
alter session set max_dump_file_size=unlimited;
alter session set timed_statistics=true;
alter session set events '10046 trace name context forever, level 12';
select 'Hello, world; today is '||sysdate from dual;
exit;
=====================================================================================
Каждая из строк PARSE, EXEC и FETCH (WAIT) отражает выполнение одного вызова базы данных.
Другие статистические показатели:
p - количество блоков Oracle, полученных системными вызовами чтения
cr - обращения к кэшу буферов базы данных, для чтения в согласованном режиме
cu - обращения к кэшу буферов базы данных, для чтения в текущем режиме
mis - количество непопаданий в библиотечный кэш
r - количество возвращенных вызовом строк
tim - позволяет приблизительно оценить время, когда этот вызов был завершен
=====================================================================================
ERROR, UNMAP и SORT UNM
c -
Общее процессорное время, потраченное процессом Oracle в ходе
вызова. Oracle9i измеряет с в микросекундах (1 ис = 0,000001 се-
кунды). В более ранних версиях ядра значение с выражалось в со-
тых долях секунды.
e -
Фактическая продолжительность вызова. Oracle9i измеряет е в мик-
росекундах (1 цс = 0,000001 секунды). В более ранних версиях ядра
значение е выражалось в сотых долях секунды.
p -
Количество блоков базы данных Oracle, полученных вызовом за счет
обращения к дисковой подсистеме ОС. Предполагается, что р озна-
чает первую букву слова
ду, что не каждое так называемое <физическое> чтение Oracle обра-
щается к физическому дисковому устройству. Многие такие чтения
обслуживаются различными кэшами, расположенными между
ядром Oracle и физическим диском.
cr -
Количество блоков базы данных Oracle, полученных вызовом в ре-
жиме согласованного чтения из кэша буферов базы данных Oracle.
Чтение в согласованном режиме может потребовать дополнитель-
ных согласованных чтений из блоков отката, хранящихся в сегмен-
тах отката.
cu -
Количество блоков базы данных Oracle, полученных вызовом в режи-
ме текущего чтения из кэша буферов базы данных Oracle. Чтение
в текущем режиме - это просто чтение текущего содержимого блока.
mis -
Количество непопаданий в библиотечный кэш в ходе вызова. Ре-
зультатом каждого непопадания в библиотечный кэш является опе-
рация полного разбора (hard parse).
r - Количество строк, возвращаемых вызовом.
dep -
Рекурсивная глубина курсора. Курсор глубиной dep=n + 1 является
потомком некоторого курсора глубины dep=n (п = 0, 1, 2, ...).
робнее об этом рассказано ниже в разделе <Двойной учет рекурсив-
ного SQL> данной главы.
og -
1 ALL_R0WS
2 FIRST_ROWS
3 RULE
4 CHOOSE
=====================================================================================
Событие ожидания Oracle.
WAIT сообщает о продолжительности определенной последовательности инструкций,
выполняемой внутри процесса ядра Oracle.
nam -
Имя, присвоенное кем-то из разработчиков ядра Oracle для обозна-
чения того, какая часть ядра Oracle отвечает за данную часть време-
ни отклика.
ela -
Фактическое время, потраченное на исполнение названного события.
Oracle9i измеряет ela в микросекундах (1 цс = 0,000001 секунды).
В более ранних версиях ядра значение ela выражалось в сотых до-
лях секунды.
р1, р2, рЗ -
Значения данных параметров зависят от значения пат. Полный пе-
речень описаний параметров для всех типов событий можно полу-
чить, выполнив такой SQL-код:
select name, parameter"!, parameter2, parameter3
from v$event_name order by name
Cтроки WAIT появляются в файле трассировки до
строки того вызова базы данных, результатом которого является данное
событие ожидания.
=====================================================================================
Строки STAT содержат сведения о плане выполнения и времени отклика, выбранном
оптимизатором запросов Oracle для выполнения команд SQL.
=====================================================================================
Cтрока XCTEND появляется в том случае, когда исследуемое приложение выполняет
команду фиксации или отката.
=====================================================================================
Каждая лексема PARSING IN CURSOR указывает на рождение (или возрождение)
курсора.
Каждая строка файла трассировки соответствует одному <действию>,
выполненному процессом ядра Oracle. Имеющиеся в каждой строке
символы #ID идентифицируют курсор, согласно которому ядро выпол-
няло действие. Например, приведенная ниже строка соответствует вы-
борке по курсору #1:
FETCH #1:с=0,е=177,р=0,cr=1,cu=2,mis=0,r=1,dep=O,og=4,tim=1038931660054596
Строка, начинающаяся с лексемы ***, указывает системное время, полученное непосредственно
перед передачей строки *** в файл трассировки. Эта информация помогает аналитику по
производительности установить соответствие между показаниями времени tim в статистике Oracle.
Это удобно, потому что позволяет восстановить синхронизацию событий с фактическим временем
после больших интервалов строк WAIT, содержащих приблизительное истекшее время (ela), а не
значения внутренних часов (tim).
Строка, содержащая лексему SESSION ID: (m. л), идентифицирует строки файла трассировки,
следующие за ней, как относящиеся к сеансу Oracle с идентификатором V$SESSION.SID=m
и порядковым номером V$SESSION SERIAL#=n.
Сама строка PARSING IN CURSOR содержит информацию об идентификато-
ре курсора #ID. Текст между строкой PARSING IN CURSOR и соответствую-
щей строкой END OF STMT - это собственно SQL-текст курсора
len - Длина текста SQL.
dep -
Рекурсивная глубина курсора. Курсор глубиной dep=ra + 1 является
потомком некоторого курсора глубиной dep=n (п = 0,1, 2,...). Некото-
рые действия приводят к использованию рекурсивного SQL, напри-
мер вызовы базы данных, которым необходима информация из сло-
варя БД; команды, запускающие триггеры; PL/SQL-блоки, содер-
жащие команды SQL. В разделе <Двойной учет рекурсивного SQL>
далее в этой главе мы продолжим разговор о рекурсивных отноше-
ниях в SQL.
uid - Идентификатор пользователя, выполняющего разбор команды.
oct - Идентификатор типа команды Oracle [Oracle OCI (1999)].
lid -
Идентификатор пользователя, обладающего привилегиями. Так,
если пользователь FRED вызывает пакет, принадлежащий пользова-
телю JOE, то для команды SQL, выполненной внутри пакета, uid бу-
дет ссылаться на FRED, a lid - на JOE.
Проверка в Oracle версии 9 показала, что независимо от того, вы-
полнялась ли программа под привилегиями владельца или под при-
вилегиями вызвавшего ее пользователя, uid и lid в файле трасси-
ровки имеют одно и то же значение: идентификатор пользователя,
зарегистрировавшегося в системе и вызвавшего эту программу.
tim -
Если значение tim равно 0, значит, параметр инициализации T1MED_
STATISTICS имел значение FALSE в момент, когда должно было подсчи-
тываться время вызова. Таким образом, на основе значений tim мож-
но сделать вывод о том, какое значение имел параметр инициализа-
ции TIMED_STATISTICS. В процессе работы мы с коллегами пришли к
выводу о том, что конкретные ненулевые значения tim, относящиеся
к секциям PARSING IN CURSOR, не представляют особого интереса.
В Огас1е9г значение tim измеряется в микросекундах (1 ис = 0,000001
секунды). В некоторых системах (например, на наших Linux-серве-
рах) значения поля tim - это чистые значения gettimeofday. В дру-
гих системах (например, на наших Windows-компьютерах) проис-
хождение значений поля tim может быть весьма загадочным. В вер-
сиях, предшествующих Oracle9?, tim было значением V$TIMER. HSECS,
выраженным в сотых долях секунды.
hv -
Идентификатор команды SQL. Может показаться, что значение hv
уникально, но это не так Может случиться (хотя это бывает редко),
что разные тексты SQL имеют одинаковые значения hv.
ad - Адрес курсора в библиотечном кэше, как это показано в V$SQL.
=====================================================================================
когда ядро Oracle связывает значения с заполнителями в SQL-тексте приложе-
ния, то ядро выводит в файл трассировки секцию BIND. Номер,
следующий за словом
начиная с 0) переменной связывания в тексте SQL.
dty
Внешний тип данных значения, переданного приложением [Oracle
OCI (1999)]. В Oracle определены два набора типов данных: внут-
ренний и внешний. Определения внутреннего типа данных показы-
вают, каким образом ядро Oracle хранит свои данные в операцион-
ной системе, а определения внешнего типа - каким образом ядро
Oracle взаимодействует с SQL-кодом приложения.
Внешний тип данных переменной связывания весьма важен. Время
от времени встречаются команды SQL, для которых оптимизатор
запросов Oracle отказывается использовать индекс, безусловно, по-
могающий делу. Иногда это вызвано несоответствием типа столбца
типу значения, что может привести к выполнению для столбца
функции неявного приведения типа, что не позволит оптимизатору
выбрать данный индекс.
avl
Длина связываемого значения (в байтах).
value
Значение, которое передается в выполняемую команду. Ядро Oracle
может усекать значения, передаваемые в файл трассировки. По-
нять, что это произошло, несложно - усечение будет иметь место
всегда, когда значение avl превышает длину поля value.
Если значение value не попало в файл трассировки, значит, пере-
менная-заполнитель была связана со значением NULL. Так, в приве-
денном выше примере f nd_profile. get_specif ic отсутствие поля value
в секции bind 4 говорит о том, что приложение передало NULL в ка-
честве значения заполнителя :val. Это подтверждается нулевой
длиной (avl=OO) значения переменной связывания.
=====================================================================================
Если в момент закрытия курсора включена трассировка SQL уровня 1,
то ядро Oracle передает в файл трассировки по одной строке STAT для
Справочник по данным расширенной трассировки SQL 119
каждой операции над источником строк из плана выполнения запро-
са
id
Уникальный идентификатор операции над источником строк внут-
ри множества строк STAT.
cnt
Количество строк, возвращенных данной операцией над источни-
ком строк.
pid
Идентификатор операции, родительской по отношению к данной.
pos
Произвольное число - ничего лучше не придумать. Можно предпо-
ложить, что это значение могло бы определять <позицию> операции
над источником данных во множестве операций, принадлежащих
одному родителю, но похоже, что сестринские операции над источ-
ником данных упорядочены по возрастанию идентификаторов.
obj
Идентификатор объекта для операции над источником строк, если
операция выполняется над <базовым объектом>.1 Такие операции
над источником строк, как NESTED LOOPS, которые сами не обращают-
ся к базовому объекту, имеют obj =0. (Дочерние операции для NESTED
LOOPS обращаются к базовым объектам, но сама операция NESTED
LOOPS над источником данных этого не делает.)
op
Имя операции над источником данных. Начиная с версии Oracle
9.2.0.2.0, ядро передает дополнительную информацию в строки
STAT [Rivenes (2003)]. Новая информация включает в себя ряд по-
лезных характеристик для каждой операции над источником
строк, а именно:
cr - Количество чтений в согласованном режиме.
r - Количество блоков Oracle, прочитанных вызовами чтения ОС.
w - Количество блоков Oracle, записанных вызовами записи ОС.
time -
Фактическая длительность (в микросекундах).
Статистика для родительской операции над источником строк
включает в себя статистики для ее потомков.
=====================================================================================
Каждая строка XCTEND содержит следующие сведения о работе, выпол-
няемой в ходе фиксации или отката транзакции:
rlbk
Истина (1) - в том и только в том случае, если транзакция была от-
качена.
rd_only
Истина (1) - в том и только в том случае, если транзакция не изме-
нила никаких данных в базе данных.
=====================================================================================
Рекурсивный SQL - это SQL, соответствующий вызову базы данных,
значение dep которого больше нуля. Вызов базы данных глубиной
dep=n + 1 (п = О, 1, 2, ...) можно рассматривать как потомка какого-то
вызова базы данных со значением dep=ra