2010-05-27 1 views
4

Я новичок в DBMS_PROFILER. Во всех примерах, которые я видел, используется простая процедура верхнего уровня, чтобы продемонстрировать использование профилировщика, и оттуда получить все номера строк и т. Д. Я развертываю весь код в пакетах, и у меня возникают трудности с заполнением моей сессии профиля plsql_profiler_units с полезными данными. Большинство моих пробегов выглядеть следующим образом:Oracle DBMS_PROFILER только показывает Аноним в таблицах результатов

RUNID RUN_COMMENT UNIT_OWNER UNIT_NAME   SECS PERCEN 
----- ----------- ----------- -------------- ------- ------ 
5  Test  <anonymous> <anonymous>  .00 2.1 
     Profiler 

5  Test  <anonymous> <anonymous>  .00 2.1 
     Profiler 

5  Test  <anonymous> <anonymous>  .00 2.1 
     Profiler 

Я только встроенные вызовы к dbms_profiler.start_profiler, flush_data и stop_profiler как на всех примерах. Основное отличие состоит в том, что мой код находится в пакете и вызывает другой пакет. Вам нужно профилировать каждую хранимую процедуру в стеке вызовов? Если это сделает этот инструмент немного бесполезным!

Я проверил http://www.dba-oracle.com/t_plsql_dbms_profiler.htm за подсказками, среди других подобных сайтов.

+0

Какую базу данных? Вполне возможно, что если оптимизирующий компилятор делает что-то вроде встраивания кода, становится невозможным согласовать измерения из оптимизированного кода реструктуризации с исходным исходным кодом. –

+0

Это Oracle 10.2g –

ответ

4

Вы уверены, что это не проблема с запросом на получение данных из plsql_profiler_units?


Я попытался это:

Create Procedure sub_procedure As 
Begin 
    dbms_output.put_line('test'); 
End; 

Create Package test_package As 
    Procedure test; 
End; 

Create Package Body test_package As 
    Procedure test As Begin 
    For i In 1 .. 10 Loop 
     If(i<=5) Then 
     sub_procedure; 
     End If; 
    End Loop; 
    End; 
End; 

Begin 
    DBMS_PROFILER.start_profiler(SYSDATE); 
    test_package.test; 
    DBMS_PROFILER.stop_profiler; 
End; 

и этот простой запрос

Select uni.unit_name, dat.line#, dat.total_occur 
    From plsql_profiler_data dat 
    Join plsql_profiler_units uni On ( uni.runid = dat.runid 
            And uni.unit_number = dat.unit_number) 

дает мне ожидаемый результат, показывающий также пакеты и процедуры:

версия
<anonymous> 1 0 
<anonymous> 2 0 
<anonymous> 3 2 
<anonymous> 4 1 
<anonymous> 5 0 
TEST_PACKAGE 2 0 
TEST_PACKAGE 3 11 
TEST_PACKAGE 4 5 
TEST_PACKAGE 5 6 
TEST_PACKAGE 8 1 
SUB_PROCEDURE 1 0 
SUB_PROCEDURE 3 5 
SUB_PROCEDURE 4 5 
+0

Спасибо за это - я провел ваш пример, и это сработало нормально. Затем я перепробовал пакет, который вызывал у меня проблемы с SQL * Developer, и, похоже, профиль OK. Одна вещь, о которой я думал, заключается в том, что мой комментарий не был уникальным в моем первом тесте - это должно быть? Добавление метки времени выглядит как хороший способ обеспечить это. –

+0

Хорошо, у меня все еще такая же проблема, когда хранимая процедура вызывается моим приложением, но при вызове из SQL * Developer она просматривает OK. Приложение подключается как другой пользователь к тому, который я обычно использую от SQL * Developer. Существуют ли какие-либо разрешения, которые необходимо установить для правильной работы? –

+0

@ Грег Рейнольдс: Он не должен быть уникальным. Параметр 'run_comment' хранится в' plsql_profiler_runs.run_comment' и помогает различать разные вызовы. Подключитесь к * SQL * Developer *, используя того же пользователя, что и ваше приложение, чтобы узнать, отсутствуют ли гранты. –

Смежные вопросы