Oracle删除一条SQL在Shared Pool里缓存的执行计划的三(3)

从上面的输出可以看出,对表s1做DDL操作后缓存在Shared Pool里的执行计划没有被清除,但是两个SQL对应的执行计划状态都变为了“INVALID_UNAUTH”,当再次执行SQL时会做硬解析,重新缓存解析树和执行计划。

3、dbms_shared_pool.purge包

它是从Oracle 10.2.0.4开始引入的一种方法,它可以用来删除指定的缓存在库缓存中的Shared Cursor,其影响范围公限于目标SQL所对应的Shared Cursor,也就是说它可以做到让Oracle在执行目标SQL时使用硬解析,在执行其他所有SQL时都和原来一样保持不变。

zx@MYDB>alter system flush shared_pool;
 
System altered.
 
zx@MYDB>select object_name from s1 where object_id=20;
 
OBJECT_NAME
------------------------------
ICOL$
 
zx@MYDB>select object_name from s1 where object_id=30;
 
OBJECT_NAME
------------------------------
I_COBJ#
 
zx@MYDB>select sql_text,sql_id,version_count,executions,OBJECT_STATUS,address,hash_value from v$sqlarea where sql_text like 'select object_name from s%';
 
SQL_TEXT                            SQL_ID                    VERSION_COUNT EXECUTIONS OBJECT_STATUS  ADDRESS        HASH_VALUE
------------------------------------------------------------ --------------------------------------- ------------- ---------- --------------- ---------------- ----------
select object_name from s1 where object_id=20          1s45nwjtws2tj                  1    1 VALID          00000000B4F85A18 1942752049
select object_name from s1 where object_id=30          1hdyqyxhtavqs                  1    1 VALID          00000000BE7E56C8 1637183192

现在要删除object_id=20对应的SQL缓存的执行计划和解析树。

zx@MYDB>exec sys.dbms_shared_pool.purge('00000000B4F85A18,1942752049','C');
 
PL/SQL procedure successfully completed.
 
zx@MYDB>select sql_text,sql_id,version_count,executions,OBJECT_STATUS,address,hash_value from v$sqlarea where sql_text like 'select object_name from s%';
 
SQL_TEXT                            SQL_ID                    VERSION_COUNT EXECUTIONS OBJECT_STATUS  ADDRESS        HASH_VALUE
------------------------------------------------------------ --------------------------------------- ------------- ---------- --------------- ---------------- ----------
select object_name from s1 where object_id=30          1hdyqyxhtavqs                  1    1 VALID          00000000BE7E56C8 1637183192

从输出可以看出object_id=20对应的SQL缓存的执行计划和解析树被删除了,而object_id=30对应的SQL的执行计划没有受影响。

需要注意的是,如果在10.2.0.4中使用dbms_shared_pool.purge,则在使用之前必须特工设置event 5614566(alter session set events '5614566 trace name context forever'),否则dbms_shared_pool.purge将不起作用,这个限制在10.2.0.4以上的版本中已经不存在了。如果默认没有安装dbms_shared_pool包的可以执行@?/rdbms/admin/dbmspool.sql

官方文档:

参考:《基于Oracle的SQL优化》 PDF下载见

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/008e244fedff0dc5e7f608eeb02b4f1a.html