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)此查询没有阻止程序。
注意:由于这是将其他表传递给变量时的动态查询,因此此查询运行平稳。它仅与特定表有关。我确实更新了统计信息并重建了该表的索引。没用
答案 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中排除了它们。
查询现在运行很快。