SQL延迟语句在Azure SQLDB上运行时间太长

时间:2018-04-13 16:50:40

标签: sql tsql azure-sql-database

我的声明如下

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个记录的延迟会花费这么长时间。

任何建议都将不胜感激。

2 个答案:

答案 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子句过滤了大量的数据,那么同样的索引对你没有帮助...