Программирование >>  Oracle 

1 ... 175 176 177 [ 178 ] 179 180 181 ... 469


Стратегии и средства настройки 5 6 5

Поле Значение

ela Реальное время ожидания события в сотых долях секунды.

р1, р2, рЗ Параметры ожидаемого события. Каждое событие имеет определенный набор параметров. Значение параметров р1, р2 и рЗ для конкретного события см. в руководстве Oracie Server Reference

Теперь можно переходить к первому реальному оператору в трассировочном файле:

PARSING IN CURSOR #3 len=110 dep=0 uid=54 oct=47 lid-54 tim=6185026 hv=2018962105

ad=31991c8 declare

l empno number default 7698;

begin

update emp set ename = lower(ename) where empno = l empno;

end;

END OF STMT

PARSE #3:c=0,e=0,p=0,cr=0,cu=O,mis=l,r=0,dep=O,og=4,tim=6185026

BINDS #3:

Мы видим блок кода PL/SQL в том виде, в каком мы его передали. По записи PARSE можно понять, что разобран он был очень быстро, хотя и не был найден в библиотечном кэше (MIS = 1). Далее идет запись BINDS без детальной информации, поскольку в переданном блоке кода не использовались связываемые переменные. В дальнейшем мы еще вернемся к этой записи. Переходим к следующему оператору в трассировочном файле, где уже можно обнаружить кое-что интересное:

len-51 dep=l uid=54 oct = 6 lid=54

tim=6185026

WHESE EMINO

Pacing in cursor

hv=2518517322

ad=318e29cUPDATE END OF

Pa #4:c=0,e = 0,p = 0,cr=0,cu = O,mis=l,r=0,dep=l,og=0,tim=6185026 BINDS #4:

bind 0: dty=2 mxl=22(21) mal=00 scl = 00 pre=00 oacflg = 03 oacfl2 = l offset=0

bfp=07425360 bln=22

avl=03 flg=05

value=7698

WAIT

nam=enqueue

ela=

pl=1415053318

p2-393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

WAIT

nam=enqueue

ela=

pl=1415053318

p2=393290

p3=2947

size = 24



Глава 10

WAIT #4: nam=enqueue ela= 308 pl=1415053318 p2=393290 p3=2947

WAIT #4: nam=enqueue ela= 307 р1=1415053318 р2=393290 p3=2947

WAIT #4: nam=enqueue ela= 308 pl=1415053318 p2=393290 p3=2947

WAIT #4: nam=enqueue ela= 307 pl=1415053318 p2=393290 p3=2947

WAIT #4: nam=enqueue ela= 308 pl=1415053318 p2=393290 p3=2947

WAIT #4: nam=enqueue ela= 198 pl-1415053318 p2=393290 p3=2947

EXEC #4:c=0,e=5425,p=0,cr=17,cu=8,mis=0,r=l,dep=l,og=4,tim=6190451

EXEC #3:c=0,e=5425,p=0,cr=17,cu=8,mis=0,r=l,dep=0,og=4,tim=6190451

WAIT #3: nam=SQL*Net message to client ela= 0 pl=111183897 6 p2=l p3=0

WAIT #3: nam=SQL*Net message from client ela= 0 pl=1111838976 p2=l p3=0

Представлен оператор UPDATE в том виде, как его получил сервер Oracle. Он отличается от того, который использовался в PL/SQL-блоке, а именно: ссылка на l empno (переменная) заменена связываемой переменной. Перед выполнением SQL-оператора PL/SQL-машина заменяет в нем все вхождения локальных переменн1х связываемыми переменными. Кроме того, по записи PARSING IN CURSOR можно понять, что рекурсивная глубина (dep) теперь - 1, а не 0, как у исходного блока PL/SQL. Понятно, что это SQL-оператор, выполненный каким-то другим SQL- или PL/SQL-оператором; он не передавался клиентским приложением на сервер. Этот флаг можно использовать для поиска соответствующего SQL-оператора. Если поле dep имеет ненулевое значение, значит, выполнение SQL-оператора инициировано сервером, а не клиентским приложением. Это можно учесть при настройке. SQL-оператор, выполнение которого инициировано сервером, легко изменить без изменения приложения. Для изменения SQL-оператора, посылаемого клиентским приложением, необходимо найти соответствующее приложение, изменить код, перекомпилировать и снова установить его. Чем больше SQL-операторов находится на сервере, тем лучше - их можно изменить, не изменяя само приложение.

Для этого оператора тоже выдана запись BINDS, причем с детальной информацией. Наш оператор изменения содержит связываемую переменную, и можно явно узнать ее значение - первая связываемая переменная имела значение 7698. Теперь, если бы этот запрос был проблемным (выполнялся бы медленно), то имеется вся необходимая для его настройки информация. Есть точный текст запроса. Известны значения связывае-м1х переменных (так что можно повторно выполнить его с теми же данными). Известно даже, ожидание каких событий замедлило выполнение. Не хватает только плана выполнения запроса, но это лишь потому, что мы до него еще не дошли.

Запись BIND в трассировочном файле содержит следующую информацию:

Поле

Значение

cursor #

Номер курсора.

bind N

Позиция связываемой переменной (0 - первая связываемая

переменная).

Тип данных (см. ниже).

Максимальная длина связываемой переменной.

Максимальная длина массива (при связывании массивов или

множественных операциях).



Стратегии и средства настройки 5 6 7

Поле

Значение

Масштаб.

Точность.

oacflg

Внутренние флаги. Если это число - нечетное, связываемая переменная

может иметь пустое значение (допускается значение NULL).

oacfl2

Продолжение внутренних флагов.

size

Размер буфера.

offset

Используется при частичных связываниях.

Адрес связывания.

Длина буфера связывания.

Длина фактического значения.

flag

Внутренние флаги.

value

Представление связываемого значения в виде строки (может быть

шестнадцатиричным представлением двоичных данных) - именно это

нам и надо!

Значение dty (тип данных) можно декодировать с помощью информации из представления USER TAB COLUMNS. Если выбрать из представления all views текст представления, для которого view name = USER VIEWS, можно увидеть функцию декодирования, сопоставляющую значениям dty строковые названия типов.

Интересующая нас информация - информация об ожиданиях - найдена. Можно четко увидеть, почему выполнение изменения потребовало почти минуту реального времени, хотя процессорное время, необходимое для этого, пренебрежимо мало. Мы ожидали снятия блокировки: в главах 3 и 4 было описано, что enqueue - один из двух внутренних механизмов, используемых сервером Oracle для поочередного доступа к разделяемым ресурсам. Трассировочный файл показывает, что мы ждали снятия блокировки, т.е. мы не ждали завершения ввода/вывода, синхронизации журнального файла или освобождения буфера, - мы стояли в очереди в ожидании освобождения некоторого ресурса. Если пойти дальше, можно взять значение параметра p1 и получить по нему тип блокировки, снятия которой пришлось ждать. Вот как это можно сделать:

(kjte@TKE816> create or replace

2 function enqueue decode(l pl in number) return varchar2

3 as

4 l str varchar2(25);

5 begin

6 select chr(bitand(l pl,-16777216)/16777215)

7 chr(bitand(l pl, 16711680)/65535)

8 decode (bitand(l pl, 65535),

9 0, No lock,

10 1, No lock,

11 2, Row-Share,

12 3, Row-Exclusive,

13 4, Share,



1 ... 175 176 177 [ 178 ] 179 180 181 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика