powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / толкование статистики по result cache
10 сообщений из 10, страница 1 из 1
толкование статистики по result cache
    #39390581
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, не могу осознать разницы в параметрах Find Copy Count и Find Count. У меня в тестовом примере с виртуальной колонкой, deterministic result cache функцией по селекту по 10 записям таблицы оба поля увеличиваются на 10. При этом в этих 10 колонках значения одинаковы.
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39390742
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShtockУ меня в тестовом примере http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39390856
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Элик, а если бы я про пример не написал, ты бы ответил по-существу? Я вот реально не догоняю разницу между этими параметрами и пример тут не при чём абсолютно.
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39390917
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shtockпример тут не при чём абсолютно.Не совсем. Он неадекватен исследуемому вопросу.
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39390935
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще:
Код: plsql
1.
2.
3.
4.
5.
Prod> select min(value) / max(value) from V$RESULT_CACHE_STATISTICS where name like 'Find%Count';

MIN(VALUE)/MAX(VALUE)
---------------------
        .999999358483
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39390963
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Он неадекватен исследуемому вопросу.

ага, это я уже после понял, но редактировать то сообщения нельзя
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39391723
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я могу сэмулировать один случай, когда find count растет, а find copy count не увеличивается.
Когда происходит загрузка нового результата в RC и "одновременное" обращение.
Тесты на 12.1.0.2.170117 с _optimizer_ads_use_result_cache= FALSE для уменьшения помех.


session1 (main):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SQL> set pages 100
SQL>
SQL> create or replace function f(p int)
  2    return int
  3    result_cache
  4  is
  5  begin
  6    return p;
  7  end;
  8  /

Function created.

SQL>
SQL> exec dbms_result_cache.flush

PL/SQL procedure successfully completed.

SQL>
-- загружаем зависимость от функции в RC
SQL> select f(0) from dual;

      F(0)
----------
         0

SQL>
SQL> col name for a28
SQL> col value for a10
SQL>
SQL> select *
  2    from v$result_cache_statistics;

        ID NAME                         VALUE          CON_ID
---------- ---------------------------- ---------- ----------
         1 Block Size (Bytes)           1024                0
         2 Block Count Maximum          102400              0
         3 Block Count Current          32                  0
         4 Result Size Maximum (Blocks) 5120                0
         5 Create Count Success         1                   0
         6 Create Count Failure         0                   0
         7 Find Count                   0                   0
         8 Invalidation Count           0                   0
         9 Delete Count Invalid         0                   0
        10 Delete Count Valid           0                   0
        11 Hash Chain Length            1                   0
        12 Find Copy Count              0                   0
        13 Latch (Share)                0                   0

13 rows selected.


session2 (oradebug kslgetsl_w на "Result Cache: RC Latch"):
Код: plsql
1.
2.
3.
SQL> set echo on
SQL> oradebug call kslgetsl_w 0x3800451C8 1 1 1 8
Function returned 1


session3/4 (slaves):
Код: plsql
1.
2.
3.
4.
SQL> 
-- пробуем загрузить новый результат
SQL> select f(1) from dual;
.. wait


session2:
Код: plsql
1.
2.
SQL> oradebug call kslfre 0x3800451C8
Function returned 8BA80C30


session1:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select * from v$result_cache_statistics;

        ID NAME                         VALUE          CON_ID
---------- ---------------------------- ---------- ----------
         1 Block Size (Bytes)           1024                0
         2 Block Count Maximum          102400              0
         3 Block Count Current          32                  0
         4 Result Size Maximum (Blocks) 5120                0
-- увеличилось на 1
         5 Create Count Success         2                   0
         6 Create Count Failure         0                   0
-- на 1
         7 Find Count                   1                   0
         8 Invalidation Count           0                   0
         9 Delete Count Invalid         0                   0
        10 Delete Count Valid           0                   0
        11 Hash Chain Length            1                   0
-- не изменилось
        12 Find Copy Count              0                   0
        13 Latch (Share)                0                   0

13 rows selected.



Было бы все хорошо, если бы не возникало разницы между Find Count/Find Copy Count, когда работает несколько сессий, которые не загружают ничего в RC, а только читают.
Но это не так, что демонстрирует следующий пример.

Наполняем RC:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
SQL> set pages 100
SQL> 
SQL> create or replace function f(p int)
  2    return int
  3    result_cache
  4  is
  5  begin
  6    return p;
  7  end;
  8  /

Function created.

SQL> 
SQL> exec dbms_result_cache.flush

PL/SQL procedure successfully completed.

