我有一个从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
所以我想知道这里发生了什么?有什么想法吗?
由于
答案 0 :(得分:1)
将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: