索引對於在大量數據裡檢索出少量數據庫的查詢操作來說是高效的,但是對於DML操作來說,卻是負面的:①其對於insert 操作的反面影響最大,該表的索引越多,更新的索引越多,insert 操作越慢。②對於delete來說,大量數據定位刪除少量數據的時候,通過索引定位刪除是高效的,但如果刪除數據量過多,或者有過多列有索引的時候,其他索引列因為數據的刪除有會更新來說,索引是負面的。③對於update的負面影響最小,具體修改某一列時只會更新該列上的index。
所以說,沒有被使用過的index在數據庫中一定是低效,具有負面影響的,我們通過對索引的監控來查看索引是否在監控的時間段內被使用過。
索引監控:
alter index index_name monitoring usage;
查看是否在開始監控後被使用過:
select * from v$object_usage;
停止索引監控:
alter index index_name nomonitoring usage;
下面通過實驗看一下:
SQL> create table t_id as select rownum id from dual connect by level<10000;
Table created
SQL> create index ind_t_id on t_id(id);
Index created
SQL> alter index ind_t_id monitoring usage;
Index altered
SQL> select * from v$object_usage where index_name='IND_T_ID';
INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING
------------------------------ ------------------------------ ---------- ---- ------------------- -------------------
IND_T_ID T_ID YES NO 04/24/2014 13:27:39
SQL> select * from t_id where id=999;
ID
----------
999
SQL> select * from v$object_usage where index_name='IND_T_ID';
INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING
------------------------------ ------------------------------ ---------- ---- ------------------- -------------------
IND_T_ID T_ID YES YES 04/24/2014 13:27:39
SQL> alter index ind_t_id nomonitoring usage;
Index altered
SQL> select * from v$object_usage where index_name='IND_T_ID';
INDEX_NAME TABLE_NAME MONITORING USED START_MONITORING END_MONITORING
------------------------------ ------------------------------ ---------- ---- ------------------- -------------------
IND_T_ID T_ID NO YES 04/24/2014 13:27:39 04/24/2014 13:29:13