Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Количество переключений контекста plsql/sql  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
Всем с молодых ногтей известно, что множественное "переключение контекста между plsql и sql это плохо".
Как можно определить количество таких переключений в запросе или блоке?
24 окт 11, 12:47    [11488194]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
Максим Н,

как то писал дядя Том
http://asktom.oracle.com/pls/asktom/f?p=100:11:2596566771728987::::P11_QUESTION_ID:8912264456901
24 окт 11, 14:12    [11488982]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
comphead
Member

Откуда: Киев
Сообщений: 3390
даже лучше так, чтоб не читали лишнего

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8912264456901#28568411897338
24 окт 11, 14:26    [11489121]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
бобры
Guest
Максим Н
Всем с молодых ногтей известно, что множественное "переключение контекста между plsql и sql это плохо".
Как можно определить количество таких переключений в запросе или блоке?

затраты на переключение контекста это нечто что-то около мифическое
на практике это скорее статистическая погрешность
24 окт 11, 14:46    [11489312]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
вы слыхали как поют бобры
Guest
Том Кайт запутал молодых людей, когда начал говорить, что бенефит FORALL перед plsql циклом в переключениях контекста. Это не совсем так.
24 окт 11, 14:48    [11489339]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
-2-
Member

Откуда:
Сообщений: 15330
бобры
на практике это скорее статистическая погрешность
на практике это вызов нескольких недешевых методов: open, bind, execute, fetch, close.
24 окт 11, 15:07    [11489565]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
вы слыхали как поют бобры
Guest
open & close будут дешевыми, курсор будет оставаться открытым.
fetch - ? что за дополнительный фетч, которого не будет в forall?
ну и вообще, было подчеркнуто "на практике", т.е. реальная проблема, измеренная. А не мифическая.
24 окт 11, 19:14    [11491472]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
вы слыхали как поют бобры,

Не забываем, что переключение это не только PL/SQL->SQL, но и наоборот. Напихайте заковыристых функций в запрос, и мифы станут реальностью.
24 окт 11, 22:36    [11492176]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 722
wildwind,

ну дык ресурсы то будут жрать заковыристые запросы а не переключение.
Без курсоров и лупов код выглядет гораздо читабельнее и очень хороше мониторится.
Попробуй отлови самый медленный кусок кода, если кажый запрос выполняется микросекунды, в случе-же с со статементом - очень хороше мониторится и ишутся узкие места.
Честнее будет сказать стиль правильнее а не пинать на мифические микросекунды
25 окт 11, 00:23    [11492491]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
comphead
даже лучше так, чтоб не читали лишнего

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:8912264456901#28568411897338
Ок. Смотрим в чатик дяди Тома:
Вопрос
How to measure # of context switches
Дядя Том
tkprof -- number of execute, fetch, parse calls
Проверяем:
create or replace function f_sample(p in varchar2) return varchar2 is
begin
  return case when p like '%ABC%' or p like '%XYZ%' then 'other val' else p end;
end f_sample;
/

create table million as
select dbms_random.string('X',10) val
from dual
connect by level <= 1000000
/
Смотрим в трейс:
********************************************************************************

select min(case when val like '%ABC%' or val like '%XYZ%' then 'other val' else val end) result
from million

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.01          0          2          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.39       0.38          0       2219          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.39       0.39          0       2221          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 96  

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=2219 pr=0 pw=0 time=0 us)
1000000   TABLE ACCESS FULL MILLION (cr=2219 pr=0 pw=0 time=126293 us cost=621 size=1880276398 card=939199)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  Disk file operations I/O                        1        0.00          0.00
  SQL*Net message from client                     2        1.31          1.40
********************************************************************************
********************************************************************************

select min(f_sample(val))
from million

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.02          0          1          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      2.30       2.31          0       2219          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      2.32       2.33          0       2220          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 96  

Rows     Row Source Operation
-------  ---------------------------------------------------
      1  SORT AGGREGATE (cr=2243 pr=0 pw=0 time=0 us)
1000000   TABLE ACCESS FULL MILLION (cr=2219 pr=0 pw=0 time=171541 us cost=621 size=1880276398 card=939199)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  SQL*Net message from client                     2        2.23          2.23
********************************************************************************
При этом число execute, fetch, parse calls для варианта с переключением контекста и без переключения чудесным образом совпало.
А время выполнения отличается всего-то 2.33/0.39 = 5.97... всего в шесть раз.
25 окт 11, 00:38    [11492524]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 722
Глупый Телевизор,

пример не равноценный.
В случае с функцией : функция должна выполнится для каждой строки а затем ищется минимум из результата.
В случае запроса оптимайзер применяет оператор like ко всему обьекту а затем из обьекта выбирается минимум.
Попробуйте запрос посложнее с парой колонок, т.е. заставте оптимайзер поработать над каждой строкой, как в случае с функцией.
Тогда результат будет примерно одинаковый.
25 окт 11, 07:44    [11492719]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
kapelan
Глупый Телевизор,

