[英]Resolving deadlock when multiple stored procedures are reading and updating the same table in SQL Server 2014 database
[英]SQL 2014 - SSIS or Stored procedures to copy data from SQL Server to SQL Server with same table structure
我們有一個SSIS項目,用於將數據從CSV加載到SQL Server的登台區域(DB_Stage)。
暫存的主要目的是准備准備移至生產數據庫(DB_Prod)的數據,並在過程中標記數據或文件中的任何錯誤。
通過從DB_Prod獲取創建表腳本來創建DB_Stage,因此兩個數據庫中的表結構是相同的。 一旦成功加載到DB_Stage,則需要將數據移至DB_Prod。
我正在考慮為DB_Stage中的每個表創建一個存儲過程,以將數據推送到DB_Prod,因為不需要進行轉換,並且還認為從SQL到SQL的速度更快。 但是,我讀了一些文章,說SSIS具有並行處理的能力,並且加載速度會快得多。 但是我不完全理解。
我可以創建另一組SSIS包,以立即使用Biml將數據從舞台轉移到產品。 但是我需要一些建議,哪種才是最好的方法。 在我的方案中存儲過程或SSIS包。
如果我使用SSIS包,則一個優點是可以配置目標數據庫,因此可以將Stage數據加載到任何服務器/數據庫中(這是我們的要求)。
如果使用存儲過程,則找不到找到目標數據庫參數的方法。 看來我必須這樣硬編碼...
插入Prod_DB.dbo.Table1(列列表),從DB_Stage.dbo.table1中選擇(列列表)。
任何幫助將不勝感激。
如前所述,在開發環境和生產環境之間沒有任何轉換可使用。 我建議您使用SSIS而不是存儲過程。 SSIS會將其視為同步任務,並將盡快開始傳輸記錄。 SSIS可以利用緩沖管線來控制和實現並行性。
在這種情況下,我建議在使用SSIS時要進行的設置很少:
我很確定您將在這里使用SSIS而不是TSQL看到性能提高。
如前所述,有兩種方法可以將數據從一台服務器復制到另一台服務器。 讓我們一一介紹。
存儲過程:您必須首先使用sp_addlinkedserver在Prod服務器和登台服務器之間創建鏈接服務器連接。 這將允許您使用4部分命名來引用登台服務器中的表,例如[ProdServer]。[ProdDB]。[dbo]。[Table1]。在這里,您可以利用所謂的“ 動態查詢 ”。 在這種特殊的查詢中,我們可以將SQL查詢的某些值指定為varchar變量,然后執行查詢。
您將要編寫的基本上是一個查詢,如下所示:
'INSERT INTO [' + @ProdServer + '].[' + @ProdDB +'].[dbo].[Table1] (col list)
SELECT (col list) FROM [DB_Stage].[dbo].[table1]'
在這里,對於nvarchar字符串,條件為4,000個字符,對於varchar字符串,條件為8,000個字符。
SSIS:
如前所述,SSIS允許您並行化從登台服務器到Prod Server的數據流。 該方法是相當簡單的解釋在這里 。 但是,如果表太大,建議您使用Balanced Data Distributor ,這是對並行數據流的優化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.