1. 程式人生 > >Oracle性能調優之虛擬索引用法簡介

Oracle性能調優之虛擬索引用法簡介

sele lan cts segment 信息 用法 pla lec 虛擬

本博客記錄一下Oracle虛擬索引的用法,虛擬索引是定義在數據字典中的偽索引,可以說是偽列,沒有修改的索引字段的。虛擬索引的目的模擬索引,不會增加存儲空間的使用,有了虛擬索引,開發者使用執行計劃的時候也不需要等索引完全創建好才可以看到效果

ok,這裏找張用戶表來測試一下虛擬索引

//設置執行計劃
SQL> set autotrace traceonly

//查詢用戶,因為沒加索引,所以是全表掃描
SQL> select * from sys_user where username='admin';

//創建虛擬索引,記得加關鍵字nosegment
SQL>create index idx_username on sys_user(username) nosegment;

//先關了執行計劃自動打印
SQL>set autotrace off

//查一下索引表裏有對應索引字段?這裏沒查到,說明虛擬索引並沒有創建索引列
SQL>  select index_name from dba_indexes where table_name='sys_user' and index_n
ame='IDX_USERNAME';
未選定行

//再查一下索引對象裏有數據?這裏可以查到,說明虛擬索引還是有創建索引對象的
SQL> select object_name,object_type from dba_objects where object_name='IDX_USER
NAME';
OBJECT_NAME          OBJECT_TYPE
--------------------              -------------------
IDX_USERNAME           INDEX

//再開啟執行計劃自動打印
SQL> set autotrace traceonly

//查詢一下,發現還是TABLE ACCESS FULL,並沒有走索引,不是創建了虛擬索引了?
SQL> select * from sys_user where username='admin';
執行計劃
----------------------------------------------------------
Plan hash value: 4234589240
------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |     1 |   272 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| SYS_USER |     1 |   272 |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------
...//省略執行計劃信息

//註意:虛擬索引使用,需要設置一下,改為true才可以
SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;
會話已更改。

//再次查詢,可以看到走虛擬索引了,TABLE ACCESS BY INDEX ROWID,虛擬索引使用成功
SQL> select * from sys_user where username='admin';
執行計劃
----------------------------------------------------------
Plan hash value: 1796849462
--------------------------------------------------------------------------------
| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)
| Time     |
--------------------------------------------------------------------------------
------------
|   0 | SELECT STATEMENT            |              |     1 |   272 |     2   (0)
| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| SYS_USER     |     1 |   272 |     2   (0)
| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_USERNAME |     1 |       |     1   (0)
| 00:00:01 |
...//省略執行計劃信息

綜上分析,虛擬索引創建關鍵的步驟是:

alter session set "_use_nosegment_indexes"=true;

create index index_name on table_name(col_name) nosegment;

虛擬索引也可以刪除,用法和刪索引一樣:

drop index [索引名稱] on [表格名稱]

這裏就是虛擬索引的簡要介紹,假如在生產環境,怕加了索引影響系統性能,或許可以加虛擬索引,怕占太多存儲空間,也可以加上虛擬索引,虛擬索引有時候常被用於SQL調優,虛擬索引關鍵字是nosegment

Oracle性能調優之虛擬索引用法簡介