多表連接的三種方式詳解 hash join、merge join、 nested loop
項目中的SQL執行效率太低,就用執行計划看一下執行SQL,看不懂,百度一下,紀錄下來:
大多數人從來沒有聽說過這些連接類型,因為它們不是邏輯連接也很少被用於代碼中。那么它們什么時候會被用到呢?答案是要依情況而定。這就意味着要依賴於記錄集和索引。查詢優化器總是智能的選擇最優的物理連接類型具體適用哪種類型的連接取決於
- 取決於表大小。
- 取決於連接列是否有索引。
- 取決於連接列是否排序。
hash join:Hash join在兩個表的數據量差別很大的時候,優化器使用兩個表中較小的表(或數據源)利用連接鍵在內存中建立散列表,然后掃描較大的表並探測散列表,找出與散列表匹配的行。這種方式適用於較小的表完全可以放於內存中的情況。
merge join:通常情況下散列連接的效果都比排序合並連接要好,然而如果行源已經被排過序,在執行排序合並連接時不需要再排序了,這時排序合並連接的性能會優於散列連接。Sort Merge join 用在沒有索引,並且數據已經排序的情況。將關聯表的關聯列各自做排序,然后從各自的排序表中抽取數據,到另一個排序表中做匹配,因為merge join需要做更多的排序,所以消耗的資源更多。 通常來講,能夠使用merge join的地方,hash join都可以發揮更好的性能。
nested loop: 循環從一張表中讀取數據(驅動表outer table),然后訪問另一張表(被查找表 inner table,通常有索引)。驅動表中的每一行與inner表中的相應記錄JOIN。類似一個嵌套的循環。適用於驅動表的記錄集比較小(<10000)而且inner表需要有有效的訪問方法(Index),並且索引選擇性較好的時候。JOIN的順序很重要,驅動表的記錄集一定要小,返回結果集的響應時間是最快的。Nested loop一般用在連接的表中有索引,並且索引選擇性較好的時候.