DeepEdit!

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

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Первая неудачная попытка документирования V$SESSION_WAIT


Для того чтобы понять информацию об измерительных средствах ядра, представленную в этой книге и впервые опубликованную в 1992 г., по­требовалось много лет. Ранняя документация по Oracle, посвященная этой новой возможности, не всегда способствовала прояснению ситуа­ции. Например, в документе «Oracle7 Server Tuning guide» (Руковод­ство по настройке сервера Oracle7) приводился такой результат запроса к V$SESSION_WAIT [Oracle (1996)]:

SQL>
SELECT sid, event, wait_time
2
FROM v$session_wait

3
ORDER BY wait_time,
event;
SID
EVENT
WAIT_TIME
205
latch free
4294967295
207
latch free
4294967295
209
latch free
4294967295
215
latch free
4294967295
293
latch free
4294967295
294
latch free
4294967295
117
log file sync
4294967295
129
log file sync
4294967295
22
virtual circuit status
4294967295
Далее следовал совет: «Необычно большие значения времени ожидания для нескольких последних событий означают, что сеансы в данный мо­мент находятся в состоянии ожидания этого события [sic]. Как видите, в настоящий момент несколько сеансов ожидают освобождения защелок и синхронизации журнальных файлов». Если бы эти выводы были верны, то показанные в данном примере события находились бы в со­стоянии ожидания уже 1,36193 года. Тут что-то не так. Проблема возникла из-за отсутствия столбца STATE в списке выбора запро­са. Дело в том, что десятичное целое -1, представленное в виде 32-бит­ного шестнадцатеричного числа, выглядит так: ffffffff. Запишите его как 32-битное беззнаковое целое и получите 232 - 1 или 4 294 967 295. На самом деле показанные значения WAITTIME представляют собой -1. Это значение соответствует значению WAITED SHORT TIME (табл. 8.2) встолбце STATE. Каждое «необычно большое время ожидания» на самом деле представляет завершившееся событие, причем завершившееся настолько быстро, что измерения показали нулевую продолжительность в сотых долях секунды.
На раннем этапе множество авторов совершало подобные ошибки, пы­таясь объяснить, как следует интерпретировать новые данные о «собы­тиях» и «ожиданиях». Их оправдывает то, что они были пионерами, привлекшими множество сторонников новой технологии. Но безуслов­но, ошибки, подобные описанной здесь, особенно в официальной доку­ментации Oracle, затормозили распространение замечательных диагно­стических возможностей Oracle.

пока не наступит следующее измеряемое событие ожидания, и се­анс не установит снова значение в ноль. Приблизительно раз в три секунды процесс записи в журнал (LGWR) увеличивает значение SECONDS_IN_WAIT на 3. Учтите, что единицей измерения служат се­кунды, а не санти- и микросекунды.
События, вызывающие тайм-аут, несколько усложняют дело. На­пример, для события ожидания enqueue тайм-аут возникает через каждые две секунды даже для тех блокировок, которые длятся зна­чительно больше. При каждом тайм-ауте ядро Oracle увеличивает SEQ#, но не переустанавливает значение SECONDS_IN_WAIT.
STATE
В начале измеряемого события ожидания STATE принимает значе­ние WAITING. Это значение сохраняется вплоть до завершения собы­тия, после чего ядро устанавливает одно из значений, перечислен­ных в табл. 8.2.
Таблица 8.2. Описание значений столбцов STATE и WAIT_TIME представления V$SESSION_WAIT

STATE
WAIT_TIME
Описание
WAITED
UNKNOWN TIME
-2
Параметр сеанса TIMED_STATISTICS имел при завер­шении события значение FALSE, поэтому фактиче­ская продолжительность неизвестна.
WAITED SHORT TIME
-1
Событие ожидания завершено, но оно началось и закончилось в течение одного такта gettimeofday.
WAITING
0
Событие ожидания обрабатывается и пока не за­вершено.
WAITED KNOWN TIME
t>0
Событие ожидания завершилось, затратив t= t1-t0 сантисекунд фактического времени (см. главу 7).
Следующий запрос выводит гистограмму, показывающую, какими операциями заняты в настоящий момент сеансы системы:
Не указывайте условие WAIT_TIME=0 в запросе к V$SESSION_WAIT, если на самом деле подразумеваете STATE='WAITING'. У некоторых ана­литиков вошло в привычку считать, что утверждения WAIT_TIME=0
Приведенный запрос отображает данные о событиях ожидания, вы­полняющихся в данный момент в данной системе:  и STATE=' WAITING' эквивалентны, поскольку в Oracle7 и Oracle8i дело обстояло именно так. Однако в Oracle9i эти два предиката не равнозначны.
Ядро Oracle9i вычисляет WAIT_TIME как round(x$ksusecst.ksusstim/ 10000), а значение STATE - как результат DECODE от неокругленного значения KSUSSTIM. Следовательно, поле WAIT_TIME может содер­жать ноль при ненулевом исходном значении. Поэтому в ядре Oracle9i возможны ситуации, когда поле WAITTIME равно нулю, а поле STATE имеет значение, отличное от WAITING.

 









jAntivirus