2013-10-15 97 views
5

根據附件,我們有一個平衡數據分銷商在一個數據轉換中設置了大約200萬行。腳本任務是相同的 - 每個人都打開一個到oracle的連接並首先執行刪除操作,然後執行插入操作。 (這是不相關的,但它這樣做的方式,由於與OLE DB命令和Microsoft OLE DB提供程序用於Oracle參數問題...)SSIS平衡數據分配器 - 增加操作的數量?

enter image description here

我遇到的問題是沒有無論我做多少緩衝區或配置了多少併發執行,BDD一次不會執行多於5個併發進程。

我已經在一個更大的緩衝區中拉回了數十萬行,並且它只是分成5種方式。我已經在多臺機器上嘗試了這一點 - 當前鏡頭來自16核心服務器,在軟件包上配置了-1個併發執行 - 無論如何,它總是5個並行作業。

5比1更好,但是有250萬行插入/更新,在5次併發執行時每秒15行並不比每秒2-3行更好,併發執行1次。

我可以強制BDD使用更多路徑,如果是這樣的話?

+0

還沒有一個有效的BDD使用情況,但你將能夠改變你的模式是一條直線惰性成在Oracle臨時表,然後你通過執行SQL任務完成數據流完成後執行刪除和插入操作? – billinkc

+0

這是問題的關鍵,但原始模式是完全刪除和重新填充。運行單線程時,插入部分(無刪除)需要4天。 SSIS中的Oracle連接使用情況非常緩慢。僅供參考,此特定流程現在更加智能化,大部分時間更新只有幾百行。這個問題關注於BDD,因爲我們將來會在這些類型的進程中使用更多類型的進程,並且我們需要更好的性能調優。 –

+1

這看起來像一個我不知道的有趣的部分,所以我只看了Debarchan Sarkar的一段介紹視頻。他提到「最多可以有5次流動,效果最好」,但沒有透露任何有關它的限制。 http://technet.microsoft.com/en-us/sqlserver/hh369962.aspx – Metaphor

回答

4

簡短回答:

是的BDD可以利用五條以上的路徑。你不應該做任何特殊的事情來強制它,根據定義它應該自動爲你做。那爲什麼不使用超過5條路徑?因爲您的數據源正在生成數據的速度比您的目標可能消耗造成的背壓更快。要解決它,你必須調整你的目標組件。

龍答:

理論上「的BDD需要輸入數據,並將其路由相等比例到它的輸出,但是很多也有。」在你的設置中,有10個輸出。所以輸入數據應該同時分配到所有10個輸出,並且您應該看到10個路徑同時執行 - 這在理論上也是如此。

但BDD的另一個概念是「而不是路由單個行,BDD操作數據上的緩衝區」。這意味着數據流引擎啓動一個緩衝區,用盡可能多的行填充緩衝區,並將緩衝區移動到下一個組件(腳本目標位置)。正如你所看到的,每個緩衝區都有相同數量的行。如果啓動了其他緩衝區,則會看到更多路徑被使用。由於稱爲背壓的機制,SSIS不能使用額外的緩衝區和最終的附加路徑;當源產生的數據比目的地消耗的速度快時,會發生這種情況。如果發生這種情況,所有內存都將被源數據用完,SSIS將沒有任何內存用於轉換和目標組件。所以爲了避免它,SSIS限制了活動緩衝區的數量。它設置爲5(無法更改),這正是您所看到的線程數。

PS:引號內的文字是從this article

+0

我不得不消化這一點,但我認爲你已經擊中了它。 –

1

SSIS數據流任務中有一個名爲EngineThreads的屬性,它確定可同時運行多少個流,默認值爲5(在SSIS 2012中,默認值爲10,所以我假設您正在使用SSIS 2008或更早版本)。最佳值取決於您的環境,因此可能需要進行一些測試以確定要放置哪些內容。

這裏有一個Jamie Thomson article一點點細節。

+0

這是一個好主意。可悲的是,我的數據流任務上的EngineThreads默認爲10。但是我會和它一起玩,看看它是否有所作爲。 –

0

我通過this article on CodeProject發現了另一個有趣的事情。

[T]他的組件使用的9947行的內部緩衝器(按照 實驗中,我發現如此),它是預先設置的。這是無法覆蓋 。作爲一個證明,我們將在輸入文件中只使用9,947(九個 9407)行,而不是10個行,並將觀察 的行爲。運行包後,我們會發現所有的行都被傳輸到第一個輸出組件,而其他的 組件沒有收到任何東西。

現在讓我們將我們的輸入文件中的行數從9,947增加到 9,948(九千九百四十八個)。在運行包之後,我們發現 第一個輸出組件收到9,947行,而 第二個輸出組件收到1行。

因此,我注意到在您的第一次緩衝區運行中,您拉出了50,000條記錄。那些被分成9,984個記錄桶並傳遞給每個輸出。所以本質上,BDD從緩衝區中獲取記錄,並以〜10,000記錄增量傳遞給每個輸出。所以在這種情況下,您的來源可能是瓶頸。

也許你需要將你原來的源查詢分成兩半,並創建兩個BDD驅動的數據流,實質上是你的並行吞吐量的兩倍。

+2

我玩過緩衝區。其實這篇文章是錯誤的 - 你可以重寫它。行數取決於數據流任務DefaultBufferSize和除以rowsize。然後將結果集除以5.如果我增加緩衝區大小,則行集大小增加,除以五個限制也會增加,所以如果我將緩衝區加倍,則它將拉動大約100k行,然後每條路徑獲得20k行。 –