0

私は毎晩実行されるプロセスをサポートしており、未払いの広告申込情報のある請求書を持つさまざまなクライアントを見ています。このプロセスは、ステージングテーブルからすべてのレコードを削除してから、いくつかの請求書明細をステージングテーブルに挿入することから始まります。プロセスはクライアントごとに実行されるため、一部のクライアントでは200個の広告申込情報があり、一部のクライアントでは50,000個の広告申込情報がある場合があります。私たちは絶えず膨大な時間を費やしているプロセスに常に問題を抱えています。この問題は、SQL Serverがその時点でステージングテーブルにある正しい行数を見積もることができないために、不正な実行計画が生成されているように見えます。私の質問は、関与するストアドプロシージャのカーディナリティ推定を向上させるために、行数を手動で設定する方法はありますか?これは、実行の開始時に選択カウント(primaryKey)を使用して実行することができます。現在の実行ステージング・テーブルにデータが移入された直後ですか?ステージングテーブルのカーディナリティ推定を改善するにはどうすればよいですか?

+1

削除して挿入し、ステージングテーブルから選択しない場合は、なぜSQLはステージングテーブルの統計データを使用しますか?たぶん私は何かが欠けているでしょう。ステージングテーブルのデータに基づいて挿入/削除を選択またはマージしてベースにしていない限り、統計はなぜ重要なのでしょうか?それとも、削除/挿入が完了した後に話しているのですか?ステージングテーブルの解析が遅いですか?あなたはテーブル/インデックスビューで強制更新を試しましたか? https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-updatestats-transact-sql – xQbert

+1

プロセスが開始する前に、テーブルの統計を更新することができます。 https://docs.microsoft.com/en-us/sql/t-sql/statements/update-statistics-transact-sql。統計を更新した後、ストアド・プロシージャを再コンパイルして、SQLに新しい実行計画が提示されるようにすることができます。 https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-recompile-transact-sql – Jason

+1

すべての行を削除して再投入すると、統計は更新されます。おそらく、異なるクライアントの行数が大きく異なるが、遭遇した最初のものに対して計画がコンパイルされただけで、パラメータスニッフィングが発生している可能性があります。この場合、問題のクエリに 'OPTION(RECOMPILE)'を追加すると便利です。 –

答えて

1

このテーブルで大きなバッチ処理を実行しています。バッチの前にすべてのインデックスを削除し、バッチ後に再びインデックスを作成するのは良い方法です。

これを行うと、統計情報が更新され、問題の原因にはなりません。

統計に関するより一般的な情報にも注意してください。SQL Server 2014を実行している場合は、 SQL Server 2016用に作成されました。データベースがSQL Server 2016の互換性レベルで動作しているかどうかを確認してください。

SQL Server 2014を実行している場合は、トレースフラグ2371を有効にすることをお勧めします。このトレースフラグは、SQL Serverが統計の自動更新に使用する基準を向上させます。このトレースフラグを有効にするには、SQL Server Configuration Managerを使用する必要があります。

ただし、最初の提案に従い、インデックスを削除して作成すると、他の2つの提案は影響が少なくなるか、影響はありません。

+0

なぜインデックスを削除&再作成するのではなく、削除して再作成するのですか? – alroc

+0

Sql Server 2008. –

+1

@alrocクラスタードインデックスを無効にすると、テーブルは読み取り専用になります。 –

関連する問題