SQL> 
SQL> col name for a28
SQL> col value for a10
SQL> 
SQL> select *
  2    from v$result_cache_statistics;

        ID NAME                         VALUE          CON_ID                   
---------- ---------------------------- ---------- ----------                   
         1 Block Size (Bytes)           1024                0                   
         2 Block Count Maximum          102400              0                   
         3 Block Count Current          0                   0                   
         4 Result Size Maximum (Blocks) 5120                0                   
         5 Create Count Success         0                   0                   
         6 Create Count Failure         0                   0                   
         7 Find Count                   0                   0                   
         8 Invalidation Count           0                   0                   
         9 Delete Count Invalid         0                   0                   
        10 Delete Count Valid           0                   0                   
        11 Hash Chain Length            0                   0                   
        12 Find Copy Count              0                   0                   
        13 Latch (Share)                0                   0                   

13 rows selected.

SQL> 
SQL> doc
DOC>  Populate RC
DOC>#
SQL> declare
  2    l_int int;
  3  begin
  4    for i in 1..&rc_rows.
  5    loop
  6  	 l_int := f(i);
  7    end loop;
  8  end;
  9  /
old   4:   for i in 1..&rc_rows.
new   4:   for i in 1..1000

PL/SQL procedure successfully completed.

SQL> select *
  2    from v$result_cache_statistics;

        ID NAME                         VALUE          CON_ID                   
---------- ---------------------------- ---------- ----------                   
         1 Block Size (Bytes)           1024                0                   
         2 Block Count Maximum          102400              0                   
         3 Block Count Current          1024                0                   
         4 Result Size Maximum (Blocks) 5120                0                   
         5 Create Count Success         1000                0                   
         6 Create Count Failure         0                   0                   
         7 Find Count                   0                   0                   
         8 Invalidation Count           0                   0                   
         9 Delete Count Invalid         0                   0                   
        10 Delete Count Valid           0                   0                   
        11 Hash Chain Length            0-1                 0                   
        12 Find Copy Count              0                   0                   
        13 Latch (Share)                0                   0                   

13 rows selected.

SQL> 
SQL> spo off


Запускаем 2 задания, которые в циклах обращаются к RC:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
SQL> set lin 500 pages 100
SQL>
SQL> col name for a28
SQL> col value for a10
SQL>
SQL> select *
  2    from v$result_cache_statistics;

        ID NAME                         VALUE          CON_ID
---------- ---------------------------- ---------- ----------
         1 Block Size (Bytes)           1024                0
         2 Block Count Maximum          102400              0
         3 Block Count Current          1024                0
         4 Result Size Maximum (Blocks) 5120                0
         5 Create Count Success         1000                0
         6 Create Count Failure         0                   0
         7 Find Count                   0                   0
         8 Invalidation Count           0                   0
         9 Delete Count Invalid         0                   0
        10 Delete Count Valid           0                   0
        11 Hash Chain Length            0-1                 0
        12 Find Copy Count              0                   0
        13 Latch (Share)                0                   0

13 rows selected.

SQL>
SQL> select *
  2    from v$latch
  3   where name='Result Cache: RC Latch';

ADDR                 LATCH#     LEVEL# NAME                               HASH       GETS     MISSES     SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH  SPIN_GETS     SLEEP1     SLEEP2     SLEEP3     SLEEP4     SLEEP5     SLEEP6     SLEEP7     SLEEP8     SLEEP9    SLEEP10    SLEEP11  WAIT_TIME     CON_ID
---------------- ---------- ---------- ---------------------------- ---------- ---------- ---------- ---------- -------------- ---------------- ------------- ------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
00000003800451C8        559          2 Result Cache: RC Latch       1054203712   36163937      63330          0              0                0             0                   0      63330          0          0          0          0          0          0          0          0          0          0          0          0          0

SQL>
SQL> delete plan_table where statement_id like 'RC\_TEST\__' escape '\';

0 rows deleted.

SQL> insert into plan_table(statement_id, object_node, id, object_owner, object_name, cost)
  2  select 'RC_TEST_A', 'V$RESULT_CACHE_STATISTICS', id, name, value, decode(name, 'Hash Chain Length', 0, to_number(value))
  3    from v$result_cache_statistics
  4   union all
  5  select 'RC_TEST_A', 'V$LATCH', 1, stat_name, null, value
  6    from (select * from v$latch where name='Result Cache: RC Latch')
  7   unpivot( value for stat_name in (gets, misses, sleeps, spin_gets))
  8  ;

17 rows created.

