Oracle 11g的统计信息功能增强

在11g中,Oracle在统计信息方面进行了进一步的增强。

这篇介绍PENDING统计信息。

在10g中,Oracle提供了恢复统计信息的方法,这使得统计信息收集后造成的问题可以通过恢复原始统计信息的方法快速解决。

在11g中,Oracle更进了一步,用户收集的统计可以设置为悬而未决的,等到统计信息验证过然后在发布到数据字典中。

SQL> SELECT * FROM V$VERSION;

BANNER

--------------------------------------------------------------------------------

Oracle Database11gEnterprise Edition Release11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> SELECT DBMS_STATS.GET_PREFS('PUBLISH') FROM DUAL;

DBMS_STATS.GET_PREFS('PUBLISH')

-----------------------------------------------------------------------------------

TRUE

这个查询用于检查收集的统计信息是否即时生效,默认情况下,用DBMS_STATS包收集的统计信息会马上更新到数据字典中,并对优化器生效。

SQL> CREATE TABLE T (ID NUMBER);

表已创建。

SQL> INSERT INTO T SELECT ROWNUM FROM TAB;    

已创建24行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')

PL/SQL过程已成功完成。

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> SELECT TABLE_NAME, NUM_ROWS, BLOCKS, LAST_ANALYZED

2  FROM USER_TABLES

3  WHERE TABLE_NAME = 'T';

TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED

------------------------------ ---------- ---------- -------------------

T                                      24          5 2010-10-28 08:04:50

这时默认的情况,如果修改全局设置,使得PENDING方式生效:

SQL> EXEC DBMS_STATS.SET_TABLE_PREFS(USER, 'T', 'PUBLISH', 'FALSE')

PL/SQL过程已成功完成。

SQL> DELETE T;

已删除24行。

SQL> INSERT INTO T SELECT ROWNUM FROM ALL_OBJECTS;

已创建69442行。

SQL> COMMIT;

提交完成。

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')

PL/SQL过程已成功完成。

SQL> SELECT TABLE_NAME, NUM_ROWS, BLOCKS, LAST_ANALYZED

2  FROM USER_TABLES

3  WHERE TABLE_NAME = 'T';

TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED

------------------------------ ---------- ---------- -------------------

T                                      24          5 2010-10-28 08:04:50

可以看到,新收集的统计信息并没有覆盖数据字典中原始的统计信息,这是因为表T的全局属性被修改,此时收集的统计信息并不会马上发布,而是至于PENDING状态,可以通过查询数据字典USER_TAB_PENDING_STATS获取PENDING统计信息:

SQL> SELECT TABLE_NAME, NUM_ROWS, BLOCKS, LAST_ANALYZED

2  FROM USER_TAB_PENDING_STATS

3  WHERE TABLE_NAME = 'T';

TABLE_NAME                       NUM_ROWS     BLOCKS LAST_ANALYZED

------------------------------ ---------- ---------- -------------------

时间: 2024-08-03 08:07:28

Oracle 11g的统计信息功能增强的相关文章

如何启用oracle 11g自动收集统计信息

今天接到朋友数据库一个case,在DBCA建库时,把自动收集统计信息的选项去掉了,数据库运行半年没有收集过统计信息,现在要启用方法如下: exec DBMS_AUTO_TASK_ADMIN.ENABLE(); exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection',operation =>'auto optimizer stats job',window_name=> null);

oracle 11g 收集统计信息的新特点介绍

对组合列创建统计信息 --检查表结构 select * from scott.emp where 1=2; --创建虚拟列 会输出虚拟列名 select dbms_stats.create_extended_stats('scott','emp','(empno,JOB)') from dual; select * from dba_tab_cols where column_name like 'SYS_STU%'; --查看列名 select * from dba_tab_cols a wh

[20150705]11G表统计信息与PUBLISH.txt

[20150705]11G表统计信息与PUBLISH.txt --11G表统计信息可以先不发布(在PUBLISH参数的控制下),等检测合适再发布. --确实参数optimizer_use_pending_statistics为false,可以在session级别打开为true,检测统计是否有用. SYS@test> @hide optimizer_use_pending_statistics NAME                              DESCRIPTION       

Oracle 10g的统计信息恢复功能

从10g开始,Oracle可以恢复错误的统计信息. 这篇简单介绍统计信息恢复功能. 统计信息的不准确可能导致无法产生最优的执行计划,对于大部分的情况下,最新的统计信息能反映当前系统数据的分布,从而产生最优的执行计划.但是有时候收集统计信息后造成的执行计划的改变并非一定导致性能的提升,优化器很可能找到一个新的执行计划,但是新的执行计划的运行效果不一定比以前的执行计划高,从而导致整个系统性能的下降. 对于这种情况,在9i中唯一的办法就是收集统计信息之前将原有的统计信息导出,如果出现了问题,那么利用导

Oracle多列统计信息

Oracle多列统计信息    通常,当我们将SQL语句提交给Oracle数据库时,Oracle会选择一种最优方式来执行,这是通过查询优化器Query Optimizer来实现的.CBO(Cost-Based Optimizer)是Oracle默认使用的查询优化器模式.在CBO中,SQL执行计划的生成,是以一种寻找成本(Cost)最优为目标导向的执行计划探索过程.所谓成本(Cost)就是将CPU和IO消耗整合起来的量化指标,每一个执行计划的成本就是经过优化器内部公式估算出的数字值.      

Oracle 还原历史统计信息

      统计信息是个非常有用的东东,没有它,SQL优化器就好比巧妇难为无米之炊!良好高效的SQL执行计划依赖于真实的统计信息.然而在有些情况下,比如对比生产环境与测试环境执行计划,需要使用生产环境的统计信息.而有时候呢则需要还原Oracle历史统计信息.本文基于后者即如何还原历史统计信息来展开,同时描述了11g缺省情况下对于统计信息的调度.       有关统计信息的导入导出可以参考:            dbms_stats 导入导出 schema 级别统计信息            d

如何使用Oracle脚本获得统计信息

以下脚本可以获取某张表的统计信息,觉得很好,在此记下. 声明:脚本来自<Pro Oracle SQL>一书,st-all.sql 简单演示: luocs@MAA> select * from tab; TNAME                                                        TABTYPE         CLUSTERID ----------------------------------------------------------

Oracle 10g恢复统计信息的限制

恢复统计信息操作也存在一些限制,比如无法恢复用户自定义的统计信息.除此之外由于统计信息是表的属性,因此如果表被删除,则对应的统计备份也被清除,而TRUNCATE操作则并不会影响统计备份信息: SQL> CREATE TABLE T (ID NUMBER); Table created. SQL> INSERT INTO T SELECT ROWNUM FROM TAB; 96 rows created. SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(US

Oracle 10g恢复统计信息的相关函数和过程

上一篇简单介绍了恢复统计信息的方法,这一篇介绍相关的视图和函数. 在上一篇提到了如果要恢复统计信息,必须提供恢复的TIMESTAMP,而这个时间戳通过USER_TABLES视图是无法获得准确信息的,因此对于表而言,可以查询USER_TAB_STATS_HISTORY视图,而对于SCHEMA和数据库级的恢复时间戳可以查询DBA_OPTSTAT_OPERATIONS视图: SQL> SELECT OPERATION, 2  TO_CHAR(START_TIME, 'YYYY-MM-DD HH24:M