這篇文章主要為大家展示了“Oracle數(shù)據(jù)庫中hash join和nested loop怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Oracle數(shù)據(jù)庫中hash join和nested loop怎么用”這篇文章吧。
成都創(chuàng)新互聯(lián)成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站網(wǎng)站開發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),自適應(yīng)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢和貼心的售后服務(wù)。歡迎咨詢做網(wǎng)站需要多少錢:13518219792
Oracle 表的連接方式-----Nested loop join和 Sort merge join
關(guān)系數(shù)據(jù)庫技術(shù)的精髓就是通過關(guān)系表進(jìn)行規(guī)范化的數(shù)據(jù)存儲(chǔ),并通過各種表連接技術(shù)和各種類型的索引技術(shù)來進(jìn)行信息的檢索和處理。
表的三種關(guān)聯(lián)方式:
nested loop:從A表抽一條記錄,遍歷B表查找匹配記錄,然后從a表抽下一條,遍歷B表........就是一個(gè)二重循環(huán) hash join:將A表按連接鍵計(jì)算出一個(gè)hash表,然后從B表一條條抽取記錄,計(jì)算hash值,根據(jù)hash到A表的hash來匹配符合條件的記錄 sort merge join:將A,B表都排好序,然后做merge,符合條件的選出
對于三種連接,我們都可以使用hint來強(qiáng)制讓優(yōu)化器走:use_hash,use_nl,use_merge.
Nested Loop Join
1.執(zhí)行原理
例如: select t1.*,t2.* from t1,t2 where t1.col1=t2.col2; 訪問機(jī)制如下: for i in (select * from t1) loop ----t1為驅(qū)動(dòng)表 for j in (select * from t2 where col2=i.col1) loop display results; end loop; end loop; 類似一個(gè)嵌套循環(huán) 嵌套循環(huán)執(zhí)行時(shí),先是外層循環(huán)進(jìn)入內(nèi)層循環(huán),并在內(nèi)層循環(huán)終止之后 接著執(zhí)行外層循環(huán)再由外層循環(huán)進(jìn)入內(nèi)層循環(huán)中,當(dāng)外層循環(huán)全部終止時(shí),程序結(jié)束
2.步驟如下
a.確定驅(qū)動(dòng)表 b.把inner 表分配給驅(qū)動(dòng)表 c.針對驅(qū)動(dòng)表的每一行,訪問被驅(qū)動(dòng)表的所有行
3.執(zhí)行計(jì)劃大致如下
NESTED LOOPS outer_loop --驅(qū)動(dòng)表 inner_loop 優(yōu)化器模式為FIRST_ROWS時(shí),我們經(jīng)常會(huì)發(fā)現(xiàn)有大量的NESTED LOOP 這時(shí),在返回?cái)?shù)據(jù)給用戶時(shí),我們沒有必要緩存任何數(shù)據(jù),這是nested loop的一大亮點(diǎn)
4.使用場景
一般用在連接的表中有索引,并且索引選擇性較好(也就是Selectivity接近1)的時(shí)候 也就是驅(qū)動(dòng)表的記錄集比較小(<10000)而且inner表需要有有效的訪問方法(Index) 需要注意的是:JOIN的順序很重要,驅(qū)動(dòng)表的記錄集一定要小,返回結(jié)果集的響應(yīng)時(shí)間是最快的
5.和索引的關(guān)系
嵌套循環(huán)和索引就像一對孿生兄弟,一般需要共同考量與設(shè)計(jì),這從優(yōu)化器的執(zhí)行機(jī)制可以看出. 比如,存在2張表,一個(gè)10條記錄,一個(gè)1000萬條記錄 以小表為驅(qū)動(dòng)表,則代價(jià)為:10*(通過索引在大表查詢一條記錄的代價(jià)) 如果1000萬的大表沒有索引的時(shí)候,那么COST的代價(jià)可想而知 因此,在多表連接時(shí),注意被驅(qū)動(dòng)表的連接字段是否需要?jiǎng)?chuàng)建索引 或者連接字段與該表的其他約束條件字段上是否需要?jiǎng)?chuàng)建復(fù)合索引
Sort Merge Join
1.執(zhí)行原理
select t1.*,t2.* from t1,t2 where t1.id=t2.id; 訪問機(jī)制如下: 訪問t1,并order by t1_1.id,這里的id代表連接字段 訪問t2,并order by t2_1.id join t1_1.id = t2_1.id,依次交替 比對 歸并,但無所謂驅(qū)動(dòng)
2.使用場景
雖說,hash join就是用來替代sj的,但如果你的服務(wù)器的CPU資源和MEM資源都很緊張的時(shí)候,建議用SORT MERGE JOIN 因?yàn)閔ash join比sort merge join需要的資源更多。特別是cpu 10g sql tuning 文檔上寫道: On the other hand, sort-merge joins can perform better than hash joins if both of the following conditions are met: The row sources are already sorted. A sort operation does not have to be done. 所以,sj大概就用在沒有索引,并且數(shù)據(jù)已經(jīng)排序的情況
以上是“Oracle數(shù)據(jù)庫中hash join和nested loop怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文題目:Oracle數(shù)據(jù)庫中hashjoin和nestedloop怎么用
網(wǎng)頁鏈接:http://muchs.cn/article24/piodje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、品牌網(wǎng)站設(shè)計(jì)、響應(yīng)式網(wǎng)站、企業(yè)建站、搜索引擎優(yōu)化、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)