收集统计信息导致索引被监控

      对于索引的调整,我们可以通过Oracle提供的索引监控特性来跟踪索引是否被使用。尽管该特性并未提供索引使用的频度,但仍不失为我们参考的方式之一。然而,最近在Oracle 10.2.0.3中发现收集统计信息时导致索引也被监控,而不是用于sql查询引发的索引监控。如此这般,索引监控岂不是鸡肋?

 

1、基于Oracle 10g 收集统计信息索引被监控情形

scott@CNMMBO> select * from v$version where rownum<2;

BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.3.0 - 64bit Production

--创建临时表t
scott@CNMMBO> create table t(id number constraint t_pk primary key);

Table created.

--启用索引监控
scott@CNMMBO> alter index t_pk monitoring usage;

Index altered.

--查看对象的使用情况
scott@CNMMBO> select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     Table Name        MON USE START_MONITORING    END_MONITORING
------------------------------ ----------------- --- --- ------------------- -------------------
T_PK                           T                 YES NO  03/22/2013 20:53:23

--收集表t上的统计信息
scott@CNMMBO> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true);

PL/SQL procedure successfully completed.

--下面的查询中提示索引没有被使用
--这应该是由于表上没有数据的缘故,也就不存在对应的索引段
scott@CNMMBO> select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     Table Name        MON USE START_MONITORING    END_MONITORING
------------------------------ ----------------- --- --- ------------------- -------------------
T_PK                           T                 YES NO  03/22/2013 20:53:23

--下面尝试插入两条数据
scott@CNMMBO> insert into t select 1 from dual;

1 row created.

scott@CNMMBO> insert into t select 2 from dual;

1 row created.

--再次收集统计信息
scott@CNMMBO> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true);

PL/SQL procedure successfully completed.

--Author : Robinson
--Blog   : http://blog.csdn.net/robinson_0612

--这下子,索引变成了已经被使用
scott@CNMMBO> select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     Table Name         MON USE START_MONITORING    END_MONITORING
------------------------------ ------------------ --- --- ------------------- -------------------
T_PK                           T                  YES YES 03/22/2013 20:53:23

2、基于Oracle 11g收集统计信息索引被监控情形

SQL> select * from v$version where rownum<2;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

--下面的操作与上面雷同
SQL> create table t(id number constraint t_pk primary key);

Table created.

SQL> alter index t_pk monitoring usage;

Index altered.

SQL> set linesize 190
SQL> select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     TABLE_NAME        MON USE START_MONITORING    END_MONITORING
------------------------------ ----------------- --- --- ------------------- -------------------
T_PK                           T                 YES NO  03/22/2013 20:37:57

SQL> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true);

PL/SQL procedure successfully completed.

SQL> select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     TABLE_NAME       MON USE START_MONITORING    END_MONITORING
------------------------------ ---------------- --- --- ------------------- -------------------
T_PK                           T                YES NO  03/22/2013 20:37:57

SQL> insert into t select 111 from dual;

1 row created.

SQL> insert into t select 222 from dual;

1 row created.

SQL> commit;

Commit complete.

SQL> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true);

PL/SQL procedure successfully completed.

--可以看出,插入数据后,收集统计信息并不会导致索引被使用
SQL> select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     TABLE_NAME       MON USE START_MONITORING    END_MONITORING
------------------------------ ---------------- --- --- ------------------- -------------------
T_PK                           T                YES NO  03/22/2013 20:37:57

SQL> select index_name,NUM_ROWS,SAMPLE_SIZE,LAST_ANALYZED from dba_indexes where index_name='T_PK';

INDEX_NAME                       NUM_ROWS SAMPLE_SIZE LAST_ANALYZED
------------------------------ ---------- ----------- -------------------
T_PK                                    2           2 2013/03/22 20:39:10

--发布sql查询语句
SQL> select * from t where id=222;

        ID
----------
       222

--再次查看,索引监控提示该索引已经被使用
SQL>  select * from v$object_usage where index_name='T_PK';

INDEX_NAME                     TABLE_NAME       MON USE START_MONITORING    END_MONITORING
------------------------------ ---------------- --- --- ------------------- -------------------
T_PK                           T                YES YES 03/22/2013 20:37:57

SQL> alter index t_pk nomonitoring usage;

3、小结
  a、对于索引监控,在Oracle 10g中当收集统计信息时,如果当前索引的统计信息也被收集则导致该索引被监控
  b、注意索引能否被收集到还依赖于estimate_percent以及method_opt等收集时的相关参数
  c、由于上述情形存在因此索引监控在10g中功能有限,不过对于索引的使用情况也可以通过查询DBA_HIST_SQL_PLAN来获得
  d、在Oracle 11g中,不会出现上述情况

 

更多参考
PL/SQL --> 游标

