powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Об использовании result_cache при запросе из представления OWM
20 сообщений из 20, страница 1 из 1
Об использовании result_cache при запросе из представления OWM
    #38991771
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть запрос вида:
Код: plsql
1.
2.
select SDO_AGGR_MBR(field1) from view
where field2 in (package.function(param1), package.function(param2)



Представление view - это одно из представлений, созданных Oracle Workspace Management для поддержки версионирования одной из талиц. Вызываемая функция объявлена как result_cache. При добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось. В чём может быть дело?

EE 11.2.0.3
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38991818
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите результат выполнения
Код: plsql
1.
SELECT * FROM v$version;
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38991821
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*PlusПокажите результат выполнения
Код: plsql
1.
SELECT * FROM v$version;



Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
"CORE 11.2.0.3.0 Production"
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38991831
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PasticВызываемая функция объявлена как result_cache.
При добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось.
В чём может быть дело?В запросе используются три функции:
1. SDO_AGGR_MBR(field1)
2. package.function(param1)
3. package.function(param2)

О какой из них идет речь?
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38991862
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*PlusPasticВызываемая функция объявлена как result_cache.
При добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось.
В чём может быть дело?В запросе используются три функции:
1. SDO_AGGR_MBR(field1)
2. package.function(param1)
3. package.function(param2)

О какой из них идет речь?

SDO_AGGR_MBR - это стандартная функция MDSYS.SDO_Aggr_MBR.
package.function(param1) и package.function(param2) - это одна и та же функция с разными параметрами.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38991866
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Pastic,

покажи вывод:
Код: plsql
1.
2.
3.
4.
sho parameter result_cache;
select DBMS_RESULT_CACHE.STATUS  from dual;
set serverout on;
exec sys.dbms_result_cache.memory_report(true);
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38992157
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PasticSQL*Plusпропущено...
В запросе используются три функции:
1. SDO_AGGR_MBR(field1)
2. package.function(param1)
3. package.function(param2)

О какой из них идет речь?

SDO_AGGR_MBR - это стандартная функция MDSYS.SDO_Aggr_MBR.
package.function(param1) и package.function(param2) - это одна и та же функция с разными параметрами.О КАКОЙ ИЗ НИХ ИДЕТ РЕЧЬ:
"Вызываемая функция объявлена как result_cache. При добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось." ?

Где именно ожидалось появление "в плане разбора запроса строки с result_cache"?
Вот тут?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> select /*+ RESULT_CACHE NO_PARALLEL */ count(*) from customer;

  COUNT(*)
----------
  15000000


Execution Plan
----------------------------------------------------------
Plan hash value: 487422484

---------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                       | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                            |     1 |  1686   (3)| 00:00:01 |
|   1 |  RESULT CACHE                | 3sz82kmwjd04ra53wz62tz6016 |       |            |          |
|   2 |   SORT AGGREGATE             |                            |     1 |            |          |
|   3 |    TABLE ACCESS INMEMORY FULL| CUSTOMER                   |    15M|  1686   (3)| 00:00:01 |
---------------------------------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38992216
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderPastic,

покажи вывод:
Код: plsql
1.
2.
3.
4.
sho parameter result_cache;
select DBMS_RESULT_CACHE.STATUS  from dual;
set serverout on;
exec sys.dbms_result_cache.memory_report(true);



Запросил информацию у админа: как получу - выложу.

SQL*PlusPasticпропущено...


SDO_AGGR_MBR - это стандартная функция MDSYS.SDO_Aggr_MBR.
package.function(param1) и package.function(param2) - это одна и та же функция с разными параметрами.О КАКОЙ ИЗ НИХ ИДЕТ РЕЧЬ:
"Вызываемая функция объявлена как result_cache. При добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось." ?

Речь о самописной функции package.function.

SQL*PlusГде именно ожидалось появление "в плане разбора запроса строки с result_cache"?
Вот тут?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> select /*+ RESULT_CACHE NO_PARALLEL */ count(*) from customer;

  COUNT(*)
----------
  15000000


Execution Plan
----------------------------------------------------------
Plan hash value: 487422484

---------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                       | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                            |     1 |  1686   (3)| 00:00:01 |
|   1 |  RESULT CACHE                | 3sz82kmwjd04ra53wz62tz6016 |       |            |          |
|   2 |   SORT AGGREGATE             |                            |     1 |            |          |
|   3 |    TABLE ACCESS INMEMORY FULL| CUSTOMER                   |    15M|  1686   (3)| 00:00:01 |
---------------------------------------------------------------------------------------------------



Да.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38993155
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pastic,

Если RESULT_CACHE указано только в этой функции, а в самой команде SELECT такого хинта нет,
то никаких RESULT CACHE в плане выполнения запроса не будет.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38993163
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*Plus,

17811893
PasticПри добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38993200
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderSQL*Plus,

17811893
PasticПри добавлении в этот запрос хинта result_cache, в плане разбора запроса строки с result_cache не появилось.ОК. Дошло... :-)

