当前位置:数据库 > Oracle >>

Oracle索引监控与外键索引

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
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,