PL/SQL --> 隐式游标(SQL%FOUND)

批量SQL之 FORALL 语句

批量SQL之 BULK COLLECT 子句

PL/SQL 集合的初始化与赋值

PL/SQL 联合数组与嵌套表
PL/SQL 变长数组
PL/SQL --> PL/SQL记录

SQL tuning 步骤

高效SQL语句必杀技

父游标、子游标及共享游标

绑定变量及其优缺点

dbms_xplan之display_cursor函数的使用

dbms_xplan之display函数的使用

执行计划中各字段各模块描述

使用 EXPLAIN PLAN 获取SQL语句执行计划

Oracle ROWID

NULL 值与索引(一)

NULL 值与索引(二)

启用 AUTOTRACE 功能

函数使得索引列失效

Oracle 绑定变量窥探

Oracle 自适应共享游标

时间: 2024-10-28 04:26:10

收集统计信息导致索引被监控的相关文章

oracle收集统计信息

什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.比如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于统计信息.CBO正是根据这些统计信息数据,计算出不同访问路径下,不同join 方式下,各种计划的成本,最后选择出成本最小的计划. 统计信息是存放在数据字段表中的,如dba_tab_statistics 如何搜集统计信息 统计信息搜集也是有多种方法,推荐大家使用DBMS_STATS 表来进行统计信息搜集及

物化视图中的统计信息导致的查询问题分析和修复

今天开发的同事下午反馈给我一个问题,说有操作直接卡住了,听这个描述,感觉很可能是查询慢了. 于是连接到环境中,查看了一下正在执行的sql语句情况,发现下面的语句已经执行了一段时间. 语句类似下面的形式: select t1.SECURITY_PHONE as MOBILE_PHONE, t1.SECURITY_EMAIL as OTHER_EMAIL, t2.* from accstat.ACCOUNT_DELTA t1, bidata.TMP_CN06 t2 where t1.CN_MASTE

Oracle收集统计信息之NO_INVALIDATE参数

Oracle收集统计信息之NO_INVALIDATE参数 Oracle统计量对于CBO执行是至关重要的.RBO是建立在数据结构的基础上的,DDL结构.约束会将SQL语句分为不同的成本结构等级.而CBO是在数据结构的基础上,加入数据表细粒度信息,将成本结构细化为成本cost值. 相对于数据表的DDL结构,统计量反映了当下数据表数据分布情况,可变性更强.我们经常遇到这样的场景,数据导入操作之后,原有一个运行良好的作业突然效率低下.当我们手工收集一下统计量之后,作业效率提升.这种现象也就是反映了统计量

Oracle 判断 并 手动收集 统计信息 脚本

CREATE OR REPLACE PROCEDURE SchameB.PRC_GATHER_STATS AUTHID CURRENT_USER IS BEGIN SYS.DBMS_STATS.GATHER_TABLE_STATS('SchName', 'TableName', CASCADE => TRUE); END; /   select owner,table_name,last_analyzed,num_rows from dba_tables where owner='SYSTEM'

收集统计信息的SQL脚本(sosi.sql)--崔华大师

收集统计信息的SQL脚本(sosi.sql)--崔华大师 点击(此处)折叠或打开 set echo off set scan on set lines 150 set pages 66 set verify off set feedback off set termout off column uservar new_value Table_Owner noprint select user uservar from dual; set termout on column TABLE_NAME

Oracle并发(CONCURREMT)收集统计信息 (文档 ID 1555451.1)

 Oracle并发(CONCURREMT)收集统计信息 (文档 ID 1555451.1)   >                    >    >  >      >  >      >                          >   >>             >>>>>> >>>>>> >> > >>>>>&

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

PostgreSQL 长事务中DML产生的数据无法被及时纳入统计信息导致的问题

PostgreSQL最低的事务隔离级别是read committed,因此在事务中产生的数据变化,在外部是不可见的,包括auto analyze也是不可见的.例子: postgres=# show autovacuum; autovacuum ------------ on (1 row) postgres=# show autovacuum_naptime ; autovacuum_naptime -------------------- 1s (1 row) 会话A: postgres=#

DBMS_STATS收集统计信息的问题及解决

收集数据库的统计信息是dba工作的一部分,如果在数据快速增长的库上,统计信息如果收集的频率太慢,会对执行计划有一定的影响. 而对于逐渐客户饱和的系统来说,统计信息就可以很长时间收集或者尽量不收集. 对于统计信息的收集,如果是很大的表,收集100%也是不现实的,如果收集的百分比太小,统计信息又失真,对系统系统无疑是雪上加霜. 以上是我采用的方式,不一定对,可以参考.如果表的大小超过30G,算是很大的表了,统计信息的收集比例在30%到40%之间,我给了40%.以下类似. 巨型表(>30G),