2017-06-28 30 views
3

爲了將數據從原始表加載到Azure數據庫中的星型模式(事實 - 維度),我們有很長時間的運行存儲過程來執行ETL工作。長時間運行沒有保持與Azure數據庫連接的存儲過程

此存儲過程需要大約10個小時到20個小時,運行超過1000萬行(使用MERGE語句)。

目前,我們運行存儲過程從C#代碼(ADO.NET)保持CommandTimeout = 0(永遠)。但有時連接會丟失,因爲連接到Azure數據庫不穩定。

是否有可能在數據庫級別上運行存儲過程而無需始終打開連接,然後在進度表中記錄存儲過程的進程以跟蹤進度?

我看到了一些建議:

  1. 代理招聘,似乎在Azure數據庫不可能的,因爲它不會在目前的支持。

  2. SqlCommand.BeginExecuteNonQuery:我不確定100%BeginExecuteNonQuery仍然保持連接是否打開。

有沒有其他方法可以做到這一點?

+0

任何機會,你可以把它分解成更小的處決?一次可能有50,000個。 –

+0

如果您在40M行表上運行MERGE語句,則需要大量時間,並且很難在塊中分解,這很複雜。我想找到這個簡單的解決方案。另外,它取決於你的數據庫有多強大,數據庫在哪一層? –

+1

最有可能你做什麼 - SQL Server將只要檢測到連接已關閉終止您的程序執行(是的,BeginExecuteNonQuery將保持連接打開)。 – Evk

回答

3

Azure的數據廠擁有Stored Procedure task可能做到這一點。它在policy部分有一個timeout屬性,該屬性是可選的。如果你離開它,它默認爲無限:

"policy": { 
      "concurrency": 1, 
      "retry": 3 
      }, 

如果在創建活動時,指定超時爲0,你會看到它消失的時候,你準備在門戶網站中的任務。您也可以嘗試在1天(24小時)指定超時時間,例如"timeout": "1.00:00:00",但我沒有正確測試超時。

你也可以將超時設置爲0的連接字符串中雖然再次我沒有測試過該選項,例如

{ 
    "name": "AzureSqlLinkedService", 
    "properties": { 
    "type": "AzureSqlDatabase", 
    "typeProperties": { 
     "connectionString": "Server=tcp:<servername>.database.windows.net,1433;Database=<databasename>;User ID=<username>@<servername>;Password=<password>;Trusted_Connection=False;Encrypt=True;Connection Timeout=0" 
    } 
    } 
} 

我會認爲這是比Azure的自動化更簡單,但這是一個個人的選擇。也許試試這兩個選項,看看哪個最適合你。

我同意一些其他意見正在對該MERGE時間太長了記錄該卷。我懷疑你的表沒有合適的索引來支持MERGE,或者你的服務層運行得太低。你在哪個服務層上運行,例如Basic,Standard,Premium(P1-P15)。考慮用包含索引和一些示例數據,MERGE語句和服務層的表的DDL提出一個單獨的問題,我相信這可以加快速度。

作爲測試/快速修復,您可以隨時將MERGE重構爲適當的INSERT/UPDATE/DELETE - 我敢打賭它會更快。讓我們知道。

Azure的數據工廠和天青之間的連接數據庫應該是穩定的。如果不是,你可以籌集支持票。然而,對於雲架構(及任何真正的架構),你需要做良好的設計決策允許的事情出錯的可能性。這意味着在架構上,您必須設計連接丟失的可能性,或者失敗的工作。例子是確保你的工作可以從故障點重新啓動,確保錯誤報告是好的,等等。

另外,從經驗來看,考慮到你的數據量(我認爲這很低)長。它必須有一個問題或設計。我強烈建議您嘗試解決此問題。

+0

但是,如何使用Data Factory不同?它也僅僅是自動化工具(據我所知),它仍然會在同一臺機器上運行程序,並具有相同的可能連接中斷。 – Evk

+0

Azure Data Factory主要是一個爲長時間運行的工作流而設計的編排工具(具有一定的轉換能力) - 因此是策略和超時屬性。我強烈建議你把你的DDL包括索引,一些樣本數據和'MERGE'聲明作爲一個單獨的問題發佈,有人會幫助你。你還可以提供其他請求層的信息嗎? – wBob

+0

我不是OP,只是好奇的人:) – Evk

相關問題