鑑別不使用的索引

   有的索引根本用不着,但當在對錶修改時,它也是會自動修改,這樣會降低數據庫的速度。下面來做個簡單試驗來監視索引是否使用。

首先創建個表,

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.

       V$OBJECT_USAGE顯示有關於數據庫中索引使用情況的統計。能夠利用這個視圖來監控索引使用。該視圖能夠監控和顯示最近一次使用到的所有索引。
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,還標出了監控的時間段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章