1

我有一个似乎无法完全调整的观点,因此我尝试将其转换为 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 一样快吗?

谢谢你的帮助!

4

1 回答 1

2

这两个查询完全不同。差异非常微妙,但这是行:

        WHERE     StoreID = @StoreID

该视图计算所有商店的所有数据。然后它过滤特定商店的结果。

存储过程版本只查看特定存储;它甚至可以有效地利用 StoreId 上的索引(如果有的话)。

于 2012-08-21T01:37:37.070 回答