如何清除某条SQL在库缓存中的执行计划

简介: DBA 日常管理过程中会遇到需要把特定的sql语句的执行计划从shared pool 中清除或者需要重新生产新的执行计划的要求。通常的alter system flush shared_pool;或者重新执行信息统计又会造成较大的影响,所以可以使用oracle提供的dbms_shared_pool.purge 来清除某个特定的sql的执行计划。

DBA 日常管理过程中会遇到需要把特定的sql语句的执行计划从shared pool 中清除或者需要重新生产新的执行计划的要求。通常的alter system flush shared_pool;或者重新执行信息统计又会造成较大的影响,所以可以使用oracle提供的
dbms_shared_pool.purge 来清除某个特定的sql的执行计划。

下面是关于dbms_shared_pool.purge 的官方介绍:
The syntax for the DBMS_SHARED_POOL.PURGE package is:
procedure purge (name varchar2, flag char DEFAULT 'P', heaps number DEFAULT 1);   

name: 指定要处理的对象的名称,有两种情况:
1  PL/SQL 对象 就是对象的名称
2  SQL对象,指定 'address','hash_value' 的 SQL 游标。
标记位 flag是可选的。如果忽略了该参数,则该包默认是包,过程,函数的名称并且忽视名称。否则,该参数就指定一个对象类型。标记位是大小写敏感的。
标记位代表的对象类型:
         Value Kind of Object to keep  
        ----- ----------------------  
            P package/procedure/function  
            Q sequence  
            R trigger  
            T type  
           JS java source  
           JC java class  
           JR java resource  
           JD java shared data  
            C cursor   --游标

  heaps: heaps to purge. e.g if heap 0 and heap 6 are to be purged.  
         1 hex 0x41 => decimal 65. so specify heaps=>65.  
         Default is 1 i.e heap 0 which means the whole object will be purged. 

实验环境 版本:11.2.0.1.0    dbms_shared_pool.purge 只能通过dba才能使用
oracle@rac1:rac1 /home/oracle>sqlplus  yang/yang
SQL*Plus: Release 11.2.0.1.0 Production on Fri Jul 8 15:32:43 2011

yang@rac1>create table yangtab (id int) ;
Table created.
yang@rac1>select * from yangtab;
no rows selected
yang@rac1>select address,hash_value,executions,parse_calls
  2  from v$sql where sql_text like 'select * from yangtab%';
ADDRESS          HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736EFBB8 3337951036          1           1

yang@rac1>exec dbms_shared_pool.purge('00000001736EFBB8,3337951036','C');
BEGIN dbms_shared_pool.purge('00000001736EFBB8,3337951036','C'); END;

      *
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'DBMS_SHARED_POOL.PURGE' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


yang@rac1>conn /as sysdba
Connected.
sys@rac1>create table yangt (id int);
Table created.
sys@rac1>select * from yangt;
no rows selected
sys@rac1>select address,hash_value,executions,parse_calls
  2  from v$sql where sql_text like 'select * from yangt%';

ADDRESS          HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
00000001736EFBB8 3337951036          1           1 -- 使用普通用户时生成的。
0000000170D9BA50 2693392179          1           1
使用dbms_shared_pool.purge 删除第一个sql的游标。
sys@rac1> exec dbms_shared_pool.purge('00000001736EFBB8,3337951036','C');
PL/SQL procedure successfully completed.

sys@rac1>select address,hash_value,executions,parse_calls
  2  from v$sql where sql_text like 'select * from yangt%';
 
ADDRESS          HASH_VALUE EXECUTIONS PARSE_CALLS
---------------- ---------- ---------- -----------
0000000170D9BA50 2693392179          1           1

sys@rac1>exec dbms_shared_pool.purge('0000000170D9BA50,2693392179','C');
PL/SQL procedure successfully completed.

sys@rac1>select address,hash_value,executions,parse_calls
  2 from v$sql where sql_text like 'select * from yangt%'
no rows selected

目录
相关文章
|
1月前
|
SQL 索引
19. 一个SQL语句执行很慢, 如何分析
该内容介绍了如何分析执行慢的SQL语句。首先启用慢查询日志或使用命令获取慢查询的SQL。然后利用`EXPLAIN`命令分析,关注其中的`select_type`, `type`, 和 `extra`字段。`select_type`涉及子查询和联合查询的类型,`type`表示查询优化器使用的访问类型,性能从上到下递减,`extra`字段提供额外信息,如是否使用索引等。
19 0
|
1月前
|
SQL 数据库 索引
SQL索引失效原因分析与解决方案
SQL索引失效原因分析与解决方案
28 0
|
1月前
|
SQL 缓存 关系型数据库
日志系统:一条SQL更新语句是如何执行的?
本文探讨了MySQL中更新语句的执行流程和日志系统,包括redo log(重做日志)和binlog(归档日志)的作用。更新语句会经过连接器、分析器、优化器和执行器,同时涉及redo log和binlog以确保数据的安全性和一致性。redo log用于快速更新并保证crash-safe,采用Write-Ahead Logging策略,先写入redo log再更新磁盘。binlog则是逻辑日志,用于归档和数据恢复。两阶段提交保证redo log和binlog的一致性。文章还提到,定期全量备份的频率影响数据库系统的恢复能力和数据安全性。
10 0
日志系统:一条SQL更新语句是如何执行的?
|
2月前
|
SQL 数据库 索引
解决SQL报错:索引中丢失IN或OUT參数
解决SQL报错:索引中丢失IN或OUT參数
|
SQL 存储 自然语言处理
SQL语句命中索引,但还是执行很慢
MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值(默认值10s)的SQL,则会被记录到慢查询日志中。
260 0
|
SQL 存储 Oracle
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
Oracle数据库 | SQL语句执行计划、语句跟踪与优化实例
264 0
|
SQL 测试技术 Go
SQL日志太大?教你一键清理
最近数据仓库时不时爆磁盘空间不足,导致定时任务执行失败,这可了得,要知道定时任务执行的可是每天的业务数据。 仔细检查,发现是日志文件爆满,这是咋回事呢? 原来数据仓库中,每天的定时任务需要从其他系统里面抽取数据过来,导致数据文件和日志文件的磁盘空间都增长的飞快。 数据不能清理,但是日志文件是可以清理的,说干就干。
SQL日志太大?教你一键清理
SQL物化视图 自动更新 定时刷新
SQL物化视图 自动更新 定时刷新http://www.bieryun.com/3483.html 创建定时刷新-------------------------------------------------------------- create  MATERIALIZED VIEW LOG.
2493 0
|
SQL 关系型数据库
SQL更新部分字段或者插入新数据
SQL更新部分字段或者插入新数据http://www.bieryun.com/3184.html 因为业务的原因,一张表的数据需要整合两张外键关联不强的表数据,这里涉及到更新部分字段或者插入新数据。
1551 0