пример не равноценный.
В случае с функцией : функция должна выполнится для каждой строки а затем ищется минимум из результата.
В случае запроса оптимайзер применяет оператор like ко всему обьекту а затем из обьекта выбирается минимум.
Попробуйте запрос посложнее с парой колонок, т.е. заставте оптимайзер поработать над каждой строкой, как в случае с функцией.
Тогда результат будет примерно одинаковый.
Непонятно, что подразумевается под объектом и почему примеры не равноценны.
25 окт 11, 08:25    [11492754]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
kapelan
Member

Откуда: хутор БольшойБугор
Сообщений: 722
wurdu,

функция применяется к каждой строке
оператор ко всем строкам сразу
план выполнения разный
25 окт 11, 08:48    [11492795]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
kapelan
wurdu,

функция применяется к каждой строке
оператор ко всем строкам сразу
план выполнения разный
Мы видим, что планы одинаковые. Также я не понимаю, что значит "ко всем строкам сразу".
25 окт 11, 08:57    [11492815]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
Elic
Member

Откуда:
Сообщений: 29991
+
set timing on

select avg(             sin(level)) from dual connect by level <= 100000;
/
select avg(sys.standard.sin(level)) from dual connect by level <= 100000;
/
AVG(SIN(LEVEL))
---------------
  .000018477771

Elapsed: 00:00:01.76

AVG(SIN(LEVEL))
---------------
  .000018477771

Elapsed: 00:00:01.71

AVG(SYS.STANDARD.SIN(LEVEL))
----------------------------
               .000018477771

Elapsed: 00:00:02.56

AVG(SYS.STANDARD.SIN(LEVEL))
----------------------------
               .000018477771

Elapsed: 00:00:02.56
25 окт 11, 09:42    [11492943]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
kapelan
wildwind,

ну дык ресурсы то будут жрать заковыристые запросы а не переключение.
Я наверное неудачно сформулировал. Пусть будут простые функции с простым SQL-ем внутри.

Да и без SQL-я уже продемонстрировали.
25 окт 11, 11:46    [11493950]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
Максим Н
Как можно определить количество таких переключений в запросе или блоке?

До некоторой степени могут помочь статистики сессии (V$SESSTAT) 'recursive calls' и 'recursive cpu usage'. Правда, на них влияют еще разные системные вызовы, не зависящие от качества вашего кода. Например запросы к словарю данных; их можно исключить "прогревом" кэша, то есть многократным выполнением исследуемого запроса/блока.
25 окт 11, 11:56    [11494081]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Elic,

эффект будет еще заметнее, если саму функцию взять полегче

+
SQL> 
SQL> select avg(	     substr(level,-1)) from dual connect by level <= 100000;

AVG(SUBSTR(LEVEL,-1))                                                           
---------------------                                                           
                  4,5                                                           

Затрач.время: 00:00:00.20
SQL> /

AVG(SUBSTR(LEVEL,-1))                                                           
---------------------                                                           
                  4,5                                                           

Затрач.время: 00:00:00.15
SQL> select avg(sys.standard.substr(level,-1)) from dual connect by level <= 100000;

AVG(SYS.STANDARD.SUBSTR(LEVEL,-1))                                              
----------------------------------                                              
                               4,5                                              

Затрач.время: 00:00:01.15
SQL> /

AVG(SYS.STANDARD.SUBSTR(LEVEL,-1))                                              
----------------------------------                                              
                               4,5                                              

Затрач.время: 00:00:01.09
25 окт 11, 12:00    [11494125]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
stax..
Guest
orawish
Elic,

эффект будет еще заметнее, если саму функцию взять полегче

+
+
SQL> 
SQL> select avg(	     substr(level,-1)) from dual connect by level <= 100000;

AVG(SUBSTR(LEVEL,-1))                                                           
---------------------                                                           
                  4,5                                                           

Затрач.время: 00:00:00.20
SQL> /

AVG(SUBSTR(LEVEL,-1))                                                           
---------------------                                                           
                  4,5                                                           

Затрач.время: 00:00:00.15
SQL> select avg(sys.standard.substr(level,-1)) from dual connect by level <= 100000;

AVG(SYS.STANDARD.SUBSTR(LEVEL,-1))                                              
----------------------------------                                              
                               4,5                                              

Затрач.время: 00:00:01.15
SQL> /

AVG(SYS.STANDARD.SUBSTR(LEVEL,-1))                                              
----------------------------------                                              
                               4,5                                              

Затрач.время: 00:00:01.09


я так и не понял, как посчитать к-во переключений?

  1  create or replace function f_sample(p in number) return varchar2 is
  2    n number;
  3  begin
  4    select decode(mod(p,3),0,10,1,20, 30) into n from dual;
  5    return n;
  6* end f_sample;
SQL> /

Function created.

Elapsed: 00:00:00.03
SQL> select avg(f_sample(level)) av from dual connect by level <= 100000;

        AV
----------
        20

Elapsed: 00:00:03.56
SQL> /

        AV
----------
        20

Elapsed: 00:00:03.53
SQL> /

        AV
----------
        20

Elapsed: 00:00:03.62
SQL> select avg(decode(mod(level,3),0,10,1,20, 30)) av from dual connect by level <= 100000;

        AV
----------
        20

