日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

关系型数据库的物理连接

發布時間:2023/12/16 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关系型数据库的物理连接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在開發中常聽到的 left join,Inner JOIN ,right join ,cross join 這些連接都是數據庫的邏輯連接,那么數據庫在執行這些連接的時候,數據庫是如何在底層實現表的關聯的呢?這就是物理連接
目前大部分關系型數據庫支持3種物理連接(mysql 貌似到5.6未知僅支持嵌套連接)
數據庫的物理連接:
數據庫接兩個表時候,會考慮3種方法:嵌套連接,合并連接,散列連接。3種方法的連接都有一個表被選為外表(只掃描一次),一個表被選為內表(坑內掃描多次)。如果查詢連接了多個表,每次查詢只能連接2各表,并保存把中間結果,用戶連接另外的表。
1、嵌套連接:外表只掃描一次,而針對外表的每一行都需要掃描一次內表。(注意:連接不能用long或lob字段)
2、合并連接:合并連接需要一個等式連接詞(A.col1=B.col1),還要求根據連接列對兩個連接的表進行排序。合并連接內表和外表都只掃描一次,有時情況下需要再次掃描內表的部分值,例如,外表存在重復值的情況下。所以優化器通常選擇重復值較少的表作為外表。
3、散列連接:散列連接需要一個或多個等式連接謂詞,其中每個謂詞的類型相同。char類型長度必須相同。decimal進度必須相同。散列連接可以處理多個等式謂詞。對于散列連接,首先掃描內表(也稱為構件表 build table),表中的行被復制到內存緩沖區。根據“散列鍵(hash key)”,這些緩沖區被分為幾個分區,如果內存中沒有足夠的空間容納整個表,則有些分區被寫入磁盤上的臨時表。然后掃描外表。然后掃描外表(探測表)。對于外表中的每一行,對連接列應用同意散列算法。如果所獲得的散列鍵與行的散列鍵相匹配,讀取分區里面的所有行并應用連接謂詞。如果與探測表行匹配的分區在內存中,則讀取分區并應用連接謂詞將立即進行。如果分區被寫入臨時表,則探測行也別寫入臨時表。最后,匹配統一分區行和對應分區被一起處理。


優化器使用3種連接的場景:
嵌套連接:
對于被連接的數據子集較小的情況,nested loop連接是個較好的選擇。nested loop就是掃描一個表,每讀到一條記錄,就根據索引去另一個表里面查找,沒有索引一般就不會是 nested loops。
一般在nested loop中, 驅動表滿足條件結果集不大,被驅動表的連接字段要有索引,這樣就走nstedloop。如果驅動表返回記錄太多,就不適合nested loops了。如果連接字段沒有索引,則適合走hash join,因為不需要索引。
Inner table被Outer table驅動,outer table返回的每一行都要在inner table中檢索到與之匹配的行。
Outer table: 小表、驅動表
Inner table: 被驅動表、大表

哈希連接: 哈希連接是做大數據集連接時的常用方式。優化器掃描小表(或數據源),利用連接鍵(也就是根據連接字段計算hash值)在內存中建立hash表,然后掃描大表,每讀到一條記錄就來探測hash表一次,找出與hash表匹配的行。
當小表可以全部放入內存中,其成本接近全表掃描兩個表的成本之和。如果表很大不能完全放入內存,這時優化器會將它分割成若干不同的分區,不能放入內存的部分就把該分區寫入磁盤的臨時段,此時要有較大的臨時段從而盡量提高I/O 的性能。臨時段中的分區都需要換進內存做hash join。這時候成本接近于全表掃描小表+分區數*全表掃描大表的代價和。
至于兩個表都進行分區,其好處是可以使用parallel query,就是多個進程同時對不同的分區進行join,然后再合并。但是復雜。
以下條件下hash join可能有優勢:
兩個巨大的表之間的連接。
在一個巨大的表和一個小表之間的連接。

合并連接:
對連接的每個表做table access full;
對table access full的結果按照連接鍵進行排序;
進行merge join對排序結果進行合并。
Sort merge join性能開銷幾乎都在前兩步。相較于前兩種連接,合并連接的速度最快的。但也看數據庫的索引和數據量情況。

通常情況下河西連接的效果都比合并連接要好,然而如果行源已經被排過序,在執行合并連接時不需要再排序了,這時合并連接的性能會優于哈希連接。
在全表掃描比索引范圍掃描再通過rowid進行表訪問更可取的情況下,合并會比嵌套性能更佳。

各類關系型數據庫都有相應參數可以強制指定那一種連接進行測試。。。

轉載于:https://www.cnblogs.com/vansky/p/8900552.html

總結

以上是生活随笔為你收集整理的关系型数据库的物理连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。