Тогда просим автора:
Проверить объявлена ли его package.function, как DETERMINISTIC ?

Код: plsql
1.
2.
3.
SDO_AGGR_MBR(
     geom SDO_GEOMETRY
     ) RETURN SDO_GEOMETRY;

Не силен в Spatial Option, но предполагаю, что эта функция не DETERMINISTIC.

Result Cache отключается, если в запросе есть функция не DETERMINISTIC.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38993738
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*PlusResult Cache отключается, если в запросе есть функция не DETERMINISTIC.это не так:
не deterministic
Код: 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.
SQL> create or replace function f_nondeterministic(p int:=100) return int
  2  as
  3  begin
  4     return round(dbms_random.value(0,p));
  5  end;
  6  /

Function created.

SQL> explain plan for
  2  select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3
  3  /

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
Plan hash value: 1224005312

--------------------------------------------------------------------------------------------------
| Id  | Operation           | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |                            |     1 |     2 |     3   (0)| 00:00:01 |
|   1 |  RESULT CACHE       | br9z4bx2a76msgytdpg8khufy4 |       |       |            |          |
|*  2 |   FILTER            |                            |       |       |            |          |
|   3 |    TABLE ACCESS FULL| DUAL                       |     1 |     2 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("F_NONDETERMINISTIC"()>3)

Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=2; dependencies=(OD.DUAL, OD.F_NONDETERMINISTIC);
        attributes=(single-row, dynamic); 
        name="select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3"

добавляем sysdate
Код: 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.
SQL> explain plan for
  2  select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3 and sysdate>date'2000-01-01'
  3  /

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------
Plan hash value: 1224005312

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |     2 |     3   (0)| 00:00:01 |
|*  1 |  FILTER            |      |       |       |            |          |
|   2 |   TABLE ACCESS FULL| DUAL |     1 |     2 |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYSDATE@!>TO_DATE(' 2000-01-01 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss') AND "F_NONDETERMINISTIC"()>3)


http://docs.oracle.com/cd/E11882_01/server.112/e41573/memory.htm#PFGRF95096 When the result cache is enabled, the database also caches queries that call non-deterministic PL/SQL functions. When caching SELECT statements that call such functions, the result cache tracks data dependencies for the PL/SQL functions and the database objects. However, if the function uses data that are not being tracked (such as sequences, SYSDATE, SYS_CONTEXT, and package variables), using the result cache on queries that call this function can produce stale results. In this regard, the behavior of the result cache is identical to caching PL/SQL functions. Therefore, always consider data accuracy, as well as performance, when choosing to enable the result cache.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38994134
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderSQL*PlusResult Cache отключается, если в запросе есть функция не DETERMINISTIC.это не так:
см. Server Result Cache : Overview (Doc ID 1588763.1)
Result cache is disabled for queries containing:- ...
- !!!
- ...
- ...
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38994157
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*Plus,

ну ведь элементарно же проверить? тест-кейсы я дал...
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38994915
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил.

Работает странно.

Очищаю Result Cache и выполняю SELECTы.
При первом вызове возвращает одно значение (в данном листинге 1 )
При втором и последующих прогонах возвращает одно и то же, но другое значение (в данном листинге 3 )
Test Case: Result Cache + SELECT with Non-Deterministic PL/SQL FunctionЧтобы не копаться в документации приведу описание статистик Result Cache:

