OSzone.net
 
s  

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

СУБД » Oracle » Как проследить за выполнением программ в Oracle
В избранное | Версия для печати | Посетителей: 1857 | Просмотров: 2523 (сегодня 3)   Текущий рейтинг: 1.9 (проголосовало 10)

Рассматривается применение пакета 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_* при желании можно ограничить средствами “виртуальных частных БД” (средством избирательного доступа к данным таблиц).

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


Автор: Владимир Пржиялковский
Иcточник: www.ccas.ru/prz
Опубликована - 04.04.2007

Оценить статью

Вверх

Популярные статьи раздела «СУБД»Лучшие статьи раздела «СУБД»
  1. Пятнадцать вещей об Oracle, от которых должны отучиться АБД
  2. Оптимизация производительности ЦП SQL Server
  3. Оптимизация производительности запросов SQL Server
  4. Резервное копирование баз MySQL
  5. Анатомия Oracle BI Server & Oracle BI Suite EE
  1. Пятнадцать вещей об Oracle, от которых должны отучиться АБД
  2. О грамотном использовании БД MySQL

Популярные темы форума OSzone.net

Последние добавления в каталог программ


s



Блоги Microsoft для ИТ-специалистов: RSS

Рассылка на Mail.ru

Windows All. Вопросы и ответы
Windows Vista. Вопросы и ответы


[AD] Rambler's Top100