SQL Server 2014で実行されているCLRストアドプロシージャがあります。このストアドプロシージャは、いくつかのデータ(通常は数万行の範囲の番号)を収集し、データに対していくつかの計算を実行して、出力データセットを生成し、その出力データセットを書き込みますいくつかの宛先テーブルに。小さな実行の場合、これには数秒かかります。大規模な実行の場合、現在約25分かかります。その25分間に、SQLCLR_QUANTUM_PUNISHMENT待機がかなりの数待機していることがわかりました。したがって、私はこれらの待機の発生を減らすために何ができるかについて自分自身を教育しようとしています。 「実行量を超えたためにCLRタスクが抑制された場合に発生します。この抑制は、他のタスクに対するこのリソース集約型タスクの影響を減らすために行われます」と言うリソースがたくさん見つかりました。 SQL Serverの実行量は4ミリ秒であると読みました。それで、CLRストアドプロシージャまたは関数が4msを超えるCPU時間をとるときはいつでも、この待機タイプが発生すると思いますか?
また、 一部のCLRプロシージャが生成する必要があることを示す参照 も見つけました。これで、CLRプロシージャはシングルスレッドになりました。私は確かに主要な場所でいくつかの睡眠の呼び出しを追加し、それがどのような影響を与えるかを見ることができます。しかし、私は何が起こっているのかをよりよく理解したいと思います。誰かが共有する良い知識を持っているか、良いドキュメント/記事へのリンクを持っているなら、私はそれを感謝します。このBOLの見積もりを超えて、この待機タイプに関する情報を見つけるのは少し困難でした。
残念ながら、このトピックに関する情報はあまりありません。確かに、コードのさまざまな場所にThread.Sleep(0);
を追加する必要があります。そうすることで、SQL Serverにスレッドを制御する機会が与えられます。 SQL Serverにはすでにそれを管理する機能があるため、データアクセスを行う場所(つまり、SqlClient
のもの)では必要ありません。
また、@ Remus Rusanuは、別の質問(おそらくスタックオーバーフローに関する)で Thread.BeginThreadAffinity / Thread.EndThreadAffinity を使用して長時間実行プロセスを管理することを推奨しましたが、それらを使用するにはアセンブリがUNSAFE
に設定されていること。