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