Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Subject: How to Identify Resource Intensive SQL for Tuning
Doc ID: Note:232443.1

Service Time is comprised of time spent on the CPU for Parsing, Recursive CPU usage (for PLSQL and recursive SQL) and CPU used for execution of SQL statements (CPU Other).

SQL>   ed
Wrote file afiedt.buf

  1  create or replace procedure x_test is
  2   i number:=1;
  3  begin
  4    loop
  5     exit when i>5;
  6      x_test2;
  7      i:=i+1;
  8   end loop;
  9* end;
SQL> /

Procedure created.

Elapsed: 00:00:00.00
SQL> execute x_test

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.01
SQL> select * from v$sesstat where statistic# in (8) and sid = 12;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        12          8          [b]9[/b]

Elapsed: 00:00:00.01
SQL> execute x_test

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.01
SQL> select * from v$sesstat where statistic# in (8) and sid = 12;

       SID STATISTIC#      VALUE
---------- ---------- ----------
        12          8          [b]9[/b]

Elapsed: 00:00:00.00
SQL> select * from v$statname where statistic#=8;

STATISTIC# NAME                                                                  CLASS
---------- ---------------------------------------------------------------- ----------
         8 recursive cpu usage                                                       1

??..
26 сен 06, 11:18    [3183646]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production
PL/SQL Release 9.2.0.5.0 - Production
CORE 9.2.0.6.0 Production
TNS for Linux: Version 9.2.0.5.0 - Production
NLSRTL Version 9.2.0.5.0 - Production
26 сен 06, 11:21    [3183664]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Давайте обсудим (?)... если есть у кого какие мысли. Цель. Хочется увидеть в этой статистике отражение плохого pl\sql post factum. Типа сессия поработала, посмотрели статистику и сказали... ага.. вероятно плохой pl\sql.

Может у кого есть альтернативные варианты?..
26 сен 06, 13:23    [3184559]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Совсем никаких мыслей?..

DSI
The statistics recursive cpu usage represents the CPU used by recursive calls. The number of such calls is represented by the statistic recursive calls. These are additional calls generated by the Oracle server when servicing user calls. They generally occur due to PL/SQL statements (unavoidable) and row cache misses and extent allocations (avoidable).


Может что поменялось с 8.1.7 может кто проверить?.. Или я что-то совсем не так интерпретирую
26 сен 06, 16:51    [3186370]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
GuestXXX
Guest
HX
Совсем никаких мыслей?.. .. Или я что-то совсем не так интерпретирую
Для начала скажи, что именно тебя смущает. На следующей итеррации - приведи другие статистики в этом примере.
26 сен 06, 17:13    [3186559]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
GuestXXX
HX
Совсем никаких мыслей?.. .. Или я что-то совсем не так интерпретирую
Для начала скажи, что именно тебя смущает. На следующей итеррации - приведи другие статистики в этом примере.

Смущает то, что значение этой статистики не изменилось, хотя она, по идее, должна показывать время затраченное cpu на обработку pl\sql + время cpu на рекурсивные запросы. Смущает то что cpu на pl\sql не аккумулируется.

Другие статистики это какие интересны? Эта статистика при следующих вызовах не меняется, только если появляется рекурсивные сеансы.
26 сен 06, 17:18    [3186582]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
HX

Может у кого есть альтернативные варианты?..

А если сделать обычную трассировку и посчитать время выполнения всех sql'ин и сравнить с общим временем выполнения? По идее разница должна дать(?) время работы pl/sql.
26 сен 06, 17:21    [3186598]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
GuestXXX
Guest
HX
Смущает то, что значение этой статистики не изменилось, хотя она,
Может она просто мала - в пределах кванта измерения. Другие - CPU used, parsed и т.д.
26 сен 06, 17:38    [3186717]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
GuestXXX
HX
Смущает то, что значение этой статистики не изменилось, хотя она,
Может она просто мала - в пределах кванта измерения. Другие - CPU used, parsed и т.д.

нет. нет. посмотрите на elapsed он занчительный. там внутри только loop end loop; на несколько миллионов инттераций.

