2009-07-10 109 views

回答

60

通過按照連接鍵對要連接的兩個數據集進行排序然後將它們合併在一起來執行「排序合併」連接。合併非常便宜,但排序可能非常昂貴,特別是如果排序溢出到磁盤。如果其中一個數據集可以通過索引以排序順序訪問,則可以降低排序的成本,但與全表掃描相比,通過索引掃描訪問大部分表的塊也可能非常昂貴。

哈希連接是通過將一個數據集散列到基於連接列的內存中執行的,並讀取另一個數據集並探查哈希表中的匹配項來執行的。當散列表可以完全保存在內存中時,散列連接的成本非常低,總成本僅比讀取數據集的成本高很多。如果哈希表必須以單遍方式分散到磁盤上,那麼成本會上升,而對於多通道分類而言,成本會大幅上升。

散列連接的代價可以通過對連接鍵上的兩個表進行分區來減少。這允許優化器推斷來自一個表中的分區的行將僅在另一個表的特定分區中找到匹配,並且對於具有n個分區的表而言,散列連接被執行爲n個獨立的散列連接。這具有以下效果:

  1. 每個散列表的大小減小,因此降低了所需的存儲器的最大量的和潛在除去必要操作,以要求臨時磁盤空間。
  2. 對於並行查詢操作,大量減少進程間消息傳遞量,從而減少CPU使用量並提高性能,因爲每個散列連接可由一對PQ進程執行。
  3. 對於非並行查詢操作,內存需求減少了n倍,第一行從查詢中更早地進行投影。

您應該注意,散列連接只能用於equi連接,但合併連接更加靈活。

一般來說,如果你加入大量的數據加入equi-join,那麼哈希連接將是一個更好的選擇。

該主題在文檔中有很好的介紹。

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

6

我只是想編輯這個後代,當我回答這個問題時,oracle的標籤沒有添加。我的迴應更適用於MS SQL。

合併連接是最好的,因爲它利用了排序,導致表單單向傳遞進行連接。如果您有兩個表(或覆蓋索引),它們的排序順序相同,例如主鍵和該鍵上的表的索引,則執行該操作時會導致合併連接。

哈希連接是次佳選擇,因爲它通常是在一個表具有少量項目(相對)時完成的,因此它有效地爲每行創建一個臨時表,併爲每個行創建連接以創建連接。

最糟糕的情況是嵌套循環,它是order(n * m),這意味着沒有排序或大小可以利用,並且連接很簡單,對於表x中的每一行,搜索表y中的連接都要執行。

相關問題