2011-10-07 49 views
2

我正在使用CURSOR來做一些逐行操作。有沒有什麼像Parallel CURSOR?

OPEN CURSOR_T 

FETCH NEXT FROM ... 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     ... Block begins 

     ... Block Inserts results into a table 

     ... Block terminates 
END 

我在想,爲什麼不能在平行的行操作來執行,則完全隔離,只插入一些行到另一個表,每一行都有分配自己的ID,因此有衝突沒有明顯的可能性。

我想知道是否有辦法在純SQL中對其進行並行化?

回答

2

這通常是通過一個隊列來實現的:您選擇'待辦事項'並將它們放入隊列中,同時隊列讀取器(處理線程)將'待辦事項'出列並處理它們一個一個。在using tables as queues中有一種精美的藝術,處理通常與activation相關聯,並且入隊/出隊週期實際上是連續的。

+0

+1謝謝。從來沒有聽說過這個概念。我會讀到這個。 – Legend

2

您可以將from語句拆分爲多個部分,並在不同的連接中運行它們。例如,對於首次連接時,過程中的所有行以偶數id

DECLARE cursor_t CURSOR FOR select id from books where id % 2 = 0 

而對於第二個連接,所有行與奇數id

DECLARE cursor_t CURSOR FOR select id from books where id % 2 = 1 

你也可以檢查是否有可能消除光標。如果您可以使用基於集合的操作重寫遊標,則速度會更快,並且SQL Server可以自動並行運行它。

+0

+1謝謝。我會嘗試重寫。如果有這方面的知名技術需要閱讀。至於分裂的FROM語句,我希望有一個自動的方式做到這一點,即聲明10個不同的遊標,然後一次運行它們。你是否知道這樣的事情? – Legend