クエリを並行して実行する簡単な方法はありますか?私は次のようなクエリを持っています:SQL Server 2008 - クエリを並行して実行する
delete from TableA where id = @id
delete from TableB where id = @id
delete from TableC where id = @id
...
と私はそれらを並行して実行したいです。私はまた、C#を使用することもできますが、方法はわかりません。
クエリを並行して実行する簡単な方法はありますか?私は次のようなクエリを持っています:SQL Server 2008 - クエリを並行して実行する
delete from TableA where id = @id
delete from TableB where id = @id
delete from TableC where id = @id
...
と私はそれらを並行して実行したいです。私はまた、C#を使用することもできますが、方法はわかりません。
最初のアイデアは、別のスレッドと別の接続を持っていることですが、私はあなたが非同期コールバックを使用して、単一のスレッドで複数の接続とそれを管理することができると思います。
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();
}
使用SSIS。 3つのExecute SQLタスクをコントロールフローに配置します。各タスクにdeleteステートメントを追加します。パッケージが実行されると、それらはすべて同時に実行されます。
また、各文に対してジョブを作成し、それらをすべて同時に実行するようスケジュールすることもできます。
非同期コールバックも機能しますが、上記の2はdbaスキルセットを実装し管理する方にとって簡単です。
List<string> list;
list.Add("query1");
list.Add("query2");
list.AsParallel().ForAll(query => ExecuteQuery(query));
これらのテーブルの間に外部キーの関係がある場合、それはあなたが思ったほどパフォーマンスが悪いことがあります。 –
ああ、これらのテーブルはすべて、私が最後にやるマスターテーブルを除き、独立しています。 – Timmy
これは本当にperfの問題で、3つのテーブルからIDでいくつかの行を削除する並列処理のコードを複雑にする価値がありますか? – bryanmac