(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Как проследить за выполнением программ в Oracle

И азъ же иного не имам чим чтити его, но развее пишу дабрая его деяния..
Смиренного инока Фомы слово похвальное о благоверном великом князе Борисе Андреевиче.

Аннотация

Рассматривается применение пакета DBMS_PROFILER для отслеживания работы приложения. Показано, как можно пользоваться пакетом для определения того, какие строки прикладных программ исполнялись, сколько раз, и сколько на их выполнение ушло времени.

Введение

В разработке и в эксплуатации приложений иногда возникает желание отследить, что делает приложение и сколько при выполнении расходуется ресурсов СУБД. При разработке для этой цели можно употребить диалоговый отладчик из числа нескольких популярных (SQL Developer, TOAD и др.). Но если есть уже готовое приложение или требуется автоматизация, диалоговый отладчик не годится. Для таких случаев есть иное решение: использование системных пакетов из состава ПО Oracle, DBMS_PROFILER и DBMS_TRACE.

Основная разница между последними двумя в том, что пакет DBMS_PROFILER сведения о выполнении программ размещает в таблицах БД, а пакет DBMS_TRACE - в трассировочные файлы сеанса. Есть, конечно, и определенные функциональные различия.

Здесь рассказывается о слежении за выполнением приложения с помощью пакета DBMS_PROFILER. Показано, как им можно пользоваться непосредственно, однако заочно читатель, возможно, с этим пакетом уже знаком: обращения к нему нередко встроены в системы диалоговой разработки для PL/SQL. 

Пакет DBMS _ PROFILER

Две функции пакета (существующие также в варианте процедур), имена которых характеризуют способ их употребления: 

Функция

Описание

START_PROFILER

Стартует создание профиля текущего сеанса. Профиль будет сохранен в специальных таблицах. При старте профиль можно именовать.

STOP_PROFILER

Завершает профилирование сеанса

Профиль исполняемых в промежутке между их вызовами подпрограмм автоматически фиксируется в особых служебных таблицах. Просмотр профилей - путем запрашивания данных этих таблиц.

Употребление пакета обеспечивается следующими файлами: 

Файл

Описание

dbmspbp.sql [rdbms]

Создает внешнее определение пакета DBMS_PROFILER

prvtpbp.sql [rdbms]

Создает тело пакета DBMS_PROFILER (текст файла - объектный код вместо исходного)

profload.sql [rdbms]

Запускает файлы dbmspbp.sql и prvtpbp.sql и делает необходимые проверки. Должен выполняться от имени SYS.

proftab.sql [rdbms]

Сценарий создания рабочих таблиц для сбора данные профилей исполнения подпрограмм на PL/SQL:

          - PLSQL_PROFILER_RUNS

          - PLSQL_PROFILER_UNITS

          - PLSQL_PROFILER_DATA

 и создания генератора номеров PLSQL_PROFILER_RUNNUMBER

profrep.sql [pls]

Создает набор производных таблиц и пакет PROF_REPORT_UTILITIES, который можно использовать для более удобного извлечения информации из рабочих таблиц.

profsum.sql [pls]

Набор специальных запросов к данным профиля с использованием попрограмм из PROF_REPORT_UTILITIES.

profdemo.sql [pls]

Демонстрационный пример употребления.

[rdbms] Файл находится в %ORACLE_HOME%\rdbms\admin.

[pls] Файл находится в % ORACLE _HOME %\plsql \demo.

Ниже описаны действия в SQL*Plus, выполняемые на сервере (поскольку там находится ПО Oracle с используемыми в примере сценариями). Собственно использование пакета, естественно, возможно и на клиенте. 

Подготовка к работе с пакетом

Установка пакета DBMS_PROFILER от имени SYS с выполнением необходимых проверок: 

CONNECT / AS SYSDBA

@?/rdbms/admin/profload

Создание таблиц для хранения служебных данных о прогонах программ: 

CONNECT scott/tiger

@?/rdbms/admin/proftab 

Пример употребления

Создадим пару простых процедур:

CREATE OR REPLACE PROCEDURE first

AS

n NUMBER := 1;

BEGIN

FOR i IN 1 .. 1000 LOOP

   n := n + 1;

END LOOP;

END;

/

CREATE OR REPLACE PROCEDURE second

AS

BEGIN

DBMS_OUTPUT.PUT_LINE ( SIN ( 1 ) );

first;

END;

/

Обратите внимание:

-         процедура SECOND обращается к FIRST

-         в текстах имеются пустые строки

-         в процедуре SECOND есть обращение к «системной» функции SIN и к «встроенному» пакету DBMS_OUTPUT.

Создание профиля работы (состоящей из поочередного выполнения двух процедур): 

EXECUTE dbms_profiler.start_profiler ( 'Run@ ' // SYSTIMESTAMP )

EXECUTE first

EXECUTE second

EXECUTE dbms_profiler.stop_profiler

Профиль работы получил собственный номер. Его можно выявить запросом:

COLUMN run_comment FORMAT A60  WORD
COLUMN runid       FORMAT 9999
SELECT

  runid

, run_comment

, run_date 

FROM
  plsql_profiler_runs

ORDER BY

  runid

, run_date

;

Этот текст удобно разместить в файле, например seeprofiles.sql в текущем каталоге. 

Полученный так номер используется в запросе собственно профиля, например в таком: 

SET VERIFY OFF

COLUMN owner   FORMAT A10

COLUMN name    FORMAT A10

COLUMN text    FORMAT A45   WORD

COLUMN line    FORMAT 999

COLUMN occured FORMAT 99999

SELECT

  u.unit_owner                     AS owner

, u.unit_name                      AS name

, s.line

, total_occur occured

, TRUNC ( d.total_time / 1000000 ) AS "TIME(ms)"

, s.text

FROM

  all_source           s

, plsql_profiler_data  d

, plsql_profiler_units u

WHERE

    u.runid       = &1

AND u.runid       = d.runid

AND u.unit_number = d.unit_number

AND s.name        = u.unit_name

AND s.type        = u.unit_type

AND s.line        = d.line#

ORDER BY

  unit_owner

, name

, line

;

SET VERIFY ON

В этом примере SQL*Plus запросит номер в диалоге.

Приведенный текст удобно разместить в файле, например seeprofile .sql в текущем каталоге. 

Пример употребления запросов о профиле может выглядеть так: 

SQL> @seeprofiles 

RUNID RUN_COMMENT                                          RUN_DATE

----- ---------------------------------------------------- ---------

   10 Run@ 17-JAN-07 03.56.55.613000000 PM +03:00          17-JAN-07

 1 rows selected. 

SQL> @seeprofile 10 

OWNER  NAME   LINE OCCURED TIME(ms) TEXT

------ ------ ---- ------- -------- -----------------------------------

SCOTT  FIRST     1       0        3 PROCEDURE first

SCOTT  FIRST     3       2        0 n NUMBER := 1;

SCOTT  FIRST     6    2002      105 FOR i IN 1 .. 1000 LOOP

SCOTT  FIRST     7    2000      194 n := n + 1;

SCOTT  FIRST     9       2       17 END;

SCOTT  SECOND    1       0        3 PROCEDURE second

SCOTT  SECOND    5       1     6108 DBMS_OUTPUT.PUT_LINE ( SIN ( 1 ) );

SCOTT  SECOND    6       2        3 first;

SCOTT  SECOND    7       1        0 END;

9 rows selected. 

Другие возможности

Если собирается профиль по большому заданию, количество строк в запросе выше может оказаться велико. В таких случаях можно построить другой запрос, отобрав только сведения о строках подпрограмм, исполнявшихся чаще остальных, либо же дольше всех остальных исполнявшихся.

Столбцы таблиц с данными профилей (PLSQL_PROFILER_RUNS, PLSQL_PROFILER_UNITS, PLSQL_PROFILER_DATA) содержат и другую полезную информацию, например: 

PLSQL_PROFILER_RUNS.RUN_TOTAL_TIME

PLSQL_PROFILER_RUNS.RUN_COMMENT

Общее время работы задания

Комментарий пользователя

PLSQL_PROFILER_UNITS.TOTAL_TIME

PLSQL_PROFILER_UNITS.UNIT_TIMESTAMP

Общее время работы подпрограммы

Момент трансляции подпрограммы (для учета смены версий)

PLSQL_PROFILER_DATA.MIN_TIME

PLSQL_PROFILER_DATA.MAX_TIME

Минимальное и максимальное время исполнения конкретной строки

Эти поля также можно использовать в запросах для получения более общих или более подробных сведений.

Запуск профилирования действий пользователя можно сделать автоматическим, если включить обращение к DBMS_PROFILER.START_PROFILER в тело триггерной процедуры AFTER LOGON. 

Эксплуатация

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

Чистка таблиц, ввиду имеющихся связей, выполняется определенном порядке:

DELETE FROM plsql_profiler_data;
DELETE FROM plsql_profiler_units;
DELETE FROM plsql_profiler_runs;

Эту последовательность тоже удобно оформить в виде сценария, либо процедуры.

Таблицы создаются в умолчательном табличном пространстве пользователя. Возможно вы захотите перенести их в иное место.

Наконец, для таблиц с данными профилей и генератора номеров можно создать особую схему, одну на всю БД, предоставив пользователям свободный к ней доступ при помощи публичных синонимов. Доступ к только «собственным» строкам в общих таблицах PLSQL_PROFILER_* при желании можно ограничить средствами «виртуальных частных БД» (средством избирательного доступа к данным таблиц).

Если вы ведете активную коллективную разработку приложения, то вся эта организаторская работа окупится.

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 30.01.2007 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Oracle Database Personal Edition Named User Plus Software Update License & Support
Oracle Database Standard Edition 2 Processor License
Oracle Database Standard Edition 2 Named User Plus License
Oracle Database Personal Edition Named User Plus License
Microsoft Windows Professional 10, Электронный ключ
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Реестр Windows. Секреты работы на компьютере
СУБД Oracle "с нуля"
Мир OLAP и Business Intelligence: новости, статьи, обзоры
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100