|
Программирование >> Oracle
Пакет 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. Каждому прогону мы даем определен-
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |