日期:2014-05-16 浏览次数:20476 次
Oracle 监控索引特性为我们提供了一个大致判断索引是否被使用的情形。之所以这么说,是因为在Oracle 10g 中收集统计信息时会导致索引被监控,此并非sql语句而产生。而在11g则不会出现类型的情形。其次对于存在子表存在外键的情形,对于主表进行操作时是否会导致索引被监控呢?下面描述的是这个话题。
1、普通监控索引的情形
--演示环境 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 ptb(deptno number constraint ptb_pk primary key,dname varchar2(20)); Table created. --从scott.dept帐户复制数据 SQL> insert into ptb select deptno,dname from dept; 4 rows created. SQL> commit; Commit complete. --开启索引监控 SQL> alter index ptb_pk monitoring usage; --为主表收集统计信息 SQL> exec dbms_stats.gather_table_stats('SCOTT','PTB',cascade=>true); PL/SQL procedure successfully completed SQL> select * from v$object_usage where index_name='PTB_PK'; INDEX_NAME TABLE_NAME MON Use START_MONITORING END_MONITORING ------------------------------ ------------------------- --- --- ------------------- ------------------- PTB_PK PTB YES NO 03/22/2013 17:15:37 --注意上面的情形,收集统计信息时,索引被使用没有被监控到,在10g中则会被监控到 --下面开启autotrace SQL> set autot trace exp; SQL> select * from ptb where deptno=10; Execution Plan ---------------------- Plan hash value: 3991869509 -------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 12 | 1 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| PTB | 1 | 12 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PTB_PK | 1 | | 0 (0)| 00:00:01 | -------------------------------------------------- SQL> set autot off; SQL> select * from v$object_usage where index_name='PTB_PK'; --索引使用被监控到 INDEX_NAME TABLE_NAME MON Use START_MONITORING END_MONITORING ------------------------------ ------------------------- --- --- ------------------- ------------------- PTB_PK PTB YES YES 03/22/2013 17:15:37
2、存在外键时监控索引情形
SQL> create table ctb(id number,name varchar2(30),deptno number); Table created. --为子表添加外键约束 SQL> alter table ctb add constraint ctb_fk foreign key(deptno) references ptb(deptno) 2 on delete set null; Table altered. --为子表填充数据 SQL> begin 2 for i in 1 .. 1000000 3 loop 4 insert into ctb values(i,'name_'||to_char(i),10); 5 end loop; 6 commit; 7 end; 8 / PL/SQL procedure successfully completed. --基于外键创建索引 SQL> create index i_ctb_fk_deptno on ctb(deptno) nologging; Index created. --收集子表的统计信息 SQL> exec dbms_stats.gather_table_stats('SCOTT','CTB',cascade=>true); PL/SQL procedure successfully completed. SQL> @dba_table_info Enter Schema (i.e. SCOTT) : SCOTT Enter Schema (i.e. EMP) : CTB +----------------------------------------+ | TABLE INFORMATION | +----------------------------------------+ Owner Table Name Tablespace Last Analyzed # of Rows --------------- --------------- ---------------------------- -------------------- ------------ SCOTT CTB GOEX_SYSTEM_TBL 22-MAR-2013 17:26:02 1,000,731 +----------------------------------------+ | CONSTRAINTS | +----------------------------------------+