あるシステムの監査データを分析して別のシステムのレポートデータを作成するプロセスがあります。分析されるべき毎日のためにループする管理手順があり、現在の反復の日でエンティティ固有の手順を呼び出す。一部のエンティティは処理に1秒未満かかる一方、他のエンティティは数分かかることがあります。 t-sqlのように連続して実行すると、CPU使用率が16コアサーバーで8%を超えることはありません。エンティティ固有の手順のそれぞれは、他のエンティティに依存しない。その日のすべてのエンティティは、翌日の開始前に完了するだけである。SQLプロシージャでサブタスクを並行して実行する方法
私の考えは、CLR管理プロシージャを持って、自分のスレッドで実行している日の実行プロシージャを長くしてから、すばやく実行したら、すべてのエンティティを待つためにThread.Join()次の日に移動する前にその日に完了してください。
以下は、1つのワーカースレッドだけで動作するシンプルなものですが、そのスレッドでStartを呼び出しても静的メソッドが呼び出されるわけではありません。私はHelloWorldメソッドでブレークポイントを設定しましたが、決してヒットしません。
私はコンソールアプリケーションでこれと非常によく似た方法を試して、AsyncHelloWorldの開始時にコメントアウトされた行の同じスレッドで呼び出すようにしました。異なるSQL CLRプロシージャ内のスレッドに関する何かがありますか?
using System.Threading;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[SqlProcedure]
public static void AsyncHelloWorld()
{
// HelloWorld(SqlContext.Pipe);
var worker = new Thread(HelloWorld);
worker.Start(SqlContext.Pipe);
worker.Join();
}
public static void HelloWorld(object o)
{
var pipe = o as SqlPipe;
if (pipe != null)
pipe.Send("Hello World!");
}
}
エラーが発生しても、何も起こりませんか? – Nate
HelloWorldメソッドは呼び出されません。 –