打印本文 打印本文 关闭窗口 关闭窗口
Oracle常見問題集(四)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数6472  更新时间:2009/4/22 22:05:52  文章录入:mintao  责任编辑:mintao
ALTER INDEX REBUILD

 

26. 索引的操作

 

ORACLE對索引有兩種訪問模式.

 

索引唯一掃描 ( INDEX UNIQUE SCAN)

 

大多數情況下, 優化器通過WHERE子句訪問INDEX.

 

例如:

LODGING有兩個索引 :

建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER.

 

SELECT *

FROM LODGING

WHERE LODGING = ROSE HILL;

 

在內部 , 上述SQL將被分成兩步執行, 首先 , LODGING_PK 索引將通過索引唯一掃描的方式被訪問 ,

獲得相對應的ROWID, 通過ROWID訪問表的方式 執行下一步檢索.

如果被檢索返回的列包括在INDEX列中,ORACLE將不執行第二步的處理(通過ROWID訪問表). 因爲檢索資料保存在索引中,

單單訪問索引就可以完全滿足查詢結果.

下面SQL只需要INDEX UNIQUE SCAN 操作.

 

SELECT LODGING

FROM LODGING

WHERE LODGING = ROSE HILL;

 

索引範圍查詢(INDEX RANGE SCAN)

適用於兩種情況:

1. 基於一個範圍的檢索

2. 基於非唯一性索引的檢索

 

1:

 

SELECT LODGING

FROM LODGING

WHERE LODGING LIKE M%;

 

WHERE子句條件包括一系列值, ORACLE將通過索引範圍查詢的方式查詢LODGING_PK . 由於索引範圍查詢將返回一組值,

它的效率就要比索引唯一掃描

低一些.

 

2:

 

SELECT LODGING

FROM LODGING

WHERE MANAGER = BILL GATES;

 

這個SQL的執行分兩步, LODGING$MANAGER的索引範圍查詢(得到所有符合條件記錄的ROWID)

和下一步同過ROWID訪問表得到LODGING列的值.

由於LODGING$MANAGER是一個非唯一性的索引,資料庫不能對它執行索引唯一掃描.

 

由於SQL返回LODGING,而它並不存在於LODGING$MANAGER索引中,

所以在索引範圍查詢後會執行一個通過ROWID訪問表的操作.

 

WHERE子句中, 如果索引列所對應的值的第一個字元由通配符(WILDCARD)開始, 索引將不被採用.

 

SELECT LODGING

FROM LODGING

WHERE MANAGER LIKE ‘%HANMAN

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ...  下一页 >> 

打印本文 打印本文 关闭窗口 关闭窗口