2011-11-10 192 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

它真的是一個性能問題,值得並行處理的代碼複雜化從三個表中刪除一些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小馬 - 你不認爲它會利用多核? – Timmy

1

使用SSIS。 Put 3在控制流上執行sql任務。爲每個任務添加一條刪除語句。當程序包執行時,它們都將同時執行。

您也可以爲每個語句創建一個作業,並安排它們全部同時運行。

異步回調也可以工作,但上述2對於具有dba技能組的人來說更容易實現和管理。

2
List<string> list; 
    list.Add("query1"); 
    list.Add("query2"); 
    list.AsParallel().ForAll(query => ExecuteQuery(query));