to Apex: да, но только post factum это не сделать. :-( Для этого надо трассировать всю сессию. А тут речь идет о post factum анализе.

Да и небольшой Offtop по диагностике plsql. Кто-нибудь сталкивался с необходимостью включать pl\sql profiler из другой сессии, аля dbms_system.set_Ev. event 10941 не работает.
26 сен 06, 17:49    [3186771]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18555
Небольшой прикол по теме:
tst> create procedure x_test3 as
  2  begin
  3      for i in 1..1000000 loop
  4          null;
  5      end loop;
  6  end;
  7  /

Procedure created.

Elapsed: 00:00:00.78
tst> create or replace procedure x_test1 is
  2   i number:=1;
  3  begin
  4    loop
  5     exit when i>5;
  6      x_test3;
  7      i:=i+1;
  8   end loop;
  9  end;
 10  /

Procedure created.

Elapsed: 00:00:00.62
tst> connect u1/u1@tst_d
Connected.
tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (8, 12);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive cpu usage                                                       0
CPU used by this session                                                  1

Elapsed: 00:00:00.15
tst> exec x_test1

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.06
tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (8, 12);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive cpu usage                                                       0
CPU used by this session                                                191

Elapsed: 00:00:00.31
tst> exec execute immediate 'begin x_test1; end;';

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.38
tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (8, 12);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive cpu usage                                                     190
CPU used by this session                                                383

Elapsed: 00:00:00.31
tst> 
27 сен 06, 02:54    [3187808]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18555
HX
Совсем никаких мыслей?..

DSI
The statistics recursive cpu usage represents the CPU used by recursive calls. The number of such calls is represented by the statistic recursive calls. These are additional calls generated by the Oracle server when servicing user calls. They generally occur due to PL/SQL statements (unavoidable) and row cache misses and extent allocations (avoidable).


Может что поменялось с 8.1.7 может кто проверить?.. Или я что-то совсем не так интерпретирую
Насчет 8-ки -- там было тоже самое

Давай определимся сначала с понятием call -- это не вызов процедуры из процедуры это обращение к подпрограмме ядра Oracle, такое как PARSE, BIND, EXEC, FETCH, UNMAP и т.д.
В случае:
exec x_test
у нас есть вызов (call) PL/SQL блока
begin x_test; end;
Мы его разобрали и запустили на выполнение (call). Далее работа целиком идет в контексте PL/SQL -- обращений к ядру (call) просто нет (либо они уж совсем внутренние, все равно надо загружать вызываемый хранимый код в кеш, проверять состояние, возможно, парсить, но скорее всего в данном случае это происходит слишком быстро, чтоб отметиться). По поводу execute immediate -- мы явно вызываем разбор и выполнение анонимного блока (call). Он будет рекурсивным по отношению к основному и учитываться в соответствующей статистике.
tst> connect u1/u1@tst
Connected.
tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (7, 8);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive calls                                                          16
recursive cpu usage                                                       0

tst> exec x_test1

PL/SQL procedure successfully completed.

tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (7, 8);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive calls                                                          16
recursive cpu usage                                                       0

tst> exec execute immediate 'begin x_test1; end;';

PL/SQL procedure successfully completed.

tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (7, 8);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive calls                                                          17
recursive cpu usage                                                     191
Стоит добавить вызов SQL в PL/SQL коде (или наоборот) -- вот и появляются recursive call.
tst> drop procedure x_test3;

Procedure dropped.

Elapsed: 00:00:00.63
tst> create procedure x_test3 as
  2  begin
  3      for i in 1..10000 loop
  4          for r in (select dummy from dual) loop
  5              null;
  6          end loop;
  7      end loop;
  8  end;
  9  /

Procedure created.

Elapsed: 00:00:00.63
tst> connect u1/u1@tst_d
Connected.
tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (8, 12);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive cpu usage                                                       1
CPU used by this session                                                  1

Elapsed: 00:00:00.31
tst> exec x_test1

PL/SQL procedure successfully completed.

Elapsed: 00:00:12.19
tst> select name, value from v$mystat ms, v$statname sn
  2  where ms.statistic#=sn.statistic# and ms.statistic# in (8, 12);

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
recursive cpu usage                                                     964
CPU used by this session                                               1199

Elapsed: 00:00:00.31
27 сен 06, 03:52    [3187824]     Ответить | Цитировать Сообщить модератору
 Re: recursive cpu usage and plsql  [new]
HX
Member

Откуда: Moscow
Сообщений: 2454
Вячеслав Любомудров
Давай определимся сначала с понятием call -- это не вызов процедуры из процедуры это обращение к подпрограмме ядра Oracle, такое как PARSE, BIND, EXEC, FETCH, UNMAP и т.д.

Вот. Я чувствовал, что неправильно что-то понимаю :-)..
Спасибо, Вячеслав, ваша интерпретация больше похожа на правду.
Теперь вроде бы ясно.
27 сен 06, 11:08    [3188933]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить