【发布时间】:2017-06-28 14:24:42
【问题描述】:
为了将原始表中的数据加载到 Azure 数据库中的星型模式(事实 - 维度)中,我们运行了很长时间的存储过程来执行 ETL 工作。
此存储过程需要大约 10 到 20 小时运行超过 1000 万行(使用 MERGE 语句)。
目前,我们从 C# 代码 (ADO.NET) 运行存储过程,并保持 CommandTimeout = 0(永远)。但有时会因为与 Azure 数据库的连接不稳定而断开连接。
是否可以在不保持连接一直打开的情况下在数据库级别运行存储过程,然后将存储过程的过程记录在进度表中以跟踪进度?
我看到了一些建议:
代理作业,在 Azure 数据库上似乎不可能,因为它目前不支持。
SqlCommand.BeginExecuteNonQuery:我不确定 100%BeginExecuteNonQuery是否仍然在引擎盖下保持连接打开。
还有其他方法吗?
【问题讨论】:
-
你有没有机会把它分解成更小的处决?一次可能有 50,000 个。
-
如果你在40M行的表上运行MERGE语句,需要很多时间,而且很难分块,复杂。我想为此找到简单的解决方案。另外,这取决于你的数据库有多强大,你的数据库在哪一层?
-
很可能无论您做什么 - sql server 都会在检测到连接已关闭时终止您的过程执行(是的,BeginExecuteNonQuery 将保持连接打开)。
-
@Evk:谢谢,在这种情况下你有什么建议? SSIS 能解决这个问题吗?
-
除了让它运行得更快之外,我真的没有想到任何东西 :) 我处理过许多表中包含数亿行的数据库,但从未听说过运行 10-20 小时的程序。鉴于 azure 数据库的云性质,在与目标数据库的稳定连接的服务器上运行它似乎也是不可能的。下面提到的那些运行手册似乎只是自动化工具,所以可能也无济于事。真正的 sql 代理至少在同一台机器上运行,并且不会有“连接”到服务器的问题。
标签: c# sql sql-server stored-procedures azure-sql-database