我认为我似乎无法完全调整,所以我尝试将其转换为proc,移动我在查询参数时使用的WHERE条件之一并在我的派生表中使用该参数。 / p>
视图的
CREATE VIEW myView
AS
SELECT i.ItemCode
, s.StoreID
, ISNULL(SUM(s.TotalSales)) AS Sales
FROM Item i
LEFT JOIN Balance b ON i.ItemCode = b.ItemCode
LEFT JOIN (SELECT SUM(Quantity)
, StoreID
, ItemCode
, Date
FROM Sales
GROUP BY StoreID
, ItemCode
, Date) AS s ON i.ItemCode = s.ItemCode
AND s.Data >= COALESCE(b.Date, '01-01-1900)
JOIN
GROUP BY i.ItemCode
, s.StoreID
存储过程
CREATE PROCEDURE myProc(@StoreID INT)
AS
SELECT i.ItemCode
, s.StoreID
, ISNULL(SUM(s.TotalSales)) AS Sales
FROM Item i
LEFT JOIN Balance b ON i.ItemCode = b.ItemCode
LEFT JOIN (SELECT SUM(Quantity)
, StoreID
, ItemCode
, Date
FROM Sales
WHERE StoreID = @StoreID
GROUP BY StoreID
, ItemCode
, Date) AS s ON i.ItemCode = s.ItemCode
AND s.Data >= COALESCE(b.Date, '01-01-1900)
JOIN
GROUP BY i.ItemCode
, s.StoreID
EXEC myProc(100)多比SELECT * FROM myView WHERE StoreID = 100更快。 应该是这样的吗?
注意:我知道这段代码可能没有完全意义或运行 - 我试图通过删除其他一些JOIN来简化它。实际代码中唯一的重大区别是将WHERE移动到派生表中,我已经在这里完成了。
在执行派生表查询时,视图是否应该考虑我的WHERE并且与proc一样快?
感谢您的帮助!
答案 0 :(得分:2)
两个查询完全不同。差异非常微妙,但这就是这一行:
WHERE StoreID = @StoreID
视图计算所有商店的所有数据。然后它会过滤特定商店的结果。
存储过程版本仅查看特定商店;它甚至可以有效地使用StoreId上的索引(如果有的话)。