SQL> col start_ts old_v start_ts
SQL> select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff') start_ts from dual;

START_TS
---------------------------------------------------------------------------------------
2017-01-26 08:44:40.356033

SQL>
SQL> exec -
>   for i in 1..&num_jobs. -
>   loop -
>     dbms_scheduler.create_job(  -
> 	job_name   => dbms_scheduler.generate_job_name('SCJ_TEST_'), -
> 	job_type   => 'PLSQL_BLOCK',  -
> 	job_action => q'#declare -
> 			   l_rc int; -
> 			 begin -
> 			   for i in 1..&iterations. -
> 			   loop -
> 			     l_rc := f(1+mod(i,&rc_rows.)); -
> 			   end loop; -
> 			 end;#', -
> 	enabled    => true); -
>   end loop

PL/SQL procedure successfully completed.

SQL>
SQL> doc
DOC>  wait till the jobs have completed
DOC>#
SQL> declare
  2    l_sleep_interval constant number:=1;
  3  begin
  4    loop
  5  	 for job_rec in (
  6  	   select null
  7  	     from user_scheduler_job_run_details
  8  	    where log_date>to_timestamp('&start_ts.', 'yyyy-mm-dd hh24:mi:ssxff')
  9  	      and job_name like 'SCJ\_TEST\_%' escape '\'
 10  	    having count(0)=&num_jobs.
 11  	 )
 12  	 loop
 13  	   return;
 14  	 end loop;
 15  	 dbms_lock.sleep( l_sleep_interval);
 16    end loop;
 17  end;
 18  /
old   8:        where log_date>to_timestamp('&start_ts.', 'yyyy-mm-dd hh24:mi:ssxff')
new   8:        where log_date>to_timestamp('2017-01-26 08:44:40.356033', 'yyyy-mm-dd hh24:mi:ssxff')
old  10:        having count(0)=&num_jobs.
new  10:        having count(0)=2

PL/SQL procedure successfully completed.

SQL> insert into plan_table(statement_id, object_node, id, object_owner, object_name, cost)
  2  select 'RC_TEST_B', 'V$RESULT_CACHE_STATISTICS', id, name, value, decode(name, 'Hash Chain Length', 0, to_number(value))
  3    from v$result_cache_statistics
  4   union all
  5  select 'RC_TEST_B', 'V$LATCH', 1, stat_name, null, value
  6    from (select * from v$latch where name='Result Cache: RC Latch')
  7   unpivot( value for stat_name in (gets, misses, sleeps, spin_gets))
  8  ;

17 rows created.

SQL> commit;

Commit complete.

SQL>
SQL> col object_node for a30
SQL> col object_owner for a30
SQL> col object_name for a30
SQL> col value	      for 9999999999999999
SQL> select object_node,
  2  	    object_owner,
  3  	    sum(decode(substr(statement_id,-1), 'A', -1, 1)*cost) value,
  4  	    round((&num_jobs.*&iterations-sum(decode(substr(statement_id,-1), 'A', -1, 1)*cost))/(&num_jobs.*&iterations)*100, 2) pct
  5    from plan_table
  6   where statement_id like 'RC\_TEST\__' escape '\'
  7   group by object_node, id, object_owner
  8   order by object_node, id, object_owner;
old   4:        round((&num_jobs.*&iterations-sum(decode(substr(statement_id,-1), 'A', -1, 1)*cost))/(&num_jobs.*&iterations)*100, 2) pct
new   4:        round((2*5000000-sum(decode(substr(statement_id,-1), 'A', -1, 1)*cost))/(2*5000000)*100, 2) pct

OBJECT_NODE                    OBJECT_OWNER                               VALUE        PCT
------------------------------ ------------------------------ ----------------- ----------
V$LATCH                        GETS                                     9993486        .07
V$LATCH                        MISSES                                      7755      99.92
V$LATCH                        SLEEPS                                         0        100
V$LATCH                        SPIN_GETS                                   7755      99.92
V$RESULT_CACHE_STATISTICS      Block Size (Bytes)                             0        100
V$RESULT_CACHE_STATISTICS      Block Count Maximum                            0        100
V$RESULT_CACHE_STATISTICS      Block Count Current                            0        100
V$RESULT_CACHE_STATISTICS      Result Size Maximum (Blocks)                   0        100
V$RESULT_CACHE_STATISTICS      Create Count Success                           0        100
V$RESULT_CACHE_STATISTICS      Create Count Failure                           0        100
V$RESULT_CACHE_STATISTICS      Find Count                               9305411       6.95
V$RESULT_CACHE_STATISTICS      Invalidation Count                             0        100
V$RESULT_CACHE_STATISTICS      Delete Count Invalid                           0        100
V$RESULT_CACHE_STATISTICS      Delete Count Valid                             0        100
V$RESULT_CACHE_STATISTICS      Hash Chain Length                              0        100
V$RESULT_CACHE_STATISTICS      Find Copy Count                          8841650      11.58
V$RESULT_CACHE_STATISTICS      Latch (Share)                                  0        100