Table 8–6 V$RESULT_CACHE_STATISTICS Statistics
Statistic Name DescriptionCreate Count Success Number of cache results successfully createdCreate Count Failure Number of cache results that failed to createFind Count Number of cached results that were successfully foundInvalidation Count Total number of invalidationsDelete Count Invalid Number of invalid cached results deletedDelete Count Valid Number of valid cached results deletedHash Chain Length Average length of items in the hash chainFind Copy Count Number of results copied directly out of the cache

Теперь результаты:
Код: 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.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

SQL> create or replace function f_nondeterministic(p int:=100) return int
  2  as
  3  begin
  4  	return round(dbms_random.value(0,p));
  5  end;
  6  /
Function created.

SQL> COLUMN name FORMAT A30;
SQL> COLUMN value FORMAT A20;

-- Очистка Result Cache
SQL> BEGIN DBMS_RESULT_CACHE.flush; END;
  2  /
PL/SQL procedure successfully completed.

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           0
Create Count Failure           0
Find Count                     0
Find Copy Count                0

SQL> SET AUTOTRACE ON;

SQL> select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3;

D   NONDETER
- ----------
X          1


Execution Plan
----------------------------------------------------------
Plan hash value: 3752461848

----------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                            |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  RESULT CACHE               | dx9un5ygd0gk93bfkbuaf2k9cb |       |       |            |          |
|*  2 |   FILTER                    |                            |       |       |            |          |
|   3 |    TABLE ACCESS STORAGE FULL| DUAL                       |     1 |     2 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("F_NONDETERMINISTIC"()>3)

Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=2; dependencies=(TPCH_0100.F_NONDETERMINISTIC); attributes=(single-row, dynamic); name="select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3"

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


SQL> SET AUTOTRACE OFF;

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           1
Create Count Failure           0
Find Count                     0
Find Copy Count                0

SQL> 
SQL> select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3;

D   NONDETER
- ----------
X          3

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           1
Create Count Failure           0
Find Count                     1
Find Copy Count                1

SQL> select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3;

D   NONDETER
- ----------
X          3

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           1
Create Count Failure           0
Find Count                     2
Find Copy Count                2



Предполагаю, что разгадка в приведенной вами цитате из документации.
Предлагаю совместными усилиями перевести её на русский язык.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38999091
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender!

SQL*PlusПроверил.

Работает странно.

Очищаю Result Cache и выполняю SELECTы.
При первом вызове возвращает одно значение (в данном листинге 1 )
При втором и последующих прогонах возвращает одно и то же, но другое значение (в данном листинге 3 )
Test Case: Result Cache + SELECT with Non-Deterministic PL/SQL FunctionЧтобы не копаться в документации приведу описание статистик Result Cache:

Table 8–6 V$RESULT_CACHE_STATISTICS Statistics
Statistic Name DescriptionCreate Count Success Number of cache results successfully createdCreate Count Failure Number of cache results that failed to createFind Count Number of cached results that were successfully foundInvalidation Count Total number of invalidationsDelete Count Invalid Number of invalid cached results deletedDelete Count Valid Number of valid cached results deletedHash Chain Length Average length of items in the hash chainFind Copy Count Number of results copied directly out of the cache

Теперь результаты:
Код: 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.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

SQL> create or replace function f_nondeterministic(p int:=100) return int
  2  as
  3  begin
  4  	return round(dbms_random.value(0,p));
  5  end;
  6  /
Function created.

SQL> COLUMN name FORMAT A30;
SQL> COLUMN value FORMAT A20;

-- Очистка Result Cache
SQL> BEGIN DBMS_RESULT_CACHE.flush; END;
  2  /
PL/SQL procedure successfully completed.

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           0
Create Count Failure           0
Find Count                     0
Find Copy Count                0

SQL> SET AUTOTRACE ON;

SQL> select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3;

D   NONDETER
- ----------
X          1


Execution Plan
----------------------------------------------------------
Plan hash value: 3752461848

