使用SQL Server从视图中检索数据非常耗时

时间:2017-06-28 08:03:55

标签: sql-server tsql view sql-server-2016

我在SQL Server 2016中创建了一个view。该视图是使用以下语句创建的:

CREATE VIEW dbo.StockEOMonth
AS
   SELECT       CAST(StoreKey AS numeric(4, 0)) AS StoreKey, 
                DateKey, 
                SUM(StockValue) AS StockValue,
                SUM(StockQuantity) AS StockQuantity
   FROM         Stock
   WHERE        CONVERT(date, CONVERT(varchar(10), DateKey)) = 
                EOMONTH(CONVERT(date, CONVERT(varchar(10), DateKey)))
   GROUP BY DateKey, storekey

观点本身相当直截了当。我在每个月的最后一天返回每个商店的总StockQuantityStockValue余额(我使用SUM()的原因是因为基础表Stock包含余额对于每个产品,但我只对每个商店的总余额感兴趣)。

此视图仅返回4000条记录。但是,当我使用查询时:

SELECT top(10) StockValue, StockQuantity 
FROM dbo.StockEOMonth

查询需要13 分钟才能返回10行。

我不确定如何优化这样一个微不足道的观点。有没有人有想法?我可以将表创建为实际表,但如果可能的话,它希望将其作为view

  

修改

我已经体验到SSMSSSAS中检索数据的速度缓慢,我已经从我开始将视图用作数据源的实例中获得了ErrorCode 3240034318对于度量组,其中ErrorCode似乎与Query TimeOut相关。

1 个答案:

答案 0 :(得分:1)

WHERE子句不是SARGable。您应该删除where子句左侧的函数:

WHERE DateKey = EOMONTH(DateKey)

如果格式化不起作用,请将函数放在右侧,使其与DateKey的格式匹配。

如果您尚未调整索引,请尝试以下操作:

CREATE NONCLUSTERED INDEX [ix_test] ON [stock]
(
    [datekey] ASC
)
INCLUDE (   [StoreKey],
    [StockValue],
    [StockQuantity]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)