私は最近これを調査しなければならなかったので、より完全な答えを求めていたこの古い質問を見つけました。完全に明確にするために: TSQL には(それ自体で)他の TSQL 操作を非同期的に起動する機能はありません。
それは、まだ多くのオプションがないという意味ではありません (それらのいくつかは他の回答で言及されています):
- カスタム アプリケーション: 非同期メソッドを使用して、選択した言語で簡単なカスタム アプリを作成します。各アプリケーション スレッドで SQL ストアド プロシージャを呼び出します。
- SQL エージェント ジョブ: 複数の SQL ジョブを作成し、 を使用して proc から非同期的に開始します
sp_start_job
。Gregory A. Larsen によるこの優れた記事xp_sqlagent_enum_jobs
で説明されているように、文書化されていない関数の使用をまだ終了しているかどうかを確認できます 。(または、クリスが提案するように、ジョブ自体に独自の JOB_PROGRESS テーブルを更新させます。) 実行すると予想される並列プロセスごとに、文字通り、異なるパラメーターで同じストアド プロシージャを実行している場合でも、個別のジョブを作成する必要があります。
- OLE オートメーション:この記事(Gregory A. Larsen 著) で説明されているように、 と を使用
sp_oacreate
しsp_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 クエリ ヒントを使用して変更できます。