0

我使用报告服务获得了一份复杂的报告,该报告连接到一个 SQl 2005 数据库,并调用了一些存储过程和函数。它最初工作正常,但几个月后(数据增长),它遇到超时错误。

我创建了一些索引来提高性能,但奇怪的是它在创建索引后工作,但第二天又抛出了同样的错误。然后我尝试更新数据库上的统计信息,它再次工作(查询的运行时间提高了 10 倍)。但同样,它在第二天停止工作。

现在,临时解决方案是我每小时运行一次更新统计信息。但我找不到这种行为的合理解释。数据库不是很忙,一天不会更新很多数据。更新统计数据怎么能有这么大的不同?

4

2 回答 2

3

我怀疑你有参数嗅探。更新统计信息只会强制丢弃所有查询计划,因此它似乎可以工作一段时间

CREATE PROC dbo.MyReport
    @SignatureParam varchar(10),
    ...
AS
...
DECLARE @MaskedParam varchar(10), ...
SELECT @MaskedParam = @SignatureParam, ...

SELECT...WHERE column = @MaskedParam AND ...
...
GO
于 2009-10-20T05:10:39.973 回答
0

当基础表上的索引需要调整或 SQL 需要工作时,我已经看到了这个问题。

重建索引和更新统计信息将表读入缓存,从而提高了性能。第二天,表已从缓存中清除,性能问题再次出现。

SQL Profiler 在这些情况下非常有用,可以识别每次运行的变化。

于 2009-10-20T11:55:04.210 回答