Программирование >>  Oracle 

1 ... 424 425 426 [ 427 ] 428 429 430 ... 469


Пакет DBMS PROFILER

Появления стандартного средства профилирования ждали давно (по крайней мере, я). Пакет DBMS PROFILER представляет собой профилировщик исходного кода для PL/SQL-приложений. Раньше приходилось настраивать производительность PL/SQL-приложений с помощью средств SQL TRACE и TKPROF. Они помогали выявить долго выполняющиеся SQL-операторы, но определить узкие места в в PL/SQL-коде из 5000 строк (особенно, если он написан кем-то другим) б1ло практически невозможно. Чтобы определить проблемные фрагменты кода, приходилось вставлять в него множество вызовов функции DBMS UTILITY.GET TIME для измерения времени выполнения.

Теперь этого делать не нужно: можно воспользоваться возможностями пакета DBMS PROFILER. Я собираюсь продемонстрировать, как его обычно используют. Лично я использую небольшую часть функциональных возможностей этого пакета: нахожу с его помощью проблемные фрагменты и занимаюсь ими непосредственно. Я использую пакет DBMS PROFILER очень примитивным способом. Он позволяет, однако, делать намного больше, чем представлено в этом разделе.

Статистическая информация собирается в таблицы базы данных. Они позволяют сохранять статистическую информацию за несколько прогонов кода. Некоторых это устраивает, но я предпочитаю сохранять результаты одного-двух последних прогонов. Дополнительная информация лишь сбивает с толку. Иногда информации бывает слишком много.

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

cd [ORACLE HOME]/rdbms/admin;



Пакет DBMS PROFILER 1705

с помощью SVRMGRL (или SQL*Plus - прим. научн. ред.) подключиться как SYS или INTERNAL;

выполнить сценарий profload.sql.

После этого надо установить таблицы статистической информации. Их можно установить в базе данных в одном экземпляре, но я рекомендую каждому разработчику создать свой набор этих таблиц. К счастью, пакет DBMS PROFILER создан с правами вызывающего и использует неуточненные имена таблиц, так что таблицы статистической информации можно установить в каждой схеме, и они будут корректно использоваться пакетом-профилировщиком. При использовании собственных таблиц каждый разработчик будет видеть только свои результаты профилирования, а не результаты коллег по работе. Чтобы создать таблицы статистической информации в своей схеме, надо выполнить сценарий [ORACLE HOME]\rdbms\admin\proJtab.sql в SQL*Plus. После выполнения сценария proftab.sql надо выполнить сценарий profrep.sql. Этот сценарий создает представления и пакеты для создания отчетов по таблицам профилировщика. Сценарий profrep.sql находится в файле [ORACLE HOME]\plsql\demo\profrep.sql. Этот сценарий надо выполнить в своей схеме после создания таблиц.

Я обычно создаю небольшой сценарий для очистки таблиц профилировщика и выполняю эту очистку постоянно. После одного-двух тестовых прогонов и анализа результатов я выполняю этот сценарий. В сценарии, который я назвал profreset.sql, выполняется следующее:

- используются операторы delete, поскольку таблицы связаны требованием внешнего ключа

delete fromplsql profiler data; delete from plsql profiler units; delete from plsql profiler runs;

Теперь можно начинать профилирование. Я собираюсь продемонстрировать использование этого пакета путем запуска двух разных реализаций алгоритма вычисления факториала. Один алгоритм - рекурсивный, а другой - итеративный. Для того чтобы определить, какой из них работает быстрее и какие фрагменты кода наиболее медленные в каждой реализации, используется профилировщик. Тестирование выполняется следующим образом:

tkyte@TKYTE816> @profreset

tkyte@TKYTE816> create or replace

2 function fact recursive(n int) return number

3 as

4 begin

5 if (n = 1)

6 then

7 return 1;

8 else

9 return n * fact recursive(n-l);

10 end if;

11 end;

12 /

Functioncreated.



1706

Приложение А

tkyte@TKYTE816> create or replace

2 function fact iterative(n int) return number

3 as

4 l result number default 1;

5 begin

6 for i in 2 .. n

7 loop

8 l result := l result * i;

9 end loop;

10 return l result;

11 end;

12 /

Function created.

tkyte@TKYTE816> set serveroutput on

tkyte@TKYTE816> exec dbms profiler.start profiler(factorial recursive) PL/SQL procedure successfully completed.

tkyte@TKYTE816> begin

2 for i in 1 .. 50 loop

3 dbms output.put line(fact recursive(50));

4 end loop;

5 end;

30414093201713378043612 608166064768844300000000000000000000000000

30414093201713378043612 608166064768844300000000000000000000000000 PL/SQL procedure successfully completed. tkyte@TKYTE816> exec dbms profiler.stop profiler PL/SQL procedure successfully completed.

tkyte@TKYTE816> exec dbms profiler.start profiler(factorial iterative) PL/SQL procedure successfully completed.

tkyte@TKYTE816> begin

2 for i in 1 .. 50 loop

3 dbms output.put line(fact iterative(50));

4 end loop;

5 end;

30414093201713378043612608166064768844300000000000000000000000000

30414093201713378043612608166064768844300000000000000000000000000 PL/SQL procedure successfully completed. tkyte@TKYTE816> exec dbms profiler.stop profiler PL/SQL procedure successfully completed.

Для сбора статистической информации очередного прогона профилировщика необходимо вызвать процедуру START PROFILER. Каждому прогону мы даем определен-



1 ... 424 425 426 [ 427 ] 428 429 430 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика