[英]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.