ITPub博客

首页 > 数据库 > Oracle > [20230705]提示result_cache与调用执行次数.txt

[20230705]提示result_cache与调用执行次数.txt

原创 Oracle 作者:lfree 时间:2023-07-23 20:28:01 0 删除 编辑

[20230705]提示result_cache与调用执行次数.txt

--//简单探究提示result_cache与调用执行次数.

1.环境:
SCOTT@test01p> @ver1
PORT_STRING                    VERSION        BANNER                                                                               CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

--//以sys用户执行:
grant EXECUTE ON  dbms_lock to scott;
grant dba to scott;

CREATE OR REPLACE FUNCTION SCOTT.sleep (seconds IN NUMBER)
   RETURN NUMBER
AS
BEGIN
   sys.DBMS_LOCK.sleep (seconds);
   RETURN seconds;
END;
/

--//exec dbms_result_cache.flush;

2.测试1:

SCOTT@test01p> set timing on
SCOTT@test01p> select /*+ result_cache */ sleep(1) from dual;
  SLEEP(1)
----------
         1
Elapsed: 00:00:02.12

--//从执行需要时间2.12秒看,至少调用sleep函数2次.
SCOTT@test01p> @  hash
HASH_VALUE SQL_ID        CHILD_NUMBER KGL_BUCKET PLAN_HASH_VALUE HASH_HEX   SQL_EXEC_START      SQL_EXEC_ID
---------- ------------- ------------ ---------- --------------- ---------- ------------------- -----------
1138656018 5rnkp151xx0sk            0      33554      1388734953  43de8312  2023-07-05 21:36:37    16777216

SCOTT@test01p> @ tpt/sqlid  5rnkp151xx0sk %
Show SQL text, child cursors and execution stats for SQLID 5rnkp151xx0sk child %
HASH_VALUE PLAN_HASH_VALUE   CH# SQL_TEXT
---------- --------------- ----- ------------------------------------------------------------------------------------------------------------------------------------------------------
1138656018      1388734953     0 select /*+ result_cache */ sleep(1) from dual

Elapsed: 00:00:00.04
  CH#  PLAN_HASH     PARSES   H_PARSES EXECUTIONS    FETCHES ROWS_PROCESSED ROWS_PER_FETCH CPU_SEC_EXEC ELA_SEC_EXEC LIOS_PER_EXEC PIOS_PER_EXEC TOTAL_CPU_SEC TOTAL_ELA_SEC TOTAL_IOWAIT_SEC TOTAL_LIOS TOTAL_PIOS      SORTS USERS_EXECUTING LAST_ACTIVE_TIME    PARENT_HANDLE    OBJECT_HANDLE
----- ---------- ---------- ---------- ---------- ---------- -------------- -------------- ------------ ------------ ------------- ------------- ------------- ------------- ---------------- ---------- ---------- ---------- --------------- ------------------- ---------------- ----------------
    0 1388734953          1          1          1          1              1              1         .047         .126           853             9          .047          .126          .070646        853          9          0               0 2023-07-05 21:36:39 000007FF1589B1A8 000007FF1589AC48
Elapsed: 00:00:00.02

--//从执行次数看语句仅仅执行1次,很明显在加入result_cache时,如果result cache没有命中的情况下,调用sleep函数2次.
--//再次执行:

SCOTT@test01p> select /*+ result_cache */ sleep(1) from dual;
  SLEEP(1)
----------
         1
Elapsed: 00:00:00.02
--//如果result cache没有命中的情况下,调用sleep函数0次.

SCOTT@test01p> select * from v$result_cache_objects where lower(name) like '%sleep%'
  2   @pr
==============================
ID                            : 252
TYPE                          : Dependency
STATUS                        : Published
BUCKET_NO                     : 4006
HASH                          : 1279713190
NAME                          : SCOTT.SLEEP
NAMESPACE                     :
CREATION_TIMESTAMP            : 2023-07-05 21:36:38
CREATOR_UID                   : 81
DEPEND_COUNT                  : 1
BLOCK_COUNT                   : 1
SCN                           : 15465384
COLUMN_COUNT                  : 0
PIN_COUNT                     : 0
SCAN_COUNT                    : 0
ROW_COUNT                     : 0
ROW_SIZE_MAX                  : 0
ROW_SIZE_MIN                  : 0
ROW_SIZE_AVG                  : 0
BUILD_TIME                    : 0
LRU_NUMBER                    : 0
OBJECT_NO                     : 22915
INVALIDATIONS                 : 0
SPACE_OVERHEAD                : 0
SPACE_UNUSED                  : 0
CACHE_ID                      : SCOTT.SLEEP
CACHE_KEY                     : SCOTT.SLEEP
CHECKSUM                      : 0
EDITION_ID                    : 0
DB_LINK                       : No
CON_ID                        : 3
==============================
ID                            : 225
TYPE                          : Result
STATUS                        : Published
BUCKET_NO                     : 549
HASH                          : 1367958053
NAME                          : select /*+ result_cache */ sleep(1) from dual
NAMESPACE                     : SQL
CREATION_TIMESTAMP            : 2023-07-05 21:36:38
CREATOR_UID                   : 81
DEPEND_COUNT                  : 1
BLOCK_COUNT                   : 1
SCN                           : 15465384
COLUMN_COUNT                  : 1
PIN_COUNT                     : 0
SCAN_COUNT                    : 1
ROW_COUNT                     : 1
ROW_SIZE_MAX                  : 5
ROW_SIZE_MIN                  : 5
ROW_SIZE_AVG                  : 5
BUILD_TIME                    : 100
LRU_NUMBER                    : 93
OBJECT_NO                     : 0
INVALIDATIONS                 : 0
SPACE_OVERHEAD                : 325
SPACE_UNUSED                  : 375
CACHE_ID                      : bvvy8dkvmhfgh2qr0t4vm48uzw
CACHE_KEY                     : g1w90h24jk80m8vu74drbxqadr
CHECKSUM                      : 2611632069
EDITION_ID                    : 133
DB_LINK                       : No
CON_ID                        : 3
PL/SQL procedure successfully completed.


3.测试2:
--//加入DETERMINISTIC呢?
CREATE OR REPLACE FUNCTION SCOTT.sleep1 (seconds IN NUMBER)
   RETURN NUMBER
   DETERMINISTIC
AS
BEGIN
   sys.DBMS_LOCK.sleep (seconds);
   RETURN seconds;
END;
/

SCOTT@test01p> select /*+ result_cache */ sleep1(1) from dual;
 SLEEP1(1)
----------
         1
Elapsed: 00:00:01.02

--//很明显这样sleep1在result cache没有命中的情况下,调用1次。这个有点像以前的标量子查询.

SCOTT@test01p> select /*+ result_cache */ sleep1(1) from dual;
 SLEEP1(1)
----------
         1
Elapsed: 00:00:00.00

4.测试3:
--//加入RESULT_CACHE呢?

CREATE OR REPLACE FUNCTION SCOTT.sleep2 (seconds IN NUMBER)
   RETURN NUMBER
   RESULT_CACHE
AS
BEGIN
   sys.DBMS_LOCK.sleep (seconds);
   RETURN seconds;
END;
/


SCOTT@test01p> select /*+ result_cache */ sleep2(1) from dual;
 SLEEP2(1)
----------
         1
Elapsed: 00:00:01.01

SCOTT@test01p> select /*+ result_cache */ sleep2(1) from dual;
 SLEEP2(1)
----------
         1
Elapsed: 00:00:00.00

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2965855/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    4006
  • 访问量
    7969477