11

毎晩実行されるストアド プロシージャがあり、それによって他の多くのプロシージャが開始されます。これらの手順の一部は、他の手順と並行して論理的に実行できます。

  • プロシージャを並列で実行するかシリアルで実行するか (つまり、非同期で開始するかブロックするか) を SQL Server に示すにはどうすればよいですか?
  • プロセスがテーブルアクセスやロックをめぐって競合しないことをすでに判断していることを念頭に置いて、それらを並行して実行することの意味は何でしょう-ディスクIOとメモリの合計だけです。ほとんどの場合、同じテーブルを使用することさえありません。
  • これらのプロシージャのいくつかが同じプロシージャで、パラメータが異なるだけで問題になるでしょうか?
  • ペアまたはプロシージャを非同期で開始する場合、SQL Server に両方が終了するのを待つ適切なシステムがありますか、またはそれぞれにフラグを設定し、フラグを定期的にチェックしてポーリングする必要がありWAITFOR DELAYますか?

現時点では、まだ SQL Server 2000 を使用しています。

補足として、メインフレーム システムからサーバーへのデータ ダンプの完了に応答してメイン プロシージャが開始されるため、これは重要です。メインフレームのダンプには毎晩約 2 時間かかりますが、それを制御することはできません。そのため、Google では処理時間を短縮する方法を常に模索しています。

4

4 に答える 4

14

私は最近これを調査しなければならなかったので、より完全な答えを求めていたこの古い質問を見つけました。完全に明確にするために: TSQL には(それ自体で)他の TSQL 操作を非同期的に起動する機能はありませ

それは、まだ多くのオプションがないという意味ではありません (それらのいくつかは他の回答で言及されています):

  • カスタム アプリケーション: 非同期メソッドを使用して、選択した言語で簡単なカスタム アプリを作成します。各アプリケーション スレッドで SQL ストアド プロシージャを呼び出します。
  • SQL エージェント ジョブ: 複数の SQL ジョブを作成し、 を使用して proc から非同期的に開始しますsp_start_job。Gregory A. Larsen によるこの優れた記事xp_sqlagent_enum_jobsで説明されているように、文書化されていない関数の使用をまだ終了しているかどうかを確認できます 。(または、クリスが提案するように、ジョブ自体に独自の JOB_PROGRESS テーブルを更新させます。) 実行すると予想される並列プロセスごとに、文字通り、異なるパラメーターで同じストアド プロシージャを実行している場合でも、個別のジョブを作成する必要があります。
  • OLE オートメーション:この記事(Gregory A. Larsen 著) で説明されているように、 と を使用sp_oacreatesp_oamethodて、他のストアド プロシージャを呼び出す新しいプロセスを起動します。
  • DTS パッケージ: 単純な分岐タスク フローで DTS または SSIS パッケージを作成します。DTS は、個々の spid でタスクを起動します。
  • Service Broker : SQL2005+ を使用している場合は、Service Brokerの使用を検討してください。
  • CLR 並列実行: CLR コマンドParallel_AddSqlを使用し、 Alan Kaplan によるこの記事Parallel_Executeで説明されているように(SQL2005+ のみ)。
  • スケジュールされた Windows タスク: 完全を期すためにリストされていますが、私はこのオプションのファンではありません。

私は Service Broker や CLR の経験があまりないので、これらのオプションについてコメントすることはできません。私だったら、単純なシナリオでは複数のジョブを使用し、より複雑なシナリオでは DTS/SSIS パッケージを使用するでしょう。

最後のコメント: SQL は、可能な場合はいつでも個々の操作を並列化しようと既に試みています*。つまり、2 つのタスクを交互に実行するのではなく、同時に実行しても、タスクがすぐに終了するという保証はありません。実際に何かが改善されるかどうかを慎重にテストしてください。

同時に 8 つのタスクを実行する DTS パッケージを作成した開発者がいました。残念ながら、それは 4 CPU サーバーのみでした :)

*デフォルト設定を前提としています。これは、サーバーの最大並列度またはアフィニティ マスクを変更するか、MAXDOP クエリ ヒントを使用して変更できます。

于 2011-01-10T15:41:13.097 に答える
3

それぞれが特定の proc を実行する SQL Server エージェント ジョブをいくつか作成します。

次に、マスター プロシージャ内からジョブを開始します。

私が考えることができる唯一の待機方法は、終了時に各 proc が更新するステータス テーブルがある場合です。

次に、さらに別のジョブがそのテーブルをポーリングして完全な完了を確認し、最終的な proc を開始することができます。または、このテーブルにトリガーを設定することもできます。

メモリへの影響は、完全に環境次第です..

更新: タスク システムにアクセスできる場合は、同じアプローチを取ることができます。ウィンドウに複数のタスクを実行させ、それぞれが 1 つの proc を担当するだけです。次に、ステータス テーブルでトリガーを使用して、すべてのタスクが完了したときに何かを開始します。

UPDATE2: また、新しいアプリを作成する場合は、すべてのロジックを 1 つの exe ファイルに格納できます...

于 2008-12-08T16:06:37.443 に答える
2

DTS(SQLエージェントからジョブとして実行できます)の使用を検討することをお勧めします。これにより、他のストアドプロシージャが終了するのを待つ必要があるストアドプロシージャと、並行して実行できるものを非常に細かく制御できます。必要に応じて、独自のスケジューリングソフトウェアからEXEとしてDTSパッケージを実行することもできます。

注:呼び出しを並行して実行できるようにするには、接続オブジェクトの複数のコピーを作成する必要があります。同じ接続オブジェクトを使用する2つの呼び出しは、依存関係を明示的に設定しなくても、相互にブロックします。

于 2008-12-08T19:24:27.607 に答える
2

あなたはあなたの夜通しのsprocsを仕事に移す必要があります。SQL Serverのジョブ制御により、要求しているすべてのスケジューリングを実行できます。

于 2008-12-08T18:45:08.780 に答える