更新時間:2021-03-04 17:53:50 來源:動力節點 瀏覽1232次
Oracle數據庫系統是目前世界上流行的關系數據庫管理系統,系統可移植性好、使用方便、功能強,適用于各類大、中、小微機環境。在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容,能夠有效幫助Oracle數據庫提高效率,Oracle索引提高效率已經廣泛應用到了Oracle數據庫中。
1、特點優點:提高效率 主鍵的唯一性驗證代價:需要空間存儲 定期維護重構索引:
LTER INDEX REBUILD
2、Oracle對索引有兩種訪問模式
索引唯一掃描 (Index Unique Scan)
索引范圍掃描 (Index Range Scan)
3、基礎表的選擇
基礎表(Driving Table)是指被最先訪問的表(通常以全表掃描的方式被訪問)。根據優化器的不同,SQL語句中基礎表的選擇是不一樣的。
如果你使用的是CBO (COST BASED OPTIMIZER),優化器會檢查SQL語句中的每個表的物理大小,索引的狀態,然后選用花費最低的執行路徑。
如果你用RBO (RULE BASED OPTIMIZER), 并且所有的連接條件都有索引對應,在這種情況下,基礎表就是FROM 子句中列在最后的那個表。
4、多個平等的索引
當SQL語句的執行路徑可以使用分布在多個表上的多個索引時,ORACLE會同時使用多個索引并在運行時對它們的記錄進行合并,檢索出僅對全部索引有效的記錄。
在ORACLE選擇執行路徑時,唯一性索引的等級高于非唯一性索引。然而這個規則只有當WHERE子句中索引列和常量比較才有效。如果索引列和其他表的索引類相比較。這種子句在優化器中的等級是非常低的。
如果不同表中兩個相同等級的索引將被引用,FROM子句中表的順序將決定哪個會被率先使用。FROM子句中最后的表的索引將有最高的優先級。
如果相同表中兩個相同等級的索引將被引用,WHERE子句中最先被引用的索引將有最高的優先級。
5、等式比較優先于范圍比較DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引。
SELECT ENAME FROM EMPWHERE DEPTNO > 20AND EMP_CAT = 'A'
這里只有EMP_CAT索引被用到,然后所有的記錄將逐條與DEPTNO條件進行比較. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMPINDEX RANGE SCAN ON CAT_IDX
即使是唯一性索引,如果做范圍比較,其優先級也低于非唯一性索引的等式比較。
6、不明確的索引等級當ORACLE無法判斷索引的等級高低差別,優化器將只使用一個索引,它就是在WHERE子句中被列在最前面的。DEPTNO上有一個非唯一性索引,EMP_CAT也有一個非唯一性索引。
SELECT ENAME FROM EMPWHERE DEPTNO > 20AND EMP_CAT > 'A'
這里, ORACLE只用到了DEPT_NO索引. 執行路徑如下:
TABLE ACCESS BY ROWID ON EMP
INDEX RANGE SCAN ON DEPT_IDX
7、強制索引失效如果兩個或以上索引具有相同的等級,你可以強制命令ORACLE優化器使用其中的一個(通過它,檢索出的記錄數量少) 。
SELECT ENAMEFROM EMPWHERE EMPNO = 7935AND DEPTNO + 0 = 10 ???/*DEPTNO上的索引將失效*/AND EMP_TYPE || '' = 'A' ?/*EMP_TYPE上的索引將失效*/
8、避免在索引列上使用計算WHERE子句中,如果索引列是函數的一部分。優化器將不使用索引而使用全表掃描。
/*低效SQL*/SELECT * FROM DEPTWHERE SAL * 12 > 25000;
/*高效SQL*/SELECT * FROM DEPTWHERE SAL > 25000/12;
9、自動選擇索引如果表中有兩個以上(包括兩個)索引,其中有一個唯一性索引,而其他是非唯一性索引。在這種情況下,ORACLE將使用唯一性索引而完全忽略非唯一性索引。
SELECT ENAME FROM EMP WHERE EMPNO = 2326AND DEPTNO = 20;
這里,只有EMPNO上的索引是唯一性的,所以EMPNO索引將用來檢索記錄。
SELECT ENAME FROM EMP WHERE EMPNO = 2326AND DEPTNO = 20;
10、避免在索引列上使用NOT通常,我們要避免在索引列上使用NOT,NOT會產生在和在索引列上使用函數相同的影響。當ORACLE遇到NOT,它就會停止使用索引轉而執行全表掃描。
/*低效SQL: (這里,不使用索引)*/SELECT * FROM DEPTWHERE NOT DEPT_CODE = 0
/*高效SQL: (這里,使用索引)*/SELECT * FROM DEPTWHERE DEPT_CODE > 0
我們在學習如何使用Oracle索引提高Oracle數據庫的效率時,有許多需要注意的細節,以避免產生多余的工作量。本站的Oracle教程中,對Oracle索引的各種運用都給出了具體的案例,結合案例讓我們使用起來能夠更容易理解Oracle索引的使用。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習