Несмотря на недостатки, фиксированные представления Oracle во многих случаях представляют ценность для аналитика по производительности. В этом разделе описан ряд представлений, понимание которых необходимо аналитику. Все представленные здесь описания объектов относятся к версии Oracle 9.0.1.0.0.
Не исключено, что самое важное из фиксированных представлений для аналитика по производительности - это V$SQL. Оно показывает несколько важных характеристик команд SQL, чьи заголовки в данный момент находятся в разделяемом пуле. Представление содержит следующие столбцы:
SQL> desc v$sql
|
|
Name
|
Null? Type
|
SQL_TEXT
|
VARCHAR2(1000)
|
SHARABLE_MEM
|
NUMBER
|
PERSISTENT_MEM
|
NUMBER
|
RUNTIME_MEM
|
NUMBER
|
SORTS
|
NUMBER
|
LOADED_VERSIONS
|
NUMBER
|
OPEN_VERSIONS
|
NUMBER
|
USERS_OPENING
|
NUMBER
|
EXECUTIONS
|
NUMBER
|
USERS_EXECUTING
|
NUMBER
|
LOADS
|
NUMBER
|
FIRST_LOAD_TIME
|
VARCHAR2(19)
|
INVALIDATIONS
|
NUMBER
|
PARSE_CALLS
|
NUMBER
|
DISK_READS
|
NUMBER
|
BUFFER_GETS
|
NUMBER
|
ROWS_PROCESSED
|
NUMBER
|
COMMAND_TYPE
|
NUMBER
|
OPTIMIZER_MODE
|
VARCHAR2(10)
|
OPTIMIZER_COST
|
NUMBER
|
PARSING_USER_ID
|
NUMBER
|
PARSING_SCHEMA_ID
|
NUMBER
|
KEPT_VERSIONS
|
NUMBER
|
ADDRESS
|
RAW(4)
|
TYPE_CHK_HEAP
|
RAW(4)
|
HASH_VALUE
|
NUMBER
|
PLAN_HASH_VALUE
|
NUMBER
|
CHILD_NUMBER
|
NUMBER
|
MODULE
|
VARCHAR2(64)
|
MODULE_HASH
|
NUMBER
|
ACTION
|
VARCHAR2(64)
|
ACTION_HASH
|
NUMBER
|
SERIALIZABLE_ABORTS
|
NUMBER
|
OUTLINE_CATEGORY
|
VARCHAR2(64)
|
CPU_TIME
|
NUMBER
|
ELAPSED_TIME
|
NUMBER
|
OUTLINE_SID
|
NUMBER
|
CHILD_ADDRESS
|
RAW(4)
|
SQLTYPE
|
NUMBER
|
REMOTE
|
VARCHAR2(1)
|
OBJECT_STATUS
|
VARCHAR2(19)
|
LITERAL_HASH_VALUE
|
NUMBER
|
LAST_LOAD_TIME
|
VARCHAR2(19)
|
IS_OBSOLETE
|
VARCHAR2(1)
|
Можно даже посмотреть, как применение переменных связывания влияет на эффективность команд SQL:
В этом запросе :len указывает длину префикса текста SQL, по которому определяется «схожесть» двух различных команд. Например, при
Представление V$SQL позволяет ранжировать команды SQL по объему выполняемой работы или по любому другому критерию эффективности (см. раздел «Обнаружение неэффективного SQL» ниже в этой главе). Запрос к V$SQLTEXT_WITH_NEWLINES обеспечивает получение полного текста команды SQL, а не только первых 1000 байт, хранящихся в V$SQL. SQL TEXT:
:len=8, строки select salary,... и select s.program,... считаются похожими, т. к. первые восемь символов в них совпадают. Обычно интересные результаты получаются при таких значениях, как 32, 64 и 128. Значение :threshold определяет допустимое количество похожих команд в библиотечном кэше. Как правило, значение threshold равно трем или больше, потому что наличие всего двух схожих команд SQL в библиотечном кэше не вызывает проблем. Если система выходит из-под контроля во время работы с разделяемым SQL, то можно увеличить
:threshold, чтобы поначалу сосредоточиться на исправлении лишь нескольких неразделяемых команд.
V$SESS_IO - это простое фиксированное представление, позволяющее измерить логический и так называемый физический ввод/вывод, по-
Информация в V$SESS_IO хорошо коррелирует co статистическими данными расширенной трассировки SQL:
BLOCK_GETS
Соответствует статистике cu необработанных трассировочных данных.
CONSISTENT_GETS
Соответствует статистике cr необработанных трассировочных данных.
PHYSICAL_READS
Соответствует статистике p необработанных трассировочных данных.
Количество операций логического ввода/вывода (LIO) равно сумме
значений BLOCK_GETS и CONSISTENT_GETS. Когда сеанс Oracle потребляет
очень много процессорного времени, а регистрируемые события ожидания возникают лишь изредка, возникает ощущение, что трассировка сеанса «замирает». Периодическое исполнение приведенного ниже запроса позволяет следить, выполняет ли сеанс вызовы LIO в те моменты, когда не генерируются данные трассировки:
select block_gets, consistent_gets from v$sess_io where sid=:sid
Фиксированное представление V$SYSSTAT - одно из первых, которые мне довелось применять. Его структура проста:
SQL> desc v$sysstat
Каждая строка V$SYSSTAT содержит одну из статистик уровня экземпляра. Большинство из них - это счетчики выполнения операций с момента последнего старта экземпляра. Строки V$SYSSTAT подвержены влиянию ошибок переполнения.
Денормализованная структура V$SYSSTAT позволяет легко, не устанавливая соединений, определить, что происходило в системе с момента последнего запуска экземпляра. Приведенный ниже запрос, выполненный в Oracle9i, показывает примерно 250 значений, описывающих деятельность экземпляра на протяжении его жизни:
select name, value from v$sysstat order by 1
Следующий запрос выводит ряд значений статистики, имеющих отношение к разбору:
select name, value from v$sysstat where name like 'parse%'
Как уже говорилось в главе 3, при сборе диагностических данных область операций, как правило, не должна распространяться на всю систему. Представление V$SESSTAT содержит те же статистические данные, что и V$SYSSTAT, но применительно к сеансам:
Каждая строка V$SESSTAT содержит счетчик, показывающий, сколько раз выполнялось приращение соответствующей статистики с момента создания сеанса.
Представление V$SESSTAT в отличие от V$SYSSTAT не денормализовано, поэтому для получения наименования статистики необходимо соединение с V$STATNAME. Приведенный запрос показывает все статистики, собранные для сеанса с момента его рождения:
Следующий запрос выводит приблизительное количество процессор ного времени (в сотых долях секунды), израсходованного данным се ансом:
Фиксированное представление V$SYSTEM_EVENT содержит агрегированную статистику о выполнении кода, оснащенного средствами измерения, с момента последнего запуска экземпляра:
Каждая строка V$SYSTEM_EVENT содержит информацию о возникновении определенного события за время жизни экземпляра.
Можно заметить, что в V$SYSTEM_EVENT нет столбца MAX_WAIT. Этот полезный столбец при желании можно добавить к определению V$SYSTEM_EVENT, следуя инструкциям, приведенным в [Lewis (2001b) 577-581].
Oracle7 и Oracle8i позволяют получить статистику потребления всех ресурсов, за исключением ЦПУ, с помощью такого запроса:
В Oracle9i ту же статистику, выраженную в микросекундах, дает следующий запрос:
Еще раз напомню, что при сборе диагностических данных область операций, как правило, не должна включать в себя всю систему. Представление V$SESSION_EVENT позволяет получать диагностические данные о выполнении различных участков кода ядра для определенного сеанса:
Каждая строка V$SESSION_EVENT содержит информацию о выполнении определенного участка кода ядра Oracle («событий ожидания») для заданного сеанса с момента его рождения. Таким образом, V$SESSION_EVENT содержит агрегированные значения данных, получаемых при расширенной трассировке SQL:
EVENT
Имя события ожидания Oracle. Обратите внимание, что все значения EVENT соответствуют значениям nam в строках WAIT расширенной трассировки.
TOTAL_WAITS
Количество строк WAIT, содержащих nam='x', где x - значение поля EVENT данной строки.
TIMEWAITED
Сумма значений ela для всех строк WAIT, содержащих nam='x', где x -значение поля EVENT данной строки.
Фиксированное представление V$SESSION_EVENT не содержит записей о потреблении сеансом процессорного времени. За этими данными придется обращаться к V$SESSTAT.
Данные о событиях ожидания, произошедших за время существования указанного сеанса Oracle9i, можно получить таким запросом:
Следующий запрос выводит данные о событиях ожидания, произошедших за время существования указанного сеанса Oracle8i:
Если вы спросите кого-нибудь, что такое «интерфейс ожидания», то, скорее всего, вам расскажут о V$SESSION_WAIT. В отличие от фиксированных представлений V$SYSTEM_EVENT и V$SESSION_EVENT, V$SESSION_WAIT
не накапливает данные об имевших место событиях. Зато оно позволяет увидеть, чем занимается указанный сеанс в данный момент:
SQL> desc v$session_wait
Name
|
Null? Type
|
SID
|
NUMBER
|
SEQ#
|
NUMBER
|
EVENT
|
VARCHAR2(64)
|
P1TEXT
|
VARCHAR2(64)
|
P1
|
NUMBER
|
P1RAW
|
RAW(4)
|
P2TEXT
|
VARCHAR2(64)
|
P2
|
NUMBER
|
P2RAW
|
RAW(4)
|
P3TEXT
|
VARCHAR2(64)
|
P3
|
NUMBER
|
P3RAW
|
RAW(4)
|
WAIT_TIME
|
NUMBER
|
SECONDS_IN_WAIT
|
NUMBER
|
STATE
|
VARCHAR2(19)
|
Строки V$SESSION_WAIT содержат информацию о текущем состоянии сеанса. Предлагаемая V$SESSION_WAIT статистика включает:
SEQ#
Каждый раз при завершении события ядро Oracle последовательно увеличивает это значение.
WAIT_TIME
В начале измеряемого события ожидания ядро Oracle обнуляет значение WAIT_TIME. Оно остается нулевым вплоть до завершения данного события, когда ядро присваивает ему одно из значений, приведенных в табл. 8.2. Учтите, что в качестве единицы измерения выступает сотая доля секунды, даже в Oracle9i. Столбца WAIT_TIME_MICRO нет, по крайней мере, в версиях до 9.2.0.2.1 включительно, хотя значения WAIT_TIME получены из представленных в микросекундах значений представления X$.
SECONDS_IN_WAIT
В начале измеряемого события ожидания ядро Oracle обнуляет значение SECONDS_IN_WAIT. Сам сеанс никогда не изменяет это значение
< Предыдущая | Следующая > |
---|