Oracle對單獨使用max或min函式時給出了一種非常高效的訪問路徑,就是“INDEX FULL SCAN (MIN/MAX)”,該方法可以避免索引的全部讀取,進一步提高資料結果的獲取效率。
透過這個實驗簡單記錄一下。
1.建立測試表
create table T ( x INTEGER, y INTEGER, z INTEGER );
我們先建立一個包含百萬條記錄的表t,在t表的第一個欄位x上有主鍵(或者唯一索引)
建立唯一索引
create unique index CUX.CUX_INDEX_UNIOX01 on T (X);
批次插入100W條記錄
select rownum, to_char(rownum+10),to_char(rownum+10)from dual connect by level <= 1000000;
查詢:
select count(*) from t;
2.檢視一下max函式對應的執行計劃
3.“INDEX FULL SCAN (MIN/MAX)”訪問路徑
此處SQL最佳化器不但可以識別到使用索引掃描可以提速,而且針對特定的max函式(或min函式)使用特有的“INDEX FULL SCAN (MIN/MAX)”訪問路徑來快速獲取最大值(或最小值)。
使用這種訪問路徑獲得最大值時,可以不必將所有的索引內容預讀一遍,而是從索引儘量靠後的記錄開始讀,這樣便可以更加快速地獲得最大值。
4.如果max和min函式同時使用會有什麼的執行計劃呢?
select min(x), max(x) from t;
5、採用全表連線可以最佳化查詢時間
select max(t.x) from t union all select min(xt.x) from t xt)
透過上面的執行計劃可見,min(x)和max(x)函式同時使用時是無法使用“INDEX FULL SCAN (MIN/MAX)”的。原因很簡單,同一張表既想得到最小值又想得到最大值只能將所有的資料預讀一遍才知道。此時SQL最佳化器給出的方法是“INDEX FAST FULL SCAN”。也就是說僅用索引本身就可以回答這個問題,無需訪問表t,這也是一種高效獲得資料的方法,類似於將原來的大表重新構造了一個以索引形式存在的“小表”。