2011-10-31 26 views
0

タイトルとして、ストアドプロシージャをどのように並列に実行するのですか?ストアドプロシージャの実行パラレルウェイ

詳細は、SQL Serverでストアドプロシージャを作成してExecute_Sqlを呼び出し、1つのパラメータのAreaID INTを引数として渡します。

IDをループして一度に1つのIDを渡してNew_IDを取得することで、.net C#から正常に呼び出して実行しました。

ここで私の問題は、私はストアドプロダクトを実行する並列方法をしようとしています。例えばID = 1を実行しているときなど、同時にID = 2を実行しました。

Whats私の頭の中には、並列処理を作成したスレッドがあります。ストアードプロードを実行するには何か方法がありますか?

+1

おそらく、いくつかの 'AreaID'をとり、SQLサーバー上で一度にすべての処理を行う新しいストアドプロシージャを書くことができます。 –

+0

@CoryLarsonはあなたに同意しましたが、処理の進捗状況を示す必要がある場合があります。 – Damith

答えて

0

あなたは別の手段を介してで自分のパラメータを取得する必要があると思いますので、あなたはしかし、仕事にパラメータを渡すことはできませんsp_start_job

を調査することができます。

テーブルからパラメータを読み込み、sprocを実行する値をテーブルに入力してから、ジョブへの呼び出しを数回実行するようにジョブを設定できます。

ジョブ間の労力の重複を避けるために、ビットフラグや行の何かを更新することで、作業している行をマークすることをお勧めします。手始めに

http://msdn.microsoft.com/en-us/library/ms186757.aspx

0

あなたのコードを投稿すると、それが参考になります。多くの場合、SQLは「セットベース」の方法で複数の値を処理するように変更できます。言い換えれば、処理する一連の値があれば、それらを同時に処理することができます。

これを達成する方法はたくさんあります。区切られた文字列を渡して、それをあなたのprocで解析することができます。この実装に関する多くのアイデアhere

APPLYを使用してXMLを渡し、procのXMLに「結合」することもできます。 SQLで

2008+あなたは私はあなたがエリアIDパラメータでやっている内容を正確に把握していないので、私はので、ここであなたの質問に答えてきた場合、私は知らないTable Valued Parameters

を使用することができますが、いくつかのより多くのです情報

ストアドプロシージャを非同期に実行する場合は、パラメータをキューに入れて別のスレッドがキューを処理できるようにするService Brokerが最適です。 SQLは、すべての順序付け、ロック、再試行、スレッドの生成/消去などを管理します。非常に堅牢なシステムです。

進捗状況の追跡に関するOPに接続されているように見える別のユーザーからの質問にコメントがあります。

バッチIDとareaIDパラメータとステータスフラグを含む「キュー」テーブルがあります。あなたのアプリとコールの一意のバッチIDを持つキュー表に

CREATE TABLE asynchQueue 
(
    RecNo INT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
    BatchID INT, 
    AreaID INT, 
    Status TINYINT 
) 

あなたのC#のアプリインサート(グループへのご要望)

あなたは、このように定期的に実行するようにスケジュールPROCがあります。

CREATE PROC ProcessQueue 
AS 
BEGIN 
    SET XACT_ABORT ON 

    DECLARE @RecNo INT, 
      @AreaId INT 

    BEGIN TRAN 
     SELECT TOP 1 @RecNo = recNo, 
       @AreaID = areaId 
     FROM AsynchQueue WITH ROWLOCK, XLOCK 
     WHERE Status = 0 

     UPDATE AsynchQueue SET Status = 1 --Mark record as in progress 
     WHERE RecNo = @RecNo 
    COMMIT 

    EXEC YourProc @AreaId 

    UPDATE AsynchQueue SET Status = 2 -- Mark Record as complete 
     WHERE RecNo = @RecNo   

END 

また、procには、テーブル内のすべてのレコードを処理するためのループを含めることができます。 John Weldonが提案したように、procはsp_start_jobを使用してオンデマンドでスケジュール設定または起動することができます。次のように

その後、状況を照会できます。

SELECT COUNT(NULLIF(Status, 0))/COUNT(*) as PctComplete --in progress or complete div by total 
FROM AsynchQueue WITH NOLOCK 
WHERE BatchID = @yourBatchId 

そのクエリはあなたのバッチの完全なパーセントを与えます。

関連する問題