2017年10月18日 星期三

[SQL] JOIN - Loop Join

  • Loop Join (巢狀回圈聯結) 
    • 透過兩個查尋資料量(大與小),觀察資料量對執行影響
    • 驗證 "Loop Join" 的運作模式與使用的最佳時機
  • 資料庫使用 Adventure Works for SQL Server 2012 的資料表 Production.Product 與 Sales.SalesOrderDetail 創建兩個 table 如下
    • tbProduct
      • unique Clustered index:ProductID
    • tbSalesOrderDetail
      • unique Clustered index:SalesOrderID, SalesOrderDetailID
      • NonClustered:ProductID
    • 查詢
select od.SalesOrderID,
       od.SalesOrderDetailID,
       p.Name
from tbSalesOrderDetail od
join tbProduct p ON od.ProductID = p.ProductID
where p.ProductID between 770 and 773

select od.SalesOrderID,
       od.SalesOrderDetailID,
       p.Name
from tbSalesOrderDetail od
join tbProduct p ON od.ProductID = p.ProductID
where p.ProductID between 770 and 800
    • 查詢結果
      • 查詢 1:查詢範圍 ProductID 770 ~ 773 (小量資料),採用 "Loop Join" 適合小量資料查詢
      • 查詢 2:查詢範圍 ProductID 770 ~ 800 (大量資料),採用 "Merge Join"
      • tbProduct 與 tbSalesOrderDetail 屬於 "一對多" 的關係,tbProduct 資料量必小於 tbSalesOrderDetail ,查詢 1的 "Loop Join" 是使用 tbProduct 當 "外部輸入" 而 tbSalesOrderDetail  當 "內部輸入"
    • Result:
      1. "Loop Join" 中的 "外部輸入" 資料列應該較少,而 "內部資料" 資料列較多,在 "外部輸入" 讀取資料後至 "內部資料" 找尋符合的資料列
      2. "Loop Join" 適合查詢條件資料列較少的情況使用,否則會採用 "雜湊聯結" 或 "合併聯結"
  • REF:
    • SQL Server 效能調校

沒有留言:

張貼留言