0

レポートサービスを使用して複雑なレポートを取得しました。レポートはSQl2005データベースに接続し、多数のストアドプロシージャと関数を呼び出しています。最初は問題なく動作しますが、数か月後(データが大きくなる)、タイムアウトエラーが発生します。

パフォーマンスを向上させるためにいくつかのインデックスを作成しましたが、インデックスの作成後に機能するという奇妙なことに、翌日同じエラーがスローされます。次に、データベースの統計を更新しようとすると、再び機能します(クエリの実行時間が10倍向上します)。しかし、再び、それは翌日動作を停止します。

さて、一時的な解決策は、1時間ごとに更新統計を実行することです。しかし、私はこの振る舞いについての合理的な説明を見つけることができません。データベースはそれほどビジーではなく、1日で大量のデータが更新されることはありません。更新統計はどのように大きな違いを生むことができますか?

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 プロファイラーは、このような状況で、実行ごとにどのような変更があったかを特定するのに非常に役立ちます。

于 2009-10-20T11:55:04.210 に答える