我的观点应该比我的存储过程慢得多吗?

时间:2012-08-21 01:22:51

标签: sql sql-server performance stored-procedures sqlperformance

我认为我似乎无法完全调整,所以我尝试将其转换为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一样快?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

        WHERE     StoreID = @StoreID

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

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