Elapsed: 00:00:00.31
SQL> /

        AV
----------
        20

Elapsed: 00:00:00.29
SQL> /

        AV
----------
        20

Elapsed: 00:00:00.34
SQL>

.....
stax
25 окт 11, 17:19    [11497531]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
wildwind
Максим Н
Как можно определить количество таких переключений в запросе или блоке?

До некоторой степени могут помочь статистики сессии (V$SESSTAT) 'recursive calls' и 'recursive cpu usage'. Правда, на них влияют еще разные системные вызовы, не зависящие от качества вашего кода. Например запросы к словарю данных; их можно исключить "прогревом" кэша, то есть многократным выполнением исследуемого запроса/блока.
Это статистики из другой оперы.
+ Почему-то ничего не изменилось :)
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>
SQL> select sid, name, value
  2    from v$sesstat ss, v$statname sn
  3   where ss.statistic# = sn.statistic#
  4     and sn.name like '%recursive%'
  5     and sid = userenv('sid')
  6   order by ss.sid, sn.NAME;

       SID NAME                                                    VALUE
---------- -------------------------------------------------- ----------
         9 HSC OLTP recursive compression                              0
         9 IMU recursive-transaction flush                             0
         9 recursive aborts on index block reclamation                 0
         9 recursive calls                                           130
         9 recursive cpu usage                                         0
         9 recursive system API invocations                            0

6 rows selected.

Elapsed: 00:00:00.00
SQL>
SQL> select min(case when val like '%ABC%' or val like '%XYZ%' then 'other val' else val end) result from million;

RESULT
--------------------
0000NHR525

Elapsed: 00:00:00.45
SQL>
SQL> select sid, name, value
  2    from v$sesstat ss, v$statname sn
  3   where ss.statistic# = sn.statistic#
  4     and sn.name like '%recursive%'
  5     and sid = userenv('sid')
  6   order by ss.sid, sn.NAME;

       SID NAME                                                    VALUE
---------- -------------------------------------------------- ----------
         9 HSC OLTP recursive compression                              0
         9 IMU recursive-transaction flush                             0
         9 recursive aborts on index block reclamation                 0
         9 recursive calls                                           130
         9 recursive cpu usage                                         0
         9 recursive system API invocations                            0

6 rows selected.

Elapsed: 00:00:00.07
SQL>
SQL> select min(f_sample(val)) from million;

MIN(F_SAMPLE(VAL))
--------------------
0000NHR525

Elapsed: 00:00:02.50
SQL>
SQL> select sid, name, value
  2    from v$sesstat ss, v$statname sn
  3   where ss.statistic# = sn.statistic#
  4     and sn.name like '%recursive%'
  5     and sid = userenv('sid')
  6   order by ss.sid, sn.NAME;

       SID NAME                                                    VALUE
---------- -------------------------------------------------- ----------
         9 HSC OLTP recursive compression                              0
         9 IMU recursive-transaction flush                             0
         9 recursive aborts on index block reclamation                 0
         9 recursive calls                                           130
         9 recursive cpu usage                                         0
         9 recursive system API invocations                            0

6 rows selected.

Elapsed: 00:00:00.07
SQL>
31 окт 11, 01:05    [11523801]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1296
Глупый Телевизор
Это статистики из другой оперы.
Отчего же, опера та же, другая партия. Всей картины конечно не отражают, я это отметил.
Глупый Телевизор
Почему-то ничего не изменилось :)]
Очевидно потому, что не было parse/exec/fetch. Подозреваю, что есть какой-то event, позволяющий сдампить или хотя бы посчитать и вызовы SQL->PL/SQL.
31 окт 11, 17:01    [11528111]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
wildwind
Глупый Телевизор
Почему-то ничего не изменилось :)]
Очевидно потому, что не было parse/exec/fetch.
Как это не было? Все было. Трейс выше по топику.
wildwind
Подозреваю, что есть какой-то event, позволяющий сдампить или хотя бы посчитать и вызовы SQL->PL/SQL.
Да я тоже думаю что как-то все-таки померять можно. Но удивило, что дядя том так по-ламерски ответил.
31 окт 11, 17:10    [11528194]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
В конкретных случаях могут помочь v$db_object_cache, 10928.
31 окт 11, 17:39    [11528492]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
А.
Guest
wildwind
Подозреваю, что есть какой-то event, позволяющий сдампить или хотя бы посчитать и вызовы SQL->PL/SQL.

Это можно сделать другими способами, но что эта информация даст?
31 окт 11, 21:23    [11529477]     Ответить | Цитировать Сообщить модератору
 Re: Количество переключений контекста plsql/sql  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
А.
Это можно сделать другими способами
Например?
А.
что эта информация даст?
Многие проблемы можно обнаружить по statistics/waits даже не видя текст запроса.

С другой стороны, примерно понятно почему для такого дела как contex switch нет статистики. Это, по моему предположению, потому, что на измерение кол-ва переключений контекста может затрачиваться время соизмеримое с собственно переключениями.

А вот с соответствующим trace event - интереснее. Вопрос открыт.
31 окт 11, 21:28    [11529495]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить