2016-02-23 2 views
1

Лучше или хуже для производительности иметь предложение WHERE в ваших коррелированных вложенных запросах или просто предложение WHERE в вашем внешнем запросе ... ex: Ниже вложенный запрос определяет price_key, но внешний запрос имеет ссылки на price_key и также определяется во внешних запросов ИНЕКЕОптимизация запросов для взаимосвязанных вложенных запросов (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

Я согласен с тем, что фильтрация до группировки важна, и что группировка на то, что уже отфильтрована, может привести к глупой избыточной проблеме производительности, поэтому ее следует удалить, если это возможно. –

Смежные вопросы