17 rows selected.

SQL>
SQL> spo off



Что замечено: с большей Hash Chain Length расхождение Find Count/Find Copy Count нарастает.
Find Copy Count больше расходится от реального кол-ва исполнений, чем Find Count.
Тоже самое с большим кол-вом заданий, работающих параллельно.
Думал, может v$result_cache_objects что другое покажет, но пока не вижу.
Похоже на какой-то аналог алгоритма увеличения TCH для блоков в конкурентной среде, что выглядело бы логичным, но доказательств нет.
Нормальной трассировки RC с помощью событий 43905/43906 добиться не удалось.
Я бы глянул на основании чего базовая X$ для v$result_cache_statistics строится - просто это данные в памяти или это функция, которая по другим X$ агрегирует.
Если просто в памяти, то посмотреть через отладчик, через какие функции она меняется, стэк глянуть, может на мысли какие натолкнет.
Пока точно не ясно, почему в примере без загрузки новых результатов в RC статистики расходятся.
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39391903
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я просто вообще тогда не понимаю, зачем find copy count нужно. в рамках одной сессии то он не изменяется.
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39392743
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я немного потрассировал операции с result cache в разных вариантах.
Конкретно, проверял, какие точно функции qesrc%, ksl_get_shared_latch, kslfre вызываются и в какой последовательности.
RC был разогрет, т.е. это не загрузка новых результатов, а только поиск.

