Як простежити за виконанням програм в 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% dbmsadmin.


[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_ * при бажанні можна обмежити засобами «віртуальних приватних БД» (засобом виборчого доступу до даних таблиць).


Якщо ви ведете активну колективну розробку програми, то вся ця організаторська робота окупиться.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*