有的索引根本用不着,但當在對錶修改時,它也是會自動修改,這樣會降低數據庫的速度。下面來做個簡單試驗來監視索引是否使用。
首先創建個表,
SQL> create table t (id int,sex char(1),name char(10));
Table created.
然後輸入數據,
SQL> begin
2 for i in 1..100
3 loop
4 insert into t values(i,'M','sun');
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
對錶t創建一個索引,
SQL> create index t_idx1 on t(id);
Index created.
可以來查看一下,
SQL> select object_name,object_type from user_objects;
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
T_IDX1 INDEX
T TABLE
在監控索引之前,先來介紹個動態性能視圖,
V$OBJECT_USAGE
V$OBJECT_USAGE
displays statistics about index usage gathered from the database. You can use this view to monitor index
usage. All indexes that have been used at least once can be monitored
and displayed in this view.
Column | Datatype | Description |
---|---|---|
INDEX_NAME |
VARCHAR2(30) |
Index name in sys.obj$.name(索引的名字) |
TABLE_NAMEa |
VARCHAR2(30) |
Table name in sys.obj$.name(索引的基表) |
MONITORING |
VARCHAR2(3) |
YES |NO(是否監控,yes 是|no 否) |
USED |
VARCHAR2(3) |
YES |NO(是否使用,yes 是|no 否) |
START_MONITORING |
VARCHAR2(19) |
Start monitoring time insys.object_stats.start_monitoring(索引監控開始時間) |
END_MONITORING |
VARCHAR2(19) |
End monitoring time insys.object_stats.end_monitoring(索引監控結束時間 |
打開並開始監控索引的使用,
SQL> alter index t_idx1 monitoring usage;
Index altered.
來檢查一下是否開始監控,
SQL> select * from v$object_usage;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
------------------------------ -------------------------- ------ ------- ----------------------------- -------------------
T_IDX1 T YES NO 04/18/2013 00:23:06
在上面顯示MON是yes表示開始監視,use爲no表示沒有使用,還用監視開始的時間和結束時間。
在這裏做一下可以對索引的使用,在來看看動態性能視圖的變化,
SQL> set autot on exp
SQL> select * from t where id=88;
ID S NAME
---------- - ----------
88 M sun
Execution Plan
----------------------------------------------------------
Plan hash value: 4055207394
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 28 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T_IDX1 | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("ID"=88)
從查看執行計劃中可以看到使用了索引,
SQL> set autot off
SQL> select * from v$object_usage;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
------------------------------ ------------------------------ ------- ------ ------------------------------ -------------------
T_IDX1 T YES YES 04/18/2013 00:23:06
可以看到USE改變成了YES,表明使用過了。
關閉監控索引,
SQL> alter index t_idx1 nomonitoring usage;
Index altered.
再來看一下動態性能視圖,
SQL> select * from v$object_usage;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
------------------------------ ------------------------------ -------- ------ ------------------------------- --------------------------
T_IDX1 T NO YES 04/18/2013 00:23:06 04/18/2013 00:41:38
這時候可以看出,MON改變成了NO,還標出了監控的時間段。