Oracle索引监控与外键索引
Oracle 监控索引特性为我们提供了一个大致判断索引是否被使用的情形。之所以这么说,是因为在Oracle 10g 中收集统计信息时会导致索引被监控,此并非sql语句而产生。而在11g则不会出现类型的情形。其次对于存在子表存在外键的情形,对于主表进行操作时是否会导致索引被监控呢?下面描述的是这个话题。
1、普通监控索引的情形
[sql]
--演示环境
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、存在外键时监控索引情形
[delphi]
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 |
+----------------------------------------------------------------------------+
Constraint
Constraint Name Type &n