SQL Server 2008 R2を実行している運用データベースサーバーがあります。 1つのデータベースのユーザークエリがすべてのシステムリソースを占有し、サーバー上のすべてのデータベースを停止するのを防ぐにはどうすればよいですか?
私が抱えている特定の問題は、長時間実行されるカーソルを使用したクエリに関するものです。クエリを実行すると、すべてのコアでCPU使用率が100%になり、他のデータベースでの単純なクエリでさえ、速度が低下したりタイムアウトしたりします。これは正常ですか、これを防ぐためのベストプラクティスは何ですか?
Enterprise Editionを使用している場合は、 Resource Governor を使用できます( 数年前に、このトピックについてMicrosoftのホワイトペーパーを書きました )。これは、(SUSER_SNAME()
またはHost_NAME()
によって)このユーザーのみを識別できる場合に特に効果的です。残念ながら、これを使用して1つのクエリのみに制限を加えることはできません。ログイン時に実装され、セッションの存続期間中すべてのクエリに影響しますが、一般的にはCPUを制限できます。 SQL Server 2008およびR2では、この制約はボックスに他の競合がある場合にのみ適用されることに注意してください。 SQL Server 2012では、新しい設定(_CAP_CPU_PERCENT
_)があり、ボックスに1つしかない場合でも、リソースプールのCPUを制限できます。
問題を攻撃する別の方法(または追加の方法)は、クエリテキスト自体を制御できる(たとえば、ユーザーまたはそのアプリによって特別に組み立てられていない)場合、その特定のクエリを常にOPTION (MAXDOP 1)
-それでもCPU使用率が高くなり、クエリに時間がかかる可能性がありますが、その設定を使用して、影響を受けるスケジューラーの数を制限できます。したがって、16コアのボックスでは、この特定のクエリの直接的な結果としてCPUスパイクが1つだけ表示されます。