我有一个似乎无法完全调整的观点,因此我尝试将其转换为 proc,将查询时使用的 WHERE 条件之一移动到参数中并在派生表中使用该参数。
看法
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 一样快吗?
谢谢你的帮助!