查询性能取决于参数 21 秒 vs. > 14 小时

noj*_*lag 6 sql-server sql-server-2008-r2

我有以下查询:

SELECT DISTINCT DATEADD(ms,DATEDIFF(ms,0,[Time]),DATEADD(dd,0,DATEDIFF(dd,0,[DATE]))),
                [DATE],
                DATEPART(YY,[DATE]),
                DATEPART(MM,[DATE]),
                DATENAME(MONTH,[DATE]),
                DATEPART(DD,[DATE]),
                [Time],
                DATEPART(HH,[Time]),
                DATEPART(MI,[Time]),
                DATEPART(SS,[Time])
FROM [SourceTable]
WHERE ([DATE] BETWEEN '2012-01-08' AND '2012-01-08') AND
       DATEADD(ms,DATEDIFF(ms,0,[Time]),DATEADD(dd,0,DATEDIFF(dd,0,[DATE]))) NOT IN
       (SELECT [DateTime]
        FROM [DIM].[DateTime] 
        WHERE [Date] BETWEEN '2012-01-08' AND '2012-01-08')
ORDER BY [DATE], [Time]
OPTION (MAXDOP 6)
Run Code Online (Sandbox Code Playgroud)

当我使用这个特定日期时,我不得不在 14 小时运行时间后取消查询,任何其他日期相同的查询通常需要 21 秒。我确实检查了查询执行计划,与我使用它的日期无关,查询影响的行数每天几乎相同(大约 500'000 行)。我检查了索引,统计数据是最新的。如何解释这种行为以及如何解决这个问题?

机器硬件足够(8核,192 GB RAM)

小智 2

我不了解 sqlserver,但在 Oracle 数据库中,我建议对 sql 执行进行跟踪,其中包括导致查询花费时间的所有等待和事件。这显示了 sql 执行的确切环境,这可能与您执行解释计划的环境有很大不同。Sqlserver无疑具有类似的功能来显示真实的执行情况,包括等待。

在 Oracle 中,我们有 sql 计划稳定性。也许sqlserver有类似的东西?在这种情况下,请尝试使用它。