----------------------------------------------------------------------------------------------------------
| Id  | Operation                   | Name                       | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                            |     1 |     2 |     2   (0)| 00:00:01 |
|   1 |  RESULT CACHE               | dx9un5ygd0gk93bfkbuaf2k9cb |       |       |            |          |
|*  2 |   FILTER                    |                            |       |       |            |          |
|   3 |    TABLE ACCESS STORAGE FULL| DUAL                       |     1 |     2 |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("F_NONDETERMINISTIC"()>3)

Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=2; dependencies=(TPCH_0100.F_NONDETERMINISTIC); attributes=(single-row, dynamic); name="select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3"

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold


SQL> SET AUTOTRACE OFF;

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           1
Create Count Failure           0
Find Count                     0
Find Copy Count                0

SQL> 
SQL> select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3;

D   NONDETER
- ----------
X          3

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           1
Create Count Failure           0
Find Count                     1
Find Copy Count                1

SQL> select/*+ result_cache */ dummy, f_nondeterministic(10) nondeter from dual where f_nondeterministic > 3;

D   NONDETER
- ----------
X          3

SQL> SELECT name, value
  2  FROM V$RESULT_CACHE_STATISTICS
  3  WHERE name IN ( 'Create Count Success', 'Create Count Failure', 'Find Count', 'Find Copy Count');

NAME                           VALUE
------------------------------ --------------------
Create Count Success           1
Create Count Failure           0
Find Count                     2
Find Copy Count                2



Предполагаю, что разгадка в приведенной вами цитате из документации.
Предлагаю совместными усилиями перевести её на русский язык.

Выполнил те же команды
1. Через TOAD for Oracle 12.6.0.53 (freeware edition)
2. Через Oracle SQL Developer 4.1.0.19

Эффект тот же:
Первый раз SELECT возвращает одно значение (Значение 1).
Второй и последующие разы (в том числе в разных сессиях) - другое значение, но одно и то же (Значение 2).

То есть ваши слова о том, что виновата утилита SQL*Plus не подтверждаются.
(мы об этом говорили 02 июля 2015 г. на Oracle Database Community Day)
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38999449
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*PlusТо есть ваши слова о том, что виновата утилита SQL*Plus не подтверждаются.
(мы об этом говорили 02 июля 2015 г. на Oracle Database Community Day)
да, я тут немного ошибся: дело в том, что на самом деле функция при первом выполнении запроса просто выполняется дважды, поэтому я и винил SQL*Plus по старой памяти, т.к. есть такая особенность у SQL*Plus - иногда делать лишние вызовы

хотя я про это мельком уже писал , но лучше покажу наглядно
тест-кейс
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
set echo on;
create table t10 as select level n from dual connect by level<=10;
create or replace function xf(p int) return int as
begin
  dbms_output.put_line('F fired! ('||p||')');
  return p;
end;
/
select * from (select rownum, xf(n) a from t10) where a*a>0;

exec for r in (select * from (select rownum, xf(n) a from t10) where a*a>0) loop null; end loop;

set echo off;
drop table t10 purge;
drop function xf;

результат
Код: 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.
SQL> create table t10 as select level n from dual connect by level<=10;

Table created.

SQL> create or replace function xf(p int) return int as
  2  begin
  3    dbms_output.put_line('F fired! ('||p||')');
  4    return p;
  5  end;
  6  /

Function created.

SQL> select * from (select rownum, xf(n) a from t10) where a*a>0;

    ROWNUM          A
---------- ----------
         1          1
         2          2
         3          3
         4          4
         5          5
         6          6
         7          7
         8          8
         9          9
        10         10

10 rows selected.

F fired! (1)
F fired! (1)
F fired! (1)
F fired! (2)
F fired! (3)
F fired! (4)
F fired! (5)
F fired! (6)
F fired! (7)
F fired! (8)
F fired! (9)
F fired! (10)
SQL>
SQL> exec for r in (select * from (select rownum, xf(n) a from t10) where a*a>0) loop null; end loop;
F fired! (1)
F fired! (2)
F fired! (3)
F fired! (4)
F fired! (5)
F fired! (6)
F fired! (7)
F fired! (8)
F fired! (9)
F fired! (10)

PL/SQL procedure successfully completed.



ну и по сабжу: легко увидеть, что при первом выполнении запроса функция вызывается дважды - результат первого вызова функции кэшируется, а второго - возвращается клиенту. Ну а последующие вызовы просто возвращают результат из кэша
тестовый скрипт
Код: 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.
set echo on feed on serverout on;
create or replace function f_nondeterministic(p int:=100) return int
as
  res number;
