我的声明如下
SELECT H.[StorageItemId]
,H.[FullyQualifiedName]
,V.DateTime
,V.Value
--,lag(V.Value) over (order by V.DateTime) as prevVal
FROM [dbo].[History_StorageItem] as H
JOIN [dbo].[History_Integer] as V on H.StorageItemId = V.StorageItemId
where H.FullyQualifiedName like '%.Flt_No'
and V.QualityDetail=192 and V.DateTime>getdate() -8
如果我评论延迟部分,我会得到大约50条记录,并且它会在几秒钟内运行。但是当我包含滞后部分时,查询大约需要5分钟来执行。 Azure上的定价层是高级p4,带有500 DTUS。但我不认为50个记录的延迟会花费这么长时间。
任何建议都将不胜感激。
答案 0 :(得分:1)
您可以尝试子查询/ cte:
WITH cte AS (
SELECT H.[StorageItemId]
,H.[FullyQualifiedName]
,V.DateTime
,V.Value
FROM [dbo].[History_StorageItem] as H
JOIN [dbo].[History_Integer] as V
on H.StorageItemId = V.StorageItemId
where H.FullyQualifiedName like '%.Flt_No' -- notSargable condition
and V.QualityDetail=192
and V.DateTime > getdate()-8
)
SELECT *, lag(Value) over (order by DateTime) as prevVal
FROM cte;
这应该会改变执行计划。不幸的是,没有force intermediate materialization of CTE提示。
另一种选择是使用临时表:
SELECT H.[StorageItemId]
,H.[FullyQualifiedName]
,V.DateTime
,V.Value
INTO #temp
FROM [dbo].[History_StorageItem] as H
JOIN [dbo].[History_Integer] as V
on H.StorageItemId = V.StorageItemId
where H.FullyQualifiedName like '%.Flt_No' -- notSargable condition
and V.QualityDetail=192
and V.DateTime > getdate()-8;
SELECT *, lag(Value) over (order by DateTime) as prevVal
FROM #temp;
答案 1 :(得分:0)
f我评论滞后部分我得到大约50条记录并且它在几秒钟内运行
要使窗口函数有效工作,您应该有一个POC索引..
因此,为了使您的查询运行良好,我建议在history_integer表
下面建立索引Game.js
上述索引有一个权衡,这个索引适用于你的分区子句,但是如果你的where子句过滤了大量的数据,那么同样的索引对你没有帮助...