2011-06-21 32 views
1

私は100回(各パラメータに1つずつ)実行する必要があるストアドプロシージャを持っています。私はバッチなどを使ってこれらのすべてを同時に実行できるかどうか疑問に思っていました。そのため、1つを実行する代わりに処理を高速化するようになりました。SQL Serverは複数のコマンドを同時に実行します

ありがとうございます!

+4

疑わしくもセットベースのソリューションの代わりに手続き型のソリューションが好きです。コードを表示すると、ストアドプロシージャを1回だけ呼び出す方法がわかります。 –

+0

procをどこから実行していますか?別のSQLバッチ、または(スレッド可能な...).NETアセンブリのような外部呼び出し元の何らかの並べ替え?また、100回の並列実行では必ずしも処理が高速化されるわけではありません。ロックやリソースの競合などが発生していないことを確認していますか? – pelazem

+0

私はループしているprocを通してそれらを実行しているレコードをテーブルに持っています。私は2百万のレコードを扱っており、すべてのレコードを取得する最速の方法を見つけることを試みていた – Jim

答えて

3

TABLEパラメータを受け入れ、100個の値を入力し、100個のスカラーの代わりにテーブルを処理するプロシージャを書き直すことはできますか?

1

あなたの質問に直接答えるには、100の別々の接続を開き、100の別々のクエリを同時に実行することができます。

しかし、これまで述べたように、私はこれがあなたのための解決策ではないと思います。


あなたは100個の値を持つテーブルを持っているとして、あなたがいくつかのオプションを持っているようだ...


  • 変更にStoredProcedureビューに、との参加景色。
  • StoredProcedureをTable Valued関数に変更し、CROSS APPLYを使用します。
    (インライン関数はマルチステートメント機能よりもかなり良く実行されます。)

これら二つはビューでも機能でもないが...いいえ書き込み任意の副作用を持つことはできませんという事実によってlimittedされていますビューまたは関数を使用するようにコードをリファクタリングすることができない場合など


テーブルなどに、あなたはまだ、コードをカプセル化するストアドプロシージャを必要とします。

この場合、次のいずれかを実行できます。
- テーブル値パラメータとして値のテーブルを渡します。
- または単にストアドプロシージャをテーブルから直接読み込むことができます。

必要に応じて、このSPの読み込み専用テーブルを作成することもできます。これは、しかし、いくつかの追加の問題を紹介します...
- 並行性:どのように私のデータを別の人から守るために?セッションの@@ SPIDなどの一意の識別子を保持するフィールドを持つ。
- クリーンアップ:プロセスは一日中データを挿入し、削除は一切しません。


私はあなたがループ/カーソルを使用していないよう強くお勧めします一つのこと。あなたがセットベースのアプローチを見つけることができれば、それを使用:)


EDIT

はあなただけで左のコメントはあなたが処理するために、数百万レコードを持っていることを言及しています。

これは、セットベースのアプローチを使用することがはるかに望ましいです。ただし、非常に大きなトランザクションが作成されることがあります(INSERT、UPDATEなど)。どのような場合でも、セットベースのアプローチを見つけて、これを小さなもので行う方法を見つけることができます(データが時間に関連する場合は1日に1回、1回に1000レコードしか適用されません)。

関連する問題