begin
   res:=round(dbms_random.value(0,p));
   dbms_output.put_line('fired! ('||res||')');
   return res;
end;
/
alter system flush shared_pool;
call DBMS_RESULT_CACHE.flush();

select/*+ result_cache */ f_nondeterministic(1000) nondeter from dual;
/
/
/
begin
   for r in (select/*+ result_cache */ f_nondeterministic(2000) nondeter from dual) loop dbms_output.put_line(r.nondeter); end loop;
   for r in (select/*+ result_cache */ f_nondeterministic(2000) nondeter from dual) loop dbms_output.put_line(r.nondeter); end loop;
   for r in (select/*+ result_cache */ f_nondeterministic(2000) nondeter from dual) loop dbms_output.put_line(r.nondeter); end loop;
end;
/
set echo off serverout off;

результат
Код: 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.
SQL> create or replace function f_nondeterministic(p int:=100) return int
  2  as
  3    res number;
  4  begin
  5     res:=round(dbms_random.value(0,p));
  6     dbms_output.put_line('fired! ('||res||')');
  7     return res;
  8  end;
  9  /

Function created.

SQL> alter system flush shared_pool;

System altered.

SQL> call DBMS_RESULT_CACHE.flush();

Call completed.

SQL>
SQL> select/*+ result_cache */ f_nondeterministic(1000) nondeter from dual;

  NONDETER
----------
       169

1 row selected.

fired! (237)
fired! (169)
SQL> /

  NONDETER
----------
       237

1 row selected.

SQL> /

  NONDETER
----------
       237

1 row selected.

SQL> /

  NONDETER
----------
       237

1 row selected.

SQL> begin
  2     for r in (select/*+ result_cache */ f_nondeterministic(2000) nondeter from dual) loop dbms_output.put_line(r.nondeter); end loop;
  3     for r in (select/*+ result_cache */ f_nondeterministic(2000) nondeter from dual) loop dbms_output.put_line(r.nondeter); end loop;
  4     for r in (select/*+ result_cache */ f_nondeterministic(2000) nondeter from dual) loop dbms_output.put_line(r.nondeter); end loop;
  5  end;
  6  /
fired! (1279)
fired! (1969)
1969
1279
1279

PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38999454
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
SQL*PlusПредполагаю, что разгадка в приведенной вами цитате из документации.
Предлагаю совместными усилиями перевести её на русский язык.ок, раз уж обещал :)

http://docs.oracle.com/cd/E11882_01/server.112/e41573/memory.htm#PFGRF95096 When the result cache is enabled, the database also caches queries that call non-deterministic PL/SQL functions. When caching SELECT statements that call such functions, the result cache tracks data dependencies for the PL/SQL functions and the database objects. However, if the function uses data that are not being tracked (such as sequences, SYSDATE, SYS_CONTEXT, and package variables), using the result cache on queries that call this function can produce stale results. In this regard, the behavior of the result cache is identical to caching PL/SQL functions. Therefore, always consider data accuracy, as well as performance, when choosing to enable the result cache.
Как-то так :)Когда result cache включен, oracle также кэширует запросы, которые вызывают недетерминированные PL/SQL-функции.
При кэшировании SELECT'ов, которые вызывают такие функции, result cache отслеживает зависимости функций и объектов. Однако, если функция использует данные, которые не отслеживаются(такие как сиквенсы, SYSDATE, SYS_CONTEXT и пакетные переменные), использование result cache для запросов, которые вызывают такие функции, может дать устаревшие результаты. В этом отношении поведение result cache идентично кэшированию PL/SQL функций. Поэтому, когда рассматриваете использование result cache всегда учитывайте не только производительность, но и точность данных.
...
Рейтинг: 0 / 0
Об использовании result_cache при запросе из представления OWM
    #38999488
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Как-то так :)При кэшировании SELECT'ов, которые вызывают такие функции, result cache отслеживает зависимости функций и объектов. В принципе где-то тут на форуме уже было объяснение, но у меня не получилось найти. Вкратце, в 11.2 убрали RELIES_ON, и стали делать анализ в рантайме, но он отличается от анализа зависимостей у запросов:
тест-кейс
Код: 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.
set echo on feed on;

