Pending statistics
发布日期:2021-09-16 04:38:35 浏览次数:37 分类:技术文章

本文共 3381 字,大约阅读时间需要 11 分钟。

Pending statistics
11gr2开始,可以使用下面类型的操作来收集优化器统计信息:
1. 自动发布收集的统计信息在收集操作结束以后(默认选项publish)
2. 保存新的统计信息,并且待定(暂不发布pending)
这个特性可以将新收集的统计信息置为待定状态,所以可以先验证新统计信息的有效性然后再发布

有两个场景会使用到,去验证执行计划

1、当pending statistics收集后,在session级别设置optimizer_use_pending_statistics =true,运行查询,检查性能执行计划等
2、用EXPORT_PENDING_STATS导出pending statistics,去测试库,运行查询,检查性能执行计划等
Pending statistics 可以导出,发布,删除
DELETE_PENDING_STATS Procedure
EXPORT_PENDING_STATS Procedure
PUBLISH_PENDING_STATS Procedure
设置表的Pending statistics 
Exec dbms_stats.set_table_prefs('<owner_schema>','<Table_Name>','PUBLISH','FALSE');
True表示新的统计信息收集后即发布,也就是说优化器会使用新的统计信息来生查询计划,False表示收集的统计信息会被放入USER_TAB_PENDING_STATS和 USER_IND_PENDING_STATS,并且不会立刻被优化器使用,为待定状态。
 可以使用下面的命令来查看是否默认发布新的统计信息
select dbms_stats.get_prefs('PUBLISH', '<owner_schema>', '<Table_name>' ) FROM DUAL;
Once pending statistics have been collected, there is a parameter, OPTIMIZER_USE_PENDING_STATISTICS, which specifies whether or not the optimizer uses pending 
statistics when compiling SQL statements. The Default for this is 'FALSE'. Once pending statistics have been collected you could change 
OPTIMIZER_USE_PENDING_STATISTICS to 'TRUE' at the session level to check how SQL statements perform with the new statistics before making them 'live'.

举例:

SQL>  Create table test as select * from dba_objects;

表已创建。
SQL> SELECT LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME='TEST';
LAST_ANALYZED
--------------
SQL> select dbms_stats.get_prefs('PUBLISH', 'SCOTT', 'TEST' ) FROM DUAL;
DBMS_STATS.GET_PREFS('PUBLISH','SCOTT','TEST')
------------------------------------------------------------------------------------------------
TRUE
SQL>  Exec dbms_stats.set_table_prefs('SCOTT','TEST','PUBLISH','FALSE');
PL/SQL 过程已成功完成。
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','TEST');
PL/SQL 过程已成功完成。
SQL>  SELECT LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME='TEST';
LAST_ANALYZED
--------------
SQL>  SELECT table_name, last_analyzed  FROM dba_tab_pending_stats  WHERE table_name='TEST';
TABLE_NAME                     LAST_ANALYZED
------------------------------ --------------
TEST                           09-8月 -15

alter session set optimizer_use_pending_statistics = TRUE;

在session级别优化器是可以查看到pending statistics统计信息,然后查看sql语句的性能
SQL> SELECT LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME='TEST';
LAST_ANALYZED
--------------
在此测试sql语句收集统计信息后的性能
这样在session级别内就可以使用待定的统计信息来编译sql语句并且生成查询计划,如果新的统计信息已经被验证,那么可以使用下面的语句发布统计信息。

SQL> Exec dbms_stats.publish_pending_stats('SCOTT','TEST');

SQL> SELECT LAST_ANALYZED FROM DBA_TABLES WHERE TABLE_NAME='TEST';

LAST_ANALYZED
--------------
09-8月 -15
如果不想使用新的统计信息,那么可以使用下面的语句去删除。
Execdbms_stats.delete_pending_stats('owner','tablename');

如果已经发布了统计信息,想要恢复从前的统计信息,可以根据user_TAB_STATS_HISTORY中的stats_update_time,来确定timestamp,执行下面的操作,
最后一个参数as_of_timestamp指的是恢复在这个时间点生效的统计信息,
select h.table_name,to_char(h.STATS_UPDATE_TIME, 'yyyymmddhh24miss')  from user_TAB_STATS_HISTORY h
  where h.table_name = 'TEST';
exec  dbms_stats.restore_table_stats(ownname => 'SCOTT',tabname =>'TEST',as_of_timestamp => to_date('20150805161309','yyyymmddhh24miss'));

可以使用下面的包来改变各个级别(global,schema,table)的默认publish选项。

Global
exec Dbms_stats.set_global_prefs(pname =>'PUBLISH' ,pvalue=> 'FALSE') ;
Schema
exec dbms_stats.set_schema_prefs(ownname => 'DEXTER',pname=>'PUBLISH' ,pvalue => 'TRUE') ;
table
Exec dbms_stats.set_table_prefs('DEXTER', 'PUBLISH_TEST','PUBLISH', 'false');

查看:

How to Use Pending Statistics (文档 ID 1456776.1)

转载地址:https://blog.csdn.net/wll_1017/article/details/47375023 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Transfer Statistics from one Database to Another
下一篇:Netstat 简介

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月13日 00时26分55秒