PLSQL_统计信息系列08_统计信息生成和还原

2015-02-01 Created By BaoXinjian

一、摘要


统计信息在重新生成后,发现并不能改善程序的性能,甚至更差的时候

Oracle提供了dbms_stat包,对统计信息进行还原

1. 还原步骤如下

Step1. Regather the stats of the tables involved in the query. 重新产生统计信息;

Step2. Check the excution plan of the SQL with explain plan. 统计信息更新后解析计划效果;

Step3. If the plan changes back, ask to kill the current running job and re-run it. 如果效果可以,则杀掉该进程,重启程序;

Step4. If regather doesn't work, try to restore the stats of the table whose stats are gathered recently. 如效果不行,则对计息计划进行还原;

 

2. 获取解析计划的脚本

set pagesize 0
set linesize 150
set serveroutput on size 10000
col plan_table_output format a125
undefine hash_value
set verify off feedback off
var hash_value varchar2(20)
begin
  :hash_value := '&hash_value';
end;
/
insert into plan_table
      (statement_id,timestamp,operation,options,object_node,object_owner,object_name,
       optimizer,search_columns,id,parent_id,position,cost,cardinality,bytes,other_tag,
       partition_start,partition_stop,partition_id,other,distribution,
       cpu_cost,io_cost,temp_space,access_predicates,filter_predicates,
       plan_id,OBJECT_ALIAS,DEPTH,PROJECTION,TIME,QBLOCK_NAME
      )
select distinct hash_value,sysdate,operation,options,object_node,object_owner,object_name,
       optimizer,search_columns,id,parent_id,position,cost,cardinality,bytes,other_tag,
       partition_start,partition_stop,partition_id,other,distribution,
       cpu_cost,io_cost,temp_space,access_predicates,filter_predicates,
       :hash_value,OBJECT_ALIAS,DEPTH,PROJECTION,TIME,QBLOCK_NAME
  from v$sql_plan
 where hash_value = :hash_value
/
col piece noprint
select distinct piece,sql_text from v$sqltext where hash_value = :hash_value order by piece
/
@?/rdbms/admin/utlxplp.sql
set linesize 80
set verify on feedback on pagesize 1000
Get Explain Plan Scripts

 

二、案例


Step1. 获取Session对应的sql_id

  SELECT   b.begin_interval_time, a.sql_id, a.plan_hash_value
    FROM   dba_hist_sqlstat a, dba_hist_snapshot b
   WHERE   a.snap_id = b.snap_id 
     AND   a.SQL_ID = '<SQL_ID>'
ORDER BY   1;

 

Step2. 获取解析计划

SQL> @getplan
Enter value for hash_value: 684487124
ALTER DATABASE OPEN

----------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT             |                     |       |       |     1 (100)|          |
|   1 |  UPDATE                      | MGMT_TARGETS        |       |       |            |          |
|*  2 |   TABLE ACCESS BY INDEX ROWID| MGMT_TARGETS        |     1 |   182 |     1   (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN         | MGMT_TARGETS_IDX_01 |     1 |       |     0   (0)|          |
----------------------------------------------------------------------------------------------------

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

   2 - filter(("LAST_LOAD_TIME"<:B2 OR "LAST_LOAD_TIME" IS NULL))
   3 - access("TARGET_GUID"=:B1)

 

Step3. 重新分析表,收集统计信息

BEGIN
   DBMS_STATS.GATHER_TABLE_STATS (
      ownname            => '<TABLE OWNER>',
      tabname            => '<TABLE NAME>',
      degree             => 8,
      method_opt         => 'FOR ALL COLUMNS SIZE 1',
      cascade            => TRUE,
      estimate_percent   => 1,
      GRANULARITY        => 'GLOBAL AND PARTITION',
      no_invalidate      => FALSE
   );
END

 

Step4. 再次getplan获取计划,查看解析计划是否更新,更新后的解析计划是否正确

 

Step5. 若新的解析计划不正确,对统计信息进行回滚

BEGIN
  DBMS_STATS.RESTORE_TABLE_STATS('TABLE OWNER','TABLE NAME', <TIMESTAMP>, NO_INVALIDATE=>FALSE);
END;

 

Thanks and Regards

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
plsql_developer 12.0.1 是一种数据库开发工具,主要用于编写、调试、调优和管理 Oracle 数据库 的 PL/SQL 代码。它是由全球领先的 Oracle 数据库技术提供商开发的,使用起来方便且功能强大。 plsql_developer 12.0.1 提供了一整套的工具和功能,使得开发人员可以更高效地处理数据库开发任务。它的界面简洁、直观,操作容易上手,适合各种技术水平的用户。 使用 plsql_developer 12.0.1,开发人员可以轻松地编写和编辑 PL/SQL 代码。它提供了强大的代码编辑功能,包括代码补全、语法高亮、自动缩进、代码折叠等,使得编写代码更加快速和准确。开发人员还可以使用 plsql_developer 12.0.1 中的调试功能来调试他们的代码,包括设置断点、逐行执行、变量查看等,提高了调试效率。 plsql_developer 12.0.1 还提供了各种性能调优工具,帮助开发人员分析和优化数据库的性能。开发人员可以使用 SQL 跟踪,监视 SQL 语句的执行情况,找出性能瓶颈并提供优化建议。此外,它还提供了数据库分析和监控工具,帮助开发人员监控数据库的运行状态,及时发现和解决潜在的问题。 除了以上功能,plsql_developer 12.0.1 还支持版本管理,可以方便地管理和追踪不同版本的代码。它还提供了兼容性检查工具,确保代码在不同版本的 Oracle 数据库上都能正确运行。 总的来说,plsql_developer 12.0.1 是一款强大的数据库开发工具,提供了丰富的功能和工具,帮助开发人员更高效地进行数据库开发和管理。无论是初学者还是专业人士,都可以使用它来简化开发流程,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值