2010-11-30 6 views
2

あるシステムの監査データを分析して別のシステムのレポートデータを作成するプロセスがあります。分析されるべき毎日のためにループする管理手順があり、現在の反復の日でエンティティ固有の手順を呼び出す。一部のエンティティは処理に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!"); 
    } 
} 
+0

エラーが発生しても、何も起こりませんか? – Nate

+0

HelloWorldメソッドは呼び出されません。 –

答えて

6

あなたは絶対にできません。 SqlPipeは、呼び出されたスレッドのコンテキストに非常に強く結びついています。技術的には、SQLCRLからスレッドを起動できますが、が元のスレッドの呼び出し元とすべて対話する必要があります。しかし、それでもSQLのホスト環境内でCLRスレッドを起動すると、は非常にという悪い考えです(詳細は記入しません)。

代わりに、ロジックをパラレルで呼び出すことのできるプロシージャに分割し、これらのプロシージャをクライアントから並列に呼び出します。 Asynchronous procedure executionをスケジューリング手順のパターンとして非同期に起動することができ、キューベースのアクティベーションにはMAX_QUEUE_READERS設定による並列処理が組み込まれています。

しかし、ほとんどの場合、手順に明示的な並列処理は必要ありません。明示的なユーザー制御並列性の恩恵を受けることができる以上のT-SQL負荷は、まれにしか言及する価値がありません(並行タスク間でトランザクションの意味を引き出すことは単なる死人にすぎません)。 T-SQLは、データを並列処理するために内部ステートメントの並列処理を利用できるため、明示的な並列処理は必要ありません。

それでは、あなたは何かを説明してください。実際には解決しようとしています。

+0

監査ログを報告データベースに集約して、報告対象のシステムの「現在の」クエリをサポートしています。インポートプロセスには2つの主なフェーズがあります.1つはソースシステムから分析されない新しい監査レコードを取得し、2つ目はサマリーを計算し、そのデータをレポート対象エンティティに変換します。 –

+0

これはETLの風味のようです。あなたはSSISを考えましたか? –

+0

背景を追加するために説明を更新しました。私はSSISの経験がありません。複数の手順を開始し、完了したら通知を受け、次のグループの開始をトリガーすることができますか? –

関連する問題