-- сделаем функцию, у которой нет hard-зависимостей 
-- и возвращать результаты она будет из таблицы, которая передана в параметре
create or replace function f_nondeterministic(p_tab varchar2) return varchar2
as
   res varchar2(30);
begin
   execute immediate 'select '''||p_tab||''' from '||p_tab||' where rownum=1' into res;
   return res;
end;
/
create table a as select 'a' a from dual;
create table b as select 'b' b from dual;
var p_tab varchar2(10);
col name for a72;

call DBMS_RESULT_CACHE.flush();

exec :p_tab:='a';
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

exec :p_tab:='b';
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

exec :p_tab:='v$instance';
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

-- а теперь просто запрос с хинтом напрямую из v$instance:
select/*+ result_cache */ i.INSTANCE_NUMBER from v$instance i;
select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;
explain plan for select/*+ result_cache */ i.INSTANCE_NUMBER from v$instance i;
select * from table(dbms_xplan.display);

col name clear;
set echo off;
drop table a purge;
drop table b purge;
drop function f_nondeterministic;
set echo off;


результат при :p_tab:='a';
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> exec :p_tab:='a';

PL/SQL procedure successfully completed.

SQL> select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
NONDETER
--------
a

SQL> select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;
NONDETER
--------
a

SQL> select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

NAME                                                                      BUCKET_NO         ID TYPE       STATUS     PIN_COUNT SCAN_COUNT INVALIDATIONS
------------------------------------------------------------------------ ---------- ---------- ---------- --------- ---------- ---------- -------------
XTENDER.F_NONDETERMINISTIC                                                     3191          0 Dependency Published          0          0             0
XTENDER.A                                                                      2818          2 Dependency Published          0          0             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        3569          1 Result     Published          0          1             0

наглядно видно, что все зависимости расчитались и результат благополучно закэшировался
:p_tab:='b'
Код: 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.
SQL> exec :p_tab:='b';

PL/SQL procedure successfully completed.

SQL> select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;

NONDETER
--------
b

SQL> select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;

NONDETER
--------
b

SQL> select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

NAME                                                                      BUCKET_NO         ID TYPE       STATUS     PIN_COUNT SCAN_COUNT INVALIDATIONS
------------------------------------------------------------------------ ---------- ---------- ---------- --------- ---------- ---------- -------------
XTENDER.F_NONDETERMINISTIC                                                     3191          0 Dependency Published          0          0             0
XTENDER.A                                                                      2818          2 Dependency Published          0          0             0
XTENDER.B                                                                       257          4 Dependency Published          0          0             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        3569          1 Result     Published          0          1             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        2469          3 Result     Published          0          1             0

теперь добавились еще один результат и одна зависимость

:p_tab:='v$instance'
Код: 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.
SQL> exec :p_tab:='v$instance';

PL/SQL procedure successfully completed.

SQL> select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;

NONDETER
----------
v$instance

1 row selected.

SQL> select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual;

NONDETER
----------
v$instance

1 row selected.

SQL> select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

NAME                                                                      BUCKET_NO         ID TYPE       STATUS     PIN_COUNT SCAN_COUNT INVALIDATIONS
------------------------------------------------------------------------ ---------- ---------- ---------- --------- ---------- ---------- -------------
XTENDER.F_NONDETERMINISTIC                                                     3191          0 Dependency Published          0          0             0
XTENDER.A                                                                      2818          2 Dependency Published          0          0             0
XTENDER.B                                                                       257          4 Dependency Published          0          0             0
PUBLIC.V$INSTANCE                                                              2308          6 Dependency Published          0          0             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        3569          1 Result     Published          0          1             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        2469          3 Result     Published          0          1             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        2794          5 Result     Published          0          1             0

видно что результат благополучно закэшировался и установил зависимость только от синонима PUBLIC.V$INSTANCE.

а вот, если сделать запрос к самому v$instance c хинтом, то он кэшироваться не будет
Код: 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.
SQL> select/*+ result_cache */ i.INSTANCE_NUMBER from v$instance i;

INSTANCE_NUMBER
---------------
              1

1 row selected.

SQL> select name,bucket_no, id,type,status,pin_count,scan_count,invalidations from v$result_cache_objects o order by type,id;

NAME                                                                      BUCKET_NO         ID TYPE       STATUS     PIN_COUNT SCAN_COUNT INVALIDATIONS
------------------------------------------------------------------------ ---------- ---------- ---------- --------- ---------- ---------- -------------
XTENDER.F_NONDETERMINISTIC                                                     3191          0 Dependency Published          0          0             0
XTENDER.A                                                                      2818          2 Dependency Published          0          0             0
XTENDER.B                                                                       257          4 Dependency Published          0          0             0
PUBLIC.V$INSTANCE                                                              2308          6 Dependency Published          0          0             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        3569          1 Result     Published          0          1             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        2469          3 Result     Published          0          1             0
select/*+ result_cache */ f_nondeterministic(:p_tab) nondeter from dual        2794          5 Result     Published          0          1             0

SQL> explain plan for select/*+ result_cache */ i.INSTANCE_NUMBER from v$instance i;

Explained.

SQL> @xplan

P_FORMAT
----------------
typical

1 row selected.


PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------
Plan hash value: 2848324471

-------------------------------------------------------------------------------------
| Id  | Operation             | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |   100 |  6000 |     0   (0)| 00:00:01 |
|   1 |  MERGE JOIN CARTESIAN |             |   100 |  6000 |     0   (0)| 00:00:01 |
|   2 |   MERGE JOIN CARTESIAN|             |     1 |    60 |     0   (0)| 00:00:01 |
|*  3 |    FIXED TABLE FULL   | X$KSUXSINST |     1 |    26 |     0   (0)| 00:00:01 |
|   4 |    BUFFER SORT        |             |     1 |    34 |     0   (0)| 00:00:01 |
|*  5 |     FIXED TABLE FULL  | X$KVIT      |     1 |    34 |     0   (0)| 00:00:01 |
|   6 |   BUFFER SORT         |             |   100 |       |     0   (0)| 00:00:01 |
|   7 |    FIXED TABLE FULL   | X$QUIESCE   |   100 |       |     0   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("KS"."INST_ID"=USERENV('INSTANCE'))
   5 - filter("KVITTAG"='kcbwst')

точно так же не будут кэшироваться запросы в которых присутствуют другие x$-таблицы, sysdate, systimestamp, current_date, current_timestamp, sys_guid, dbms_flashback.get_system_change_number или dbms_random (да наверное и вообще все из пакетов в SYS).
Но будут правильно кэшироваться:
sys_context
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> explain plan for select/*+ result_cache */ sys_context('userenv','os_user')  from dual;

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 1388734953

---------------------------------------------------------------------------------------
| Id  | Operation        | Name                       | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                            |     1 |     2   (0)| 00:00:01 |
|   1 |  RESULT CACHE    | 267m2hcwj08nq5kwxcb0nb2ka8 |       |            |          |
|   2 |   FAST DUAL      |                            |     1 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=1; attributes=(single-row); parameters=(sys_context);
        name="select/*+ result_cache */ sys_context('userenv','os_user')  from dual"

14 rows selected.

userenv
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> explain plan for select/*+ result_cache */ userenv('instance')  from dual;

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------
Plan hash value: 1388734953

---------------------------------------------------------------------------------------
| Id  | Operation        | Name                       | Rows  | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                            |     1 |     2   (0)| 00:00:01 |
|   1 |  RESULT CACHE    | dxzj3fks1sqfy35shbbst4332h |       |            |          |
|   2 |   FAST DUAL      |                            |     1 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

Result Cache Information (identified by operation id):
------------------------------------------------------

   1 - column-count=1; attributes=(single-row); parameters=(sys_context); 
       name="select/*+ result_cache */ userenv('instance')  from dual"

...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Об использовании result_cache при запросе из представления OWM
    #39540158
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нарыл хинт, так что можно и системные кэшировать

Код: plsql
1.
2.
3.
select /*+ RESULT_CACHE (SYSOBJ=TRUE)*/ count(*)
from dba_tables
where table_name like 'JO%'
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Об использовании result_cache при запросе из представления OWM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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