快速了解Oracle哈希連接
在向大家詳細(xì)介紹Oracle哈希連接之前,首先讓大家了解下Oracle讀取row source,然后全面介紹Oracle哈希連接,希望對(duì)大家有用。在NESTED LOOPS連接中,Oracle讀取row source1中的每一行,然后在row sourc2中檢查是否有匹配的行,所有被匹配的行都被放到結(jié)果集中,然后處理row source1中的下一行。
這個(gè)過(guò)程一直繼續(xù),直到row source1中的所有行都被處理。這是從連接操作中可以得到第一個(gè)匹配行的最快的方法之一,這種類(lèi)型的連接可以用在需要快速響應(yīng)的語(yǔ)句中,以響應(yīng)速度為主要目標(biāo)。
如果driving row source(外部表)比較小,并且在inner row source(內(nèi)部表)上有唯一索引,或有高選擇性非唯一索引時(shí),使用這種方法可以得到較好的效率。NESTED LOOPS有其它連接方法沒(méi)有的的一個(gè)優(yōu)點(diǎn)是:可以先返回已經(jīng)連接的行,而不必等待所有的連接操作處理完才返回?cái)?shù)據(jù),這可以實(shí)現(xiàn)快速的響應(yīng)時(shí)間。
如果不使用并行操作,最好的驅(qū)動(dòng)表是那些應(yīng)用了where 限制條件后,可以返回較少行數(shù)據(jù)的的表,所以大表也可能稱(chēng)為驅(qū)動(dòng)表,關(guān)鍵看限制條件。對(duì)于并行查詢(xún),我們經(jīng)常選擇大表作為驅(qū)動(dòng)表,因?yàn)榇蟊砜梢猿浞掷貌⑿泄δ?。?dāng)然,有時(shí)對(duì)查詢(xún)使用并行操作并不一定會(huì)比查詢(xún)不使用并行操作效率高,因?yàn)樽詈罂赡苊總€(gè)表只有很少的行符合限制條件,而且還要看你的硬件配置是否可以支持并行(如是否有多個(gè)CPU,多個(gè)硬盤(pán)控制器),所以要具體問(wèn)題具體對(duì)待。
NL連接的例子:
- SQL> explain plan for
- select a.dname,b.sql
- from dept a,emp b
- where a.deptno = b.deptno;
- Query Plan
- SELECT STATEMENT [CHOOSE] Cost=5
- NESTED LOOPS
- TABLE ACCESS FULL DEPT [ANALYZED]
- TABLE ACCESS FULL EMP [ANALYZED]
Oracle哈希連接(Hash Join, HJ)
這種連接是在oracle 7.3以后引入的,從理論上來(lái)說(shuō)比NL與SMJ更高效,而且只用在CBO優(yōu)化器中。
較小的row source被用來(lái)構(gòu)建hash table與bitmap,第2個(gè)row source被用來(lái)被hansed,并與第一個(gè)row source生成的hash table進(jìn)行匹配,以便進(jìn)行進(jìn)一步的連接。Bitmap被用來(lái)作為一種比較快的查找方法,來(lái)檢查在hash table中是否有匹配的行。特別的,當(dāng)hash table比較大而不能全部容納在內(nèi)存中時(shí),這種查找方法更為有用。這種連接方法也有NL連接中所謂的驅(qū)動(dòng)表的概念,被構(gòu)建為hash table與bitmap的表為驅(qū)動(dòng)表,當(dāng)被構(gòu)建的hash table與bitmap能被容納在內(nèi)存中時(shí),這種連接方式的效率極高。
HASH連接的例子:
- SQL> explain plan for
- select /*+ use_hash(emp) */ empno
- from emp, dept
- where emp.deptno = dept.deptno;
- Query Plan
- SELECT STATEMENT [CHOOSE] Cost=3
- HASH JOIN
- TABLE ACCESS FULL DEPT
- TABLE ACCESS FULL EMP
要使Oracle哈希連接有效,需要設(shè)置HASH_JOIN_ENABLED=TRUE,缺省情況下該參數(shù)為T(mén)RUE,另外,不要忘了還要設(shè)置 hash_area_size參數(shù),以使Oracle哈希連接高效運(yùn)行,因?yàn)镺racle哈希連接會(huì)在該參數(shù)指定大小的內(nèi)存中運(yùn)行,過(guò)小的參數(shù)會(huì)使Oracle哈希連接的性能比其他連接方式還要低。
總結(jié)一下,在哪種情況下用哪種連接方法比較好:
排序 - - 合并連接(Sort Merge Join, SMJ):
a) 對(duì)于非等值連接,這種連接方式的效率是比較高的。
b) 如果在關(guān)聯(lián)的列上都有索引,效果更好。
c) 對(duì)于將2個(gè)較大的row source做連接,該連接方法比NL連接要好一些。
d) 但是如果sort merge返回的row source過(guò)大,則又會(huì)導(dǎo)致使用過(guò)多的rowid在表中查詢(xún)數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)性能下降,因?yàn)檫^(guò)多的I/O。
【編輯推薦】