select /*+ result_cache*/min(n) from t;
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
FUNCTION                                 
 -- CM - Cache Manager
 -> qesrcCM_GetMod                    qesrcCM_GetMod(0x38002F000,0,38000C000,38002F,38000C,380000,FA000000000,FFFFFF7D97CFC8,0)
 <- qesrcCM_GetMod                    qesrcCM_GetMod(0x2C,500000001,5,480D27130,380045000,380000,FA000000000,FFFFFF7D97CFC8,0)
 -> qesrcDynDep_Enabled               qesrcDynDep_Enabled(0x500000001,5,480D27130,380045000,380045,380000,FA000000000,FFFFFF7D97CFC8,0)
 <- qesrcDynDep_Enabled               qesrcDynDep_Enabled(0x38,0,FFFFFFFFFFFE2700,1D800,FFFFFFFF7D94CB90,FFFFFFFF7D94CB60,FA000000000,FFFFFF7D97CFC8,0)
 -> qesrcCM_Enabled                   qesrcCM_Enabled(0x1020BE000,4460,1020BE010,3,1020BE,102000,FFFFFFFF7FFF8B78,FFFFFFFF7FFF8B7C,FFFFFFFFFFFE2700)
 <- qesrcCM_Enabled                   qesrcCM_Enabled(0x10,480D27130,4460,1020BE010,380045000,380000,FFFFFFFF7FFF8B78,FFFFFFFF7FFF8B7C,FFFFFFFFFFFE2700)
 -> kskthbwt                          kskthbwt(0x0,BB576572E5D,180,48B0E7F28,21,1,0,2DBCD644891066,10)
 <- kskthbwt                          kskthbwt(0xB0,BB576572E5D,380010000,180,48B0E7F28,A030,0,100000000,A80)
 -> qesrcCM_Acquire                   qesrcCM_Acquire(0x480D27130,FFFFFFFF7D97A390,FFFFFFFF7FFF95B0,2,FFFFFFFF7FFF94F7,0,FFFFFFFF7D7201F4,0,FFFFFFFF7D4FCA60)
   -- вычисляем хэш
   -> qesrcKey_HashBurtle             qesrcKey_HashBurtle(0xFFFFFFFF7FFF95B0,0,40,1,480D27C25,0,0,51,418)
     -> qesrcKey_Mix                  qesrcKey_Mix(0x8FC3420CB285D7BF,CCE6B203,8FC3420C,4574E87D0,4574E87C0,480D27130,FFFFFFFF7FFF8E30,11130CF80,4C810E2001D)
     <- qesrcKey_Mix                  qesrcKey_Mix(0x88,DDF6C9E4ACE5412A,C378B77DB2790000,8E5DB000ABC1DA20,DDF6C9E400000000,AA44F61BACE5412A,FFFFFFFF7FFF8E30,11130CF80,4C810E2001D)
   <- qesrcKey_HashBurtle             qesrcKey_HashBurtle(0x3D0,FFFFFFFF7FFF95B0,C3C7CDEE,40,1C800,DD390791,0,51,418)
   -- pin-им хэш цепочку для поиска результата
   -> qesrcPin_Get                    qesrcPin_Get(0xFFFFFFFF7D97A390,FFFFFFFF7FFF95B0,1,0,0,FFFFFFFF7FFF94F7,0,0,1)
     -> qesrcCpyBuf_Get               qesrcCpyBuf_Get(0x1,FFFFFFFF7D97A3A0,1D800,0,1,480D27BC0,FFFFFFFF7FFF8BE8,0,0)
     <- qesrcCpyBuf_Get               qesrcCpyBuf_Get(0x50,1,FFFFFFFF7D97A3A0,FFFFFFFFFFFE2700,0,0,0,0,0)
     -- RC latch
     -> ksl_get_shared_latch          ksl_get_shared_latch(0x3800451C8,1,1,14EE,8,1,FFFFFFFF7FFF8BE8,0,0)
     <- ksl_get_shared_latch          ksl_get_shared_latch(0x19C,1,1,0,14EE,1,FFFFFFFF7FFF8BE8,0,0)
     -> qesrcCM_Init                  qesrcCM_Init(0x480D27130,FFFFFFFF7FFF90B2,0,14EE,FFFFFFFF7EF10E18,1,FFFFFFFF7FFF8BE8,0,0)
     <- qesrcCM_Init                  qesrcCM_Init(0x24,1,FFFFFFFF7FFF90B2,0,14EE,480D27060,FFFFFFFF7FFF8BE8,0,0)
     -> qesrcCM_SlfMod                qesrcCM_SlfMod(0x45854A848,1,FFFFFFFF7D97B080,0,20,196,FFFFFFFF7FFF8BE8,0,0)
     <- qesrcCM_SlfMod                qesrcCM_SlfMod(0xC4,0,1,FFFFFFFF7D97B080,0,0,FFFFFFFF7FFF8BE8,0,0)
     -> qesrcDynDep_Enabled           qesrcDynDep_Enabled(0x0,1,FFFFFFFF7D97B080,1,20,0,FFFFFFFF7FFF8BE8,0,0)
     <- qesrcDynDep_Enabled           qesrcDynDep_Enabled(0x38,0,FFFFFFFFFFFE2700,1D800,FFFFFFFF7D94CB90,FFFFFFFF7D94CB60,FFFFFFFF7FFF8BE8,0,0)
     -- FIND COUNT + 1
     -> kslfre                        kslfre(0x3800451C8,0,380000,FFFFFFFF7D2C9844,20,0,FFFFFFFF7FFF8BE8,0,0)
     <- kslfre                        kslfre(0x144,380045220,1,0,48BA833A8,0,0,0,0)
   <- qesrcPin_Get                    qesrcPin_Get(0x1E1C,1,FFFFFFFF7D2C9828,380045000,20,FFFFFFFF7D97A390,0,0,1)
   -- FIND COPY COUNT + 1
 <- qesrcCM_Acquire                   qesrcCM_Acquire(0x250,1,FFFFFFFF7D97A390,0,0,0,FFFFFFFF7D7201F4,0,FFFFFFFF7D4FCA60)
 -> qesrcIter_Init                    qesrcIter_Init(0xFFFFFFFF7D97A408,FFFFFFFF7D97A390,4574E8700,1,FFFFFFFF7D97AF24,0,FFFFFFFF7D7201F4,0,FFFFFFFF7D4FCA60)
   -> qesrcQB_New                     qesrcQB_New(0xFFFFFFFF7D97A428,FFFFFFFF7D2C9828,10829B580,0,1,0,FFFFFFFF7FFF95B0,480D27130,FFFFFFFF7D7201A8)
   <- qesrcQB_New                     qesrcQB_New(0x94,FFFFFFFF7D97A428,FFFFFFFF7D2C9828,10829B580,10829B,FFFFFFFF7D2C9840,FFFFFFFF7FFF95B0,480D27130,FFFFFFFF7D7201A8)
 <- qesrcIter_Init                    qesrcIter_Init(0xA58,FFFFFFFF7D97A408,FFFFFFFF7D97A390,F3,0,FFFFFF90,FFFFFFFF7FFF95B0,480D27130,FFFFFFFF7D7201A8)
 -> qesrcIter_GetRow                  qesrcIter_GetRow(0xFFFFFFFF7D97A408,107C52A00,FFFFFFFF7FFF9740,1,0,103637000,1,0,100000000)
 <- qesrcIter_GetRow                  qesrcIter_GetRow(0x54,0,107C52A00,FFFFFFFF7D97A5E0,1,FFFFFFFF7D97A428,1,0,100000000)
 -> qesrcCM_Release                   qesrcCM_Release(0x480D27130,FFFFFFFF7D97A390,0,10000,10000,80,FFFFFFFF7EF10E18,0,800)
   -> qesrcCpyBuf_Rls                 qesrcCpyBuf_Rls(0xFFFFFFFF7D97A3A0,0,0,0,0,0,F3,0,FFFFFFFF7D97AF24)
   <- qesrcCpyBuf_Rls                 qesrcCpyBuf_Rls(0x44,FFFFFFFF7D97A3A0,FFFFFFFF7D2C9838,FFFFFFFF7D94CB60,FFFFFFFF7D2C9828,0,F3,0,FFFFFFFF7D97AF24)
 <- qesrcCM_Release                   qesrcCM_Release(0x80,480D27130,FFFFFFFF7D97A390,0,10000,0,F3,0,FFFFFFFF7D97AF24)


