2016-02-23 99 views
1

在相關的嵌套查詢中有WHERE子句,或者在外部查詢中只有WHERE子句,性能會好壞多少?例如:下面的嵌套查詢定義price_key,但外部查詢有一個price_key引用,也外查詢的WHERE語句相關嵌套查詢的查詢優化(SQL Server)

INNER JOIN (
      SELECT inv.item_key, s.price_key, MAX(inv.last_receive_cost/inv.last_receive_units_case) AS [unit_cost] 
      FROM inventory inv 
        INNER JOIN stores s on inv.location_key = s.store_key 
      WHERE inv.on_hand_inventory_qty > 0 
        AND inv.last_receive_cost > 0 
        AND inv.last_receive_units_case > 0 
        AND s.price_key = (29) 
      GROUP BY inv.item_key, s.price_key 
) t ON r.item_key = t.item_key and r.price_key = t.price_key 
+0

這是最好的早期篩選 – Paparazzi

+0

你可以簡單地把兩個版本彼此相鄰,並期待在定義結果查詢計劃。如果事實證明,查詢優化器對兩個版本都使用相同的查詢計劃,那就不足爲奇了。 – deroby

回答

0
INNER JOIN (
      SELECT inv.item_key --, s.price_key 
       , MAX(inv.last_receive_cost/inv.last_receive_units_case) AS [unit_cost] 
      FROM inventory inv 
        INNER JOIN stores s on inv.location_key = s.store_key 
      WHERE inv.on_hand_inventory_qty > 0 
        AND inv.last_receive_cost > 0 
        AND inv.last_receive_units_case > 0 
        AND s.price_key = 29 
      GROUP BY inv.item_key 
-- , s.price_key 
) t ON r.item_key = t.item_key 
    and r.price_key = 29 
+0

我同意在分組之前進行過濾很重要,並且對已經過濾的內容進行分組可能會導致一個愚蠢的冗餘性能問題,因此如果可能的話應該將其刪除。 –