如果有兩個表t1,t2,在做表連線時候使用的是雜湊連線
oracle會執行以下步驟:
1、首先oralce會根據引數hash_area_size,db_block_size ,_hash__mutiblock_io_count的值來決定hash prtition的數量(hash partition是乙個邏輯上的概念,
它實際上是一組hash buck的集合,所有的hash partition的集合就被乘坐hash table,即乙個hash table由多個hash partition組成,而乙個hash partition又是由多個
hash buckec組成)
2、表t1和t2會根據目標sql中所指定的謂詞條件,得到的結果集中的數量較少的哪個結果集會被oracle被當做hash join的的驅動結果集,這裡把t1的結果集s1當做驅動表,
t2的結果集s2當做被結果集
3、接著oracle會遍歷結果集s,讀取s中的每一條記錄,並對每一條記錄按照該記錄在表t1中的連線列做雜湊運算,這個雜湊運算使用兩個內建的雜湊函式,這兩個雜湊函式
會計算出會分別得出hash_value1和hash_value2
4、然後oracle會按照hash_value1的值把相應的s1中對應記錄儲存在不同的hash partition的不同bucket裡,同時和該記錄儲存在一起的還有該記錄的hash_value2
儲存在hash bucket裡的記錄並不是目標表完整行的記錄,只需要儲存於目標sql中與目標表相關的查詢列和連線列就章狗了,我們把s對應的每乙個hash partition記錄為s1a
5、在構建s1a的同時,oralce會構建乙個位圖,這個位圖用來標記s1a所包含的每乙個bucket是否有記錄
6、如果s1的資料量很大,那麼在構建s1所對應的hash table時,就可能會出現pga工作區被填滿的情況,這個時候oralce會把工作區所包含的記錄數最多的hash partition
寫到磁碟上。接著oralce會繼續構建s1所對應的hash table,在繼續構建的過程中,如果工作區又滿了,則oracle會繼續重複把較大的hash partition寫入磁碟。在極端情況下可能會出現只有某個hash partition的部分記錄在內村中,該hash partition的剩餘部分和餘下所有的hash partition都已經被寫回到磁碟上,這個過程會持續下去,直到便利完s1中所有的記錄
7、接著oralce會對所有的s1a按照他們所包含記錄數來排序,然後把這些已經排序號的hash partition按順序依次且盡可能全部放到記憶體中,如果放不下,其他部分還會在磁碟上。
8、在oracle處理完s1時,開始處理s2,讀取s2中的每一條記錄,並按照記錄在t2中的連線列做雜湊運算,得出hash_vlaue3,hash_value4,結合oracle會按照
該記錄所對應的雜湊值hash_value3去s1a中查詢匹配的hash bucket,如果能夠找到匹配的hash bucket,則oracle還會遍歷該hash bucket中的每一天記錄,
並教研儲存於該hash bucket中的每一條記錄的連線列,檢視是否真的匹配,如果真的匹配,則hash_value1對應s2中記錄的位於目標sql中的查詢列就和該
hash backet匹配記錄組合起來,一起滿足目標 sql連線條件的記錄返回。
如果位圖顯示該hash bucket在s1中對應的記錄數大於0,則說明hash bucket雖然不在記憶體中,但它已經被寫回到磁碟,此時oracle就會按照hash_value1的值把相應
s2中對應記錄也以hash partition的方式寫回到磁碟上,同時記錄的還有hash運算的第二個值s4,如果位圖顯示該hash bucket在s1中對應的記錄數等於0,則oracle就
無需把hash value3所對應s2中的記錄寫回磁碟,因為這條記錄既然不滿足目標sql的連線提哦啊見,這個根據點陣圖來決定是否將hash_value1所對應s2中的記錄寫回
到磁碟的動作就是所謂的點陣圖過濾,我們把s2所對應的每隔一hash partition記錄為s2j,這種查詢匹配記錄會一直持續下去,知道遍歷按完b中所有的記錄
9、至此oracle已經處理完所有位於記憶體中s1a和對應的s2j,現在只剩下位於磁碟上的si和bj還未處理
10、oracle在處理位於磁碟上的s1a和s2j時候,只有對應hash partition number值相同的si和bj才可能產生滿足條件的記錄,磁碟上的匹配的記錄用s1n和s2n記錄
11、對於s1n和s2n,他們之中記錄較少的會被當做驅動結果集,然後oracle會使用這個驅動結果集hash bucket裡的記錄hash_value2或者hash_value4來構建新的
hash table,另外乙個記錄數較多的會被當做被驅動結果集,對於每乙個對s1n和s2n而言,oracle始終會選擇他們中記錄較少的作為驅動結果集,所以每一對sn的結
果集都會發生變化,這就是所謂的動態角色互換
12、這種匹配方式會一直延續下去,直到遍歷完玩所有的s1n和s2n
雜湊連線適用於:
1、雜湊連線不一定會排序,或者說大多數的情況下都不需要排序
2、雜湊連線的驅動表根據所對應的連線列的可選性盡量可能好,因為這個可選擇性會影響對應hash bucket中的記錄數,而hashhash bucket中的記錄數又會直接影響從
該hash bucket中查詢匹配記錄的效率。如果乙個hash bucket裡所包含的記錄數越多,則可能會降低所對應雜湊連線的執行效率,此事典型的變現就是該雜湊連線執行
了很長時間都沒有結束,資料庫所在資料庫伺服器上的cpu占用了率也很高,但目標sql所消耗的邏輯讀卻非常低,因為此事大部分時間都耗費在了便利上數的hash
bucket裡所有的記錄上,而便利hashbucket裡的記錄這個動作發生在pga裡,所以不耗費邏輯讀。
3、雜湊連線只適用於cbo,它也只能用於等值連線條件
4、雜湊連線很適合小標和大表之間做表連線且連線結果集的記錄數較多的情形,特別是在小標的連線列選擇性非常好的情況下,這時候雜湊連線的執行時間可以看做是
和全表掃瞄那個大表所耗費的時間。
5、當兩個表做雜湊連線時,如果在施加了目標sql中制定了謂詞條件後得到的資料量較小的那個結果集所對應的hash table能夠完全被放在pga中,此事雜湊連線的
效果非常高。
可以借助10104事件所產生的trace檔案來觀察目標sql在做雜湊連線時的一些統計資訊
oradebug setmypid
oradebug event 10104 trace name context forever,level 1
set autotrace traceonly
a
mysql 表的連線方式 Mysql表的連線方式
mysql表的連線方式 1.交叉連線 笛卡爾積 交叉聯接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉聯接也稱作笛卡爾積。sql語句 select from 表1,表2 隱士笛卡爾積 select from 表1 crross join 表2 顯示笛卡爾積 不帶條件的內連線也是笛卡爾積...
Oracle表連線方式
實用記憶方法 在哪邊,哪邊就是外來鍵,該錶的資料就 少 無 那邊檢索的就是全表資料。oracle 8i,9i 表連線方法。一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right f...
sql表連線方式
表連線有幾種?sql表連線分成外連線 內連線和交叉連線。一.外連線 概述 外連線包括三種,分別是左外連線 右外連線 全外連線。對應的sql關鍵字 left right full outer join,通常我們都省略outer關鍵字,寫成left right full join。在左 右外連線中都會以...