select f(1) from dual;
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
FUNCTION                                 
 -> qesrcDynDep_Enabled               qesrcDynDep_Enabled(0x0,0,0,FFFFFFFFFFFE2700,459851E00,456D25AC0,1C5,0,22000)
 <- qesrcDynDep_Enabled               qesrcDynDep_Enabled(0x38,0,FFFFFFFFFFFE2700,1D800,FFFFFFFF7D94CB90,FFFFFFFF7D94CB60,1C5,0,22000)
 -> qesrcCM_PinSze                    qesrcCM_PinSze(0xFFFFFFFF7D8CEF90,FFFFFFFF7D8CEF90,10,0,FFFFFFFF7FFF8748,FFFFFFFF7EF11010,200000002,0,0)
 <- qesrcCM_PinSze                    qesrcCM_PinSze(0x4,78,FFFFFFFF7D8CEF90,10,0,FFFFFFFF7EF11010,200000002,0,0)
 -> qesrcIter_SizeCol                 qesrcIter_SizeCol(0x1,0,10,0,FFFFFFFF7FFF8748,FFFFFFFF7EF11010,200000002,0,0)
 <- qesrcIter_SizeCol                 qesrcIter_SizeCol(0x48,1DA,80,0,9,1DA,200000002,0,0)
 -> qesrcCM_Enabled                   qesrcCM_Enabled(0x220,0,8,8,9,F,2010,FFFFFFFF7FFF8388,8)
 <- qesrcCM_Enabled                   qesrcCM_Enabled(0x10,480D27130,0,8,380045000,380000,2010,FFFFFFFF7FFF8388,8)
 -> qesrcCM_PinSze                    qesrcCM_PinSze(0x480D27130,F,8,1,FFFFFFFF7D937528,8,2010,FFFFFFFF7FFF8388,8)
 <- qesrcCM_PinSze                    qesrcCM_PinSze(0x4,78,F,8,1,8,2010,FFFFFFFF7FFF8388,8)
 -> qesrcCM_Acquire                   qesrcCM_Acquire(0x480D27130,FFFFFFFF7D937538,FFFFFFFF7FFF73F8,E,0,FFFFFFFF7FFF74B0,FFFFFFFF7D778CC8,FFFFFFFF7D9374E8,8)
   -> qesrcKey_HashBurtle             qesrcKey_HashBurtle(0xFFFFFFFF7FFF73F8,8,40,1,480D27C25,0,FFFFFFFF7FFF71E8,200000002,45AAB2340)
       -> qesrcKey_Mix                qesrcKey_Mix(0xD6243823FA21F012,A6467206,3C8DC1B99B8DC1B9,8DC1B99B00000000,3C8DC1B99B000000,8DC1B9,0,0,0)
       <- qesrcKey_Mix                qesrcKey_Mix(0x88,77768A06A84B579,366141DDDA280000,7F325CFE6452936E,77768A000000000,662C0D06A84B579,0,0,0)
   <- qesrcKey_HashBurtle             qesrcKey_HashBurtle(0x3D0,FFFFFFFF7FFF73F8,8,FFFFFFFF7FFF6B74,5000,8DC1B99BC256DB4D,FFFFFFFF7FFF71E8,200000002,45AAB2340)
   -> qesrcPin_Get                    qesrcPin_Get(0xFFFFFFFF7D937538,FFFFFFFF7FFF73F8,1,0,0,0,1,0,1)
     -> ksl_get_shared_latch          ksl_get_shared_latch(0x3800451C8,1,1,14EE,8,1,0,0,0)
     <- ksl_get_shared_latch          ksl_get_shared_latch(0x19C,1,1,0,14EE,1,0,0,0)
     -> qesrcCM_Init                  qesrcCM_Init(0x480D27130,FFFFFFFF7FFF6C32,0,14EE,FFFFFFFF7EF10E18,1,0,0,0)
     <- qesrcCM_Init                  qesrcCM_Init(0x24,1,FFFFFFFF7FFF6C32,0,14EE,480D27060,0,0,0)
     -> qesrcCM_SlfMod                qesrcCM_SlfMod(0x43DF71748,1,0,0,20,380000,0,0,0)
     <- qesrcCM_SlfMod                qesrcCM_SlfMod(0xC4,0,1,0,0,0,0,0,0)
     -> qesrcDynDep_Enabled           qesrcDynDep_Enabled(0x0,1,0,1,20,0,0,0,0)
     <- qesrcDynDep_Enabled           qesrcDynDep_Enabled(0x38,0,FFFFFFFFFFFE2700,1D800,FFFFFFFF7D94CB90,FFFFFFFF7D94CB60,0,0,0)
     -- FIND COUNT + 1
     -> kslfre                        kslfre(0x3800451C8,0,380000,1,0,0,0,0,0)
     <- kslfre                        kslfre(0x144,380045220,1,0,48BA877A0,0,0,0,0)
   <- qesrcPin_Get                    qesrcPin_Get(0x1E1C,1,0,380045000,0,FFFFFFFF7D937538,1,0,1)
   -- FIND COPY COUNT + 1
 <- qesrcCM_Acquire                   qesrcCM_Acquire(0x250,1,FFFFFFFF7D937538,1,FFFFFFFF7FFF74B4,0,FFFFFFFF7D778CC8,FFFFFFFF7D9374E8,8)



