Dsvolk > > Oracle > > Tuning > > App Tuning My Blog | Search | About
(Not Logged In)
[ welcome! ] [ news ] [ install ] [ jump-jet ] [ app ] [ rac ] [ papers ] [ dba ] [ dvp ] [ racdd4d ] [ oem ] [ statspack ] [ education ] [ tuning ] [ ias ] [ backup ] [ dataprotection ] [ security ] [ oid ] [ options ] [ integration ] [ sales ] [ sun ] [ linux ] [ consulting ] [ faq ]

Оптимизация приложений

Соглашение о материалах на этом сайте

Мой oracle blog
true dsvolk!
Как победить неразумных разработчиков  

Ниже я расскажу как можно в первом, самом простом приближении найти самые безобразные запросы и понять что с ними не так. Все гораздо умнее если использовать statspack. Но и сложнее :))

Способ номер 1, очень простой

Итак. Берем top и смотрим кто у нас использует процессор наиболее сильно. Если это процесс пользователя oracle надо бы убедиться что это не фоновый (background)  процесс (SMON, PMON, DBWR), а серверный. Потому что это совсем другая песня. Как их отличать  можно почитать здесь. Правило такое, если процесс потребляет более нескольких процентов (2-3%) cpu  на машине класса Sun 280-420 c одним процессором, то это потенциальный кандидат на тюнинг.

Дальше можно поступить просто. Берем  скрипт sinner.sql  Посмотрим что за запросы там идут. Но много это нам не скажет. Все равно придется смотреть план выполнения.  А это значит:

sh% sqlplus smap/smap

sql> set autotrace on;

sql> Ваш запрос здесь

Появиться план выполнения.

Анализируем это план. Но: это мы смогли поймать только тот запрос который оказался текущим для нашего процесса. К тому же этот замечательный скрипт работает не для всех версий Oracle. 

Есть следующие варианты команды autotrace:

SET AUTOTRACE OFF           - No AUTOTRACE report is generated. This is the
                              default.  
SET AUTOTRACE ON EXPLAIN    - The AUTOTRACE report shows only the optimizer
                              execution path. 
SET AUTOTRACE ON STATISTICS - The AUTOTRACE report shows only the SQL
                              statement execution statistics.  
SET AUTOTRACE ON            - The AUTOTRACE report includes both the
                              optimizer execution path and the SQL
                              statement execution statistics.  
SET AUTOTRACE TRACEONLY     - Like SET AUTOTRACE ON, but suppresses the
                              printing of the user's query output, if any. 

См. также описание Tom Kyte

Для того чтобы план выполнения заработал нужно чтобы была доступна таблица plan_table. Ее нужно создать скриптом $ORACLE_HOME/rdbms/admin/utlxplan.sql Под тем пользователем под которым вы собираетесь получать план запроса. Также нужно выдать пользователю роль plustrace

sh% sqlplus sys/manager

sql> grant plustrace to <username>

Если такой роли в БД не оказалось то код ее создания можно найти в каталоге $ORACLE_HOME/sqlplus/admin/plustrce.sql

Способ номер 2, несложный

Если хотим знать больше про запрос или скажем их у нас сразу много (в процедуре), то вместо autotrace мы можем получить dump статистики работы нашего запроса в файле и позднее обработать ее программой tkprof (см. ниже) 

Чтобы включить в этот dump файл времена выполнения, установим на уровне сервера сбор этой статистики:

sh% sqlplus sys/manager

sql> alter system set timed_statistics=true;

Это нужно сделать один раз из любой, не обязательно текущей сессии. Это установка действует на инстанс целиком. 

Теперь дадим команду на сбор статистики. 

sql>alter session set sql_trace=true

или 

sql>ALTER SESSION set events '10046 trace name context forever, level 8'

Цифра означает следующие:

0 turn tracing off
1 basic tracing (equivalent to ALTER SESSION set sql_trace TRUE)
4 include bind information in the trace
8 include event wait statistics in the trace
12 include both event and bind statistics in the trace

Это приведет к тому, что на сервере начнет формироваться файл, который можно обработать утилитой tkprof (описано чуть ниже). Файл будет находиться в директории udump и иметь вид ora_<pid>.trc

Следим за чужими сессиями

В предыдущих разделах подразумевалось что мы исследуем запрос в нашей же сессии. Но что если нам нужно проследить за чужой сессией ?

Вообще-то я все оформил в виде perl скрипта. Собственно, далее я вольно его пересказываю :) Если у Вас есть IAS, то значит perl и все необходимые модули у Вас также есть.

Смотрим pid процесса и на всякий случай его parent pid или child pid. Запускаем их в запрос вида: 

select s.sid, s.serial#, p.spid from v$session s, v$process p
where p.spid = ? or p.spid = ? and s.paddr = p.addr

Получаем важную вещь: sid и serial. 

Тогда под пользователем sys в sqlplus запускаем пакет dbms_system

sql> sys.dbms_system.set_sql_trace_in_session(<SID>, <SERIAL>, TRUE);

где sid и serial получены на предыдущем шаге. 

Даем нашему процессу поработать. Все что он сделает начиная с этого момента будет сложено в trace файл на сервере БД. Trace файл находится в директории, задаваемой параметром user_dump_dest в init.ora. 

Нашли файл, скажем отсортировав их по времени, теперь пришло время обработки. 

Обработка данных

Запускаем утилиту tkprof

sh% tkprof <file_to_trace> < outfile> explain=user/passwd sort=exedsk sys=no

Где user/passwd имя пользователя владельца схемы по которой выполнялся запрос. Тогда в получившемся файле будут планы выполнения. Полный синтаксис tkprof описан в документации в разделе Using SQL Trace and Tkprof.

Давайте на примере посмотрим что как. В качестве примера взят реальный файл одного из клиентов. 

Хотите все сами ?

http://technet.oracle.com/doc/oracle8i_816/server.816/a76992/ch14_str.htm#1018

Здесь формально написано даже лучше чем у меня: http://www.oreview.com/9604har.htm Рекомендую к прочтению!

Оказывается, что для определенных случаев удобно пользоваться даже не tkprof, а trcanlzr. Почитайте, это может быть любопытно. 

Dsvolk > > Oracle > > Tuning > > App Tuning Last Modified: 28-08-2003 12:17