2011-11-10 12 views
1

クエリを並行して実行する簡単な方法はありますか?私は次のようなクエリを持っています:SQL Server 2008 - クエリを並行して実行する

delete from TableA where id = @id 
delete from TableB where id = @id 
delete from TableC where id = @id 
... 

と私はそれらを並行して実行したいです。私はまた、C#を使用することもできますが、方法はわかりません。

+0

これらのテーブルの間に外部キーの関係がある場合、それはあなたが思ったほどパフォーマンスが悪いことがあります。 –

+0

ああ、これらのテーブルはすべて、私が最後にやるマスターテーブルを除き、独立しています。 – Timmy

+0

これは本当にperfの問題で、3つのテーブルからIDでいくつかの行を削除する並列処理のコードを複雑にする価値がありますか? – bryanmac

答えて

3

最初のアイデアは、別のスレッドと別の接続を持っていることですが、私はあなたが非同期コールバックを使用して、単一のスレッドで複数の接続とそれを管理することができると思います。

string[] tables = new string[] { "TableA", "TableB", "TableC" ... }; 
var runningCommands = new List<SqlCommand>(); 
foreach(var table in tables) 
{ 
    var conn = new SqlConnection(...); 
    conn.Open(); 
    var cmd = new SqlCommand("DELETE FROM " + table + " WHERE id = @id"); 
    cmd.Parameters.Add(new SqlParameter("@id", id); 
    cmd.BeginExecuteNonQuery(); 
    runningCommands.Add(cmd); 
} 
// now wait for all of them to finish executing 
foreach(var cmd in runningCommands) 
{ 
    cmd.EndExecuteNonQuery(); 
    cmd.Connection.Close(); 
} 
+2

パラレル化は本当に重要ではありません。要求は引き続きデータベース内で順番に実行されます。そのため、トランザクションログを使用して特定の時点にリストアすることができます。 –

+0

ありがとう、これはおそらく私が望むものに近いでしょうが、残念なことに、我々は.NET 1.1にあります。 – Timmy

+0

@OMG Ponyを更新するように彼らを説得する必要があります - あなたはそれが複数のコア? – Timmy

1

使用SSIS。 3つのExecute SQLタスクをコントロールフローに配置します。各タスクにdeleteステートメントを追加します。パッケージが実行されると、それらはすべて同時に実行されます。

また、各文に対してジョブを作成し、それらをすべて同時に実行するようスケジュールすることもできます。

非同期コールバックも機能しますが、上記の2はdbaスキルセットを実装し管理する方にとって簡単です。

2
List<string> list; 
    list.Add("query1"); 
    list.Add("query2"); 
    list.AsParallel().ForAll(query => ExecuteQuery(query)); 
関連する問題