2. в 11.1 Find Copy Count, скорее всего, не было. Об этом говорит документация: http://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_2133.htm#REFRN30439
и Find Copy Count не упоминается в презентации Julian Dyke "Result Cache Internals".
3. Судя по названиям, qesrcCpyBuf_Rls, qesrcCpyBuf_Get - относятся к копированию буферов. qesrcIter - итератор для просмотра результатов.
4. Если открываем курсор и постепенно из него фетчим, то при фетчах срабатывает только qesrcIter_GetRow, RC latch/CM никак не затрагиваются.
При последнем фетче делается qesrcCpyBuf_Rls.

Вообщем, гипотеза есть, зачем это сделано.
Сессия ищет результат в RC, если в v$result_cache_objects.namespace='SQL' (select, а не PL/SQL) , то этот буфер с результатом копируется отдельно,
потом дальше с этим скопированным буфером работаем, не взаимодействуя никак с RC инфраструктурой (RC latch/CM).
Если бы этого не было, то: клиент может быть задумчивый, фетчить по строчке в полчаса.
Видимо, в 11.1, когда ввели, это не учли, в последствии добавили это копирование, чтобы клиент на каждый чих RC не тревожил.

Почему в кейсе с заданиями без загрузки новых результатов расхождения между статистиками получаются, это не объясняет (может не корректно обновляют статистики).
Но я потестировал свой скрипт и похоже на какую-то защиту от слишком частых обновлений статистик для избежания конкуренции.
Вот скрипт для запуска заданий.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
spo rc_find_copy_stat_jobs

set echo on
set lin 500 pages 100

def rc_rows="&1."
def num_jobs="&2."
def iterations="&3."
def sleep_interval="&4."


col name for a28
col value for a10

select * 
  from v$result_cache_statistics;

select * 
  from v$latch 
 where name='Result Cache: RC Latch';

delete plan_table where statement_id like 'RC\_TEST\__' escape '\';
insert into plan_table(statement_id, object_node, id, object_owner, object_name, cost)
select 'RC_TEST_A', 'V$RESULT_CACHE_STATISTICS', id, name, value, decode(name, 'Hash Chain Length', 0, to_number(value))
  from v$result_cache_statistics
 union all
