有效数月的查询现在超时

时间:2015-10-22 13:45:37

标签: sql-server delphi database-performance sql-server-2008r2-express sqlperformance

我有一个从Delphi应用程序运行的查询,该应用程序在上周完全运行数月之后突然开始超时。更进一步,当它运行时,它会使服务器变慢,导致其他用户认为系统崩溃 从Management Studio运行我在旋转超过5分钟后停止查询 服务器ID SqlExpress 2008 R2

现在有问题的查询

SELECT     *
FROM        SignelOutilsListeJobs_View4
WHERE     (CreatedDate > (GETDATE() - 365))

这里有趣的是所需的时间和当我改变返回的天数时,行返回。活动监视器似乎没有显示超过查询正在运行的

SELECT     *
FROM        SignelOutilsListeJobs_View4 -- 00.00.02 38882 ROWS

SELECT     *
FROM        SignelOutilsListeJobs_View4
WHERE     (CreatedDate > (GETDATE() - 600)) -- 00.00.02 16217 ROWS


SELECT     *
FROM        SignelOutilsListeJobs_View4
WHERE     (CreatedDate > (GETDATE() - 500)) -- 00.00.02 13013 ROWS


SELECT     *
FROM        SignelOutilsListeJobs_View4
WHERE     (CreatedDate > (GETDATE() - 200)) -- 00.00.12  4118 ROWS

所以我想知道这里发生了什么?有什么想法吗?

由于

1 个答案:

答案 0 :(得分:1)

来自GETDATE (Transact-SQL)

  

将SWITCHOFFSET与函数GETDATE()一起使用会导致查询运行缓慢,因为查询优化器无法获得GETDATE值的准确基数估计值。我们建议您预先计算GETDATE值,然后在查询中指定该值,如以下示例所示。此外,使用OPTION(RECOMPILE)查询提示强制查询优化器在下次执行相同查询时重新编译查询计划。然后,优化器将具有GETDATE()的准确基数估计值,并将生成更有效的查询计划。

换句话说,您可以尝试按如下方式编辑查询:

SELECT *
FROM SignelOutilsListeJobs_View4
WHERE CreatedDate > (GETDATE() - 200) OPTION (RECOMPILE)

作为上述替代方案,您可以考虑在视图上创建唯一聚簇索引

CREATE UNIQUE CLUSTERED INDEX SignelOutilsListeJobs_unique_index1
ON SignelOutilsListeJobs_View4 (CreatedDate, <some unique key>)

来自Microsoft TechNet: