我在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
观点本身相当直截了当。我在每个月的最后一天返回每个商店的总StockQuantity
和StockValue
余额(我使用SUM()的原因是因为基础表Stock
包含余额对于每个产品,但我只对每个商店的总余额感兴趣)。
此视图仅返回4000
条记录。但是,当我使用查询时:
SELECT top(10) StockValue, StockQuantity
FROM dbo.StockEOMonth
查询需要13 分钟才能返回10行。
我不确定如何优化这样一个微不足道的观点。有没有人有想法?我可以将表创建为实际表,但如果可能的话,它希望将其作为view
。
修改
我已经体验到SSMS
和SSAS
中检索数据的速度缓慢,我已经从我开始将视图用作数据源的实例中获得了ErrorCode 3240034318
对于度量组,其中ErrorCode似乎与Query TimeOut相关。
答案 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)