select 'RC_TEST_A', 'V$LATCH', 1, stat_name, null, value
  from (select * from v$latch where name='Result Cache: RC Latch') 
 unpivot( value for stat_name in (gets, misses, sleeps, spin_gets))
;
col start_ts old_v start_ts
select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff') start_ts from dual;

exec -
  for i in 1..&num_jobs. -
  loop -
    dbms_scheduler.create_job(  -
      job_name   => dbms_scheduler.generate_job_name('SCJ_TEST_'), -
      job_type   => 'PLSQL_BLOCK',  -
      job_action => q'#declare -
                         l_rc int; -
                       begin -
                         for i in 1..&iterations. -
                         loop -
                           if mod(i,&iterations./5)=0 then dbms_lock.sleep(&sleep_interval.);end if; -
                           l_rc := f(#'||i||q'#); -
                         end loop; -
                       end;#', -
      enabled    => true); -
  end loop

doc
  wait till the jobs have completed
#
declare
  l_sleep_interval constant number:=1;
begin
  loop
    for job_rec in (
      select null
        from user_scheduler_job_run_details
       where log_date>to_timestamp('&start_ts.', 'yyyy-mm-dd hh24:mi:ssxff')
         and job_name like 'SCJ\_TEST\_%' escape '\'
       having count(0)=&num_jobs.
    )
    loop
      return;
    end loop;
    dbms_lock.sleep( l_sleep_interval);
  end loop;
end;
/
insert into plan_table(statement_id, object_node, id, object_owner, object_name, cost)
select 'RC_TEST_B', 'V$RESULT_CACHE_STATISTICS', id, name, value, decode(name, 'Hash Chain Length', 0, to_number(value))
  from v$result_cache_statistics
 union all
select 'RC_TEST_B', 'V$LATCH', 1, stat_name, null, value
  from (select * from v$latch where name='Result Cache: RC Latch') 
 unpivot( value for stat_name in (gets, misses, sleeps, spin_gets))
;
commit;

col object_node for a30
col object_owner for a30
col object_name for a30
col value        for 9999999999999999
select object_node, 
       object_owner,
       sum(decode(substr(statement_id,-1), 'A', -1, 1)*cost) value,
       round((&num_jobs.*&iterations-sum(decode(substr(statement_id,-1), 'A', -1, 1)*cost))/(&num_jobs.*&iterations)*100, 2) pct
  from plan_table
 where statement_id like 'RC\_TEST\__' escape '\'
 group by object_node, id, object_owner
 order by object_node, id, object_owner;
       
spo off



Если в цикле пауз не делать, то на параметрах: 500 2 100000 0 (2 задания по 100К итераций), у меня гарантированно отличается find count от кол-ва исполнений.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
OBJECT_NODE                    OBJECT_OWNER                               VALUE        PCT                                                                                                                                                                                                                                                                                                                                                                                                                          
------------------------------ ------------------------------ ----------------- ----------                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        GETS                                      199878        .06                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        MISSES                                        29      99.99                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        SLEEPS                                         0        100                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        SPIN_GETS                                     29      99.99                                                                                                                                                                                                                                                                                                                                                                                                                          
V$RESULT_CACHE_STATISTICS      Find Count                                179733      10.13                                                                                                                                                                                                                                                                                                                                                                                                                          
V$RESULT_CACHE_STATISTICS      Find Copy Count                           188877       5.56                                                                                                                                                                                                                                                                                                                                                                                                                          


С паузой 1 секунда на каждые 20К строк: 500 2 100000 1 расхождений нет.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
OBJECT_NODE                    OBJECT_OWNER                               VALUE        PCT                                                                                                                                                                                                                                                                                                                                                                                                                          
------------------------------ ------------------------------ ----------------- ----------                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        GETS                                      200001          0                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        MISSES                                         0        100                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        SLEEPS                                         0        100                                                                                                                                                                                                                                                                                                                                                                                                                          
V$LATCH                        SPIN_GETS                                      0        100                                                                                                                                                                                                                                                                                                                                                                                                                          
V$RESULT_CACHE_STATISTICS      Find Count                                200000          0                                                                                                                                                                                                                                                                                                                                                                                                                          
V$RESULT_CACHE_STATISTICS      Find Copy Count                           200000          0                                                                                                                                                                                                                                                                                                                                                                                                                          


Ну и соответственно, я увеличивал кол-во строк, увеличивал кол-во пауз, их длину, получал совпадение кол-ва исполнений и find count/find copy count.
...
Рейтинг: 0 / 0
толкование статистики по result cache
    #39392806
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стало ясно, спасибо
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / толкование статистики по result cache
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]