动态插入到临时查询中挂了几个小时

时间:2018-06-23 12:51:59

标签: sql sql-server performance

INSERT INTO #TEMP(ID,CID,STS,ETL_NBR,T_ID)
    SELECT STG.ID,STG.CID,STG.STS,STG.ETL_NBR,STG.T_ID 
    FROM DBO.A_STAGE STG(NOLOCK) 
    INNER JOIN DBO.A_PRE PRE(NOLOCK)
    ON PRE.ID=STG.ID AND PRE.CID=STG.CID 
    WHERE PRE.STS = 'D'
    AND STG.ETL_NBR < PRE.ETL_NBR

以上查询是从存储过程内部的Dynamic SQL构造的。联接中涉及的表实际上是通过变量读取的。该查询也挂起了少量数据。

1)如果我根据上述条件执行SELECT,查询仍将显示0条记录。对于插入,它会挂几个小时。

2)此查询没有阻止程序。

注意:由于这是将其他表传递给变量时的动态查询,因此此查询运行平稳。它仅与特定表有关。我确实更新了统计信息并重建了该表的索引。没用

2 个答案:

答案 0 :(得分:1)

这可以是经典的参数嗅探,您可以在此处了解更多信息:what-is-parameter-sniffing

使用查询中的OPTION (RECOMPILE)可以提高此类查询的性能

您需要在查询结束时添加内容
您还可以为每个变量使用UNKNOWN,如下所示:

OPTION (OPTIMIZE FOR (@variable 1UNKNOWN, @variable2 UNKNOWN, ....))

您可以在此处了解更多信息:improving-query-performance-with-option-recompile-constant-folding-and-avoiding-parameter-sniffing-issues/

答案 1 :(得分:0)

PRE.CID = STG.CID

此特定联接具有NULL和空格。它不是唯一或PK列。因此,缓慢。我通过添加PRE.CID IS NOT NULL在Join中排除了它们。

查询现在运行很快。