Поиск сведений о фиксированных представлениях V$ в публикациях об Oracle может оказаться нелегким делом. Иногда необходимая информация просто нигде не опубликована. Иногда она отыскивается, но оказывается неверной. Не следует слепо доверять публикациям по Oracle, относящимся к ядру, т. к. оно быстро развивается. К счастью, в том, что касается фиксированных представлений, ядро в некотором роде самодокументировано. Секрет заключается в правильном использовании V$FIXED_VIEW_DEFINITION. Самое сложное здесь - запомнить это имя:
Из представления V$FIXED_VIEW_DEFINITION я, например, узнал точные определения столбцов STATE и WAITTIME представления V$SESSION_WAIT. Это можно сделать при помощи нескольких простых шагов. Начнем с выполнения следующего запроса, возвращающего определение представления V$SESSION WAIT:
Кстати, заметьте, что значение VIEWNAME для этого представления хранится в верхнем регистре. Итак, теперь вы знаете, что V$SESSION_WAIT -это просто отображение GV$SESSION_WAIT. Хотя пока это вам мало о чем говорит. На следующем шаге выясним определение GV$SESSION_WAIT:
Вуаля! Здесь можно заметить операцию округления при вычислении WAITTIME. Из приведенного текста также видно, в каких единицах выражена величина, названная здесь X$KSUSECST.KSUSSTIM. Нам известно, что WAIT_TIME выражается в сотых долях секунды, также мы знаем, что ядро Oracle, чтобы получить сантисекунды, делит исходное значение на 104. Следовательно, в одной секунде содержится 10k единиц, причем 10k/104 = 102. Отсюда получаем 106 единиц KSUSSTIM в одной секунде. Другими словами, ядро Oracle измеряет время ожидания в микросекундах, а внешний API (V$SESSION_WAIT) представляет его в сантисекундах.
Написанный Джеффом Холтом сценарий htopsql.sql, приведенный в примере 8.2, - это тот инструмент, посредством которого мы в hot-sos.com можем быстро выяснить, какая команда SQL из находящихся в данный момент в библиотечном кэше вносит наибольший вклад в загрузку системы. Этот запрос напрямую не связан с временем отклика, но для большинства команд существует сильная корреляция между показателем LIO и полным временем выполнения SQL-запроса. Новые столбцы CPU_TIME и ELAPSEDTIME, появившиеся в Oracle9i, представляют в V$SQL сведения, ранее доступные только в данных трассировки SQL.
col
|
stmtid
|
heading
|
'Stmt Id'
|
format
|
9999999999
|
col
|
dr
|
heading
|
'PIO blks'
|
format
|
999,999,999
|
col
|
bg
|
heading
|
'LIOs'
|
format
|
999,999,999
|
col
|
sr
|
heading
|
'Sorts'
|
format
|
999,999
|
col
|
exe
|
heading
|
'Runs'
|
format
|
999,999,999
|
col
|
rp
|
heading
|
'Rows'
|
format
|
9,999,999,999
|
col
|
rpr
|
heading
|
'LIOs|per Row'
|
format
|
999,999,999
|
col
|
rpe
|
heading
|
'LIOs|per Run'
|
format
|
999,999,999
|
set
|
termout
|
on
|
|||
set
|
pause
|
on
|
|||
set
|
pagesize
|
30
|
|||
set
|
pause
|
'More: '
|
|||
set
|
linesize
|
95
|
Результат запроса отсортирован по количеству вызовов LIO, приходящихся на одну строку результата. Эта величина служит грубой оценкой эффективности команды. Например, представленные ниже данные должны вызвать вопрос: «Почему для получения пяти строк приложению требуется более 174 миллионов обращений к памяти?»
SQL> @htopsql More:
LIOs
|
LIOs
|
|||||
Stmt Id
|
PIO blks
|
LIOs
|
Rows
|
per Row
|
Runs
|
per Run
|
2503207570
|
39,736
|
871,467,231
|
5
|
174,293,446
|
138
|
6,314,980
|
1647785011
|
10,287,310
|
337,616,703
|
3
|
112,538,901
|
7,730,556
|
44
|
4085942203
|
45,748
|
257,887,860
|
8
|
32,235,983
|
138
|
1,868,753
|
3955802477
|
10,201
|
257,887,221
|
8
|
32,235,903
|
138
|
1,868,748
|
1647618855
|
53,136
|
5,625,843
|
0
|
5,625,843
|
128,868
|
44
|
3368205675
|
35,666
|
3,534,374
|
0
|
3,534,374
|
1
|
3,534,374
|
3722360728
|
54,348
|
722,866
|
1
|
722,866
|
1
|
722,866
|
497954690
|
54,332
|
722,779
|
0
|
722,779
|
1
|
722,779
|
90462217
|
361,189
|
4,050,206
|
8
|
506,276
|
137
|
29,564
|
299369270
|
1,268
|
382,211
|
0
|
382,211
|
42,378
|
9
|
Приведенные здесь данные помогли в 1999 году найти ту единственную команду SQL, которая потребляла почти 50% общего процессорного времени в системе оперативной обработки. Однако определение эффективности команд по количеству LIO на строку может, как и в случае с любым отношением, привести к неверным выводам. Рассмотрим, к примеру, такую команду SQL:
Этот запрос может вполне оправданно опросить множество блоков Oracle (даже с использованием индекса по первичному ключу CUSTID1), но вернет, как правило, только одну строку. Согласно отчету htopsql.sql, такой запрос неэффективен, хотя на самом деле такой негативный вывод может оказаться ошибочным.
Многие аналитики используют запросы, аналогичные htopsql.sql, в качестве первого шага в каждом проекте по повышению производительности. Однако попытка основать метод повышения производительности на каком-либо запросе к V$SQL чревата ошибками определения временной области и области операций. Как и в большинстве данных, получаемых из фиксированных представлений V$, в случае применения V$SQL трудно контролировать принадлежность данных определенному множеству программ на определенном интервале времени. Рассмотрим следующие ситуации:
Команда SQL, требующая первоочередного внимания, не выполнялась со времени расчета итогов последнего месяца. Команда отсутствует в библиотечном кэше и, следовательно, не попадет в сегодняшний отчет по V$SQL.
Команда SQL, признанная «самой неэффективной», входит в программу загрузки данных, которая в вашей компании никогда не будет использована повторно.
Команда SQL, признанная «самой неэффективной», выполняется между полуночью и тремя часами утра. Поскольку допустимое время выполнения продолжается до 6:00, а все ночные пакетные задания заканчиваются задолго до этого срока, медленное выполнение неэффективной команды SQL никого не беспокоит.
Команда SQL, производительность которой в наибольшей степени препятствует увеличению чистой прибыли, движению денежных потоков и возврату инвестиций, не попала в верхние строчки ни одного из отчетов по V$SQL. Она находится где-то в середине, т. к. ни один из ее статистических показателей особо не выделяется, но с точки зрения бизнеса именно она в наибольшей степени снижает экономическую эффективность системы.
Не обладая знаниями о бизнесе, невозможно решить, действительно ли критична для этого бизнеса производительность команды, расположившейся в верхних строчках отчета. Я уверен, что из всех фиксированных представлений V$SQL - самое ценное для аналитика по производительности. Однако эффект от применения этого представления в проекте повышения производительности существенно меньше, чем от Метода R.
< Предыдущая | Следующая > |
---|