【问题标题】:Long running Stored procedure without keeping connection opened to Azure database长时间运行的存储过程而不保持与 Azure 数据库的连接
【发布时间】:2017-06-28 14:24:42
【问题描述】:

为了将原始表中的数据加载到 Azure 数据库中的星型模式(事实 - 维度)中,我们运行了很长时间的存储过程来执行 ETL 工作。

此存储过程需要大约 10 到 20 小时运行超过 1000 万行(使用 MERGE 语句)。

目前,我们从 C# 代码 (ADO.NET) 运行存储过程,并保持 CommandTimeout = 0(永远)。但有时会因为与 Azure 数据库的连接不稳定而断开连接。

是否可以在不保持连接一直打开的情况下在数据库级别运行存储过程,然后将存储过程的过程记录在进度表中以跟踪进度?

我看到了一些建议:

  1. 代理作业,在 Azure 数据库上似乎不可能,因为它目前不支持。

  2. 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


【解决方案1】:
【解决方案2】:

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)。考虑对表的 DDL 提出一个单独的问题,包括索引和一些示例数据、MERGE 语句和服务层,我相信这可以更快。

作为测试/快速修复,您始终可以将 MERGE 重构为适当的 INSERT / UPDATE / DELETE - 我敢打赌它会更快。让我们知道。

Azure 数据工厂和 Azure 数据库之间的连接应该是稳定的。如果不是,您可以提出支持票。然而,对于云架构(实际上是任何架构),您需要做出良好的设计决策,以应对出现问题的可能性。这意味着在架构上,您必须针对连接断开或作业失败的可能性进行设计。示例是确保您的工作可以从故障点重新启动,确保错误报告良好等。

此外,根据经验,鉴于您的数据量(我认为数据量较低),这项工作需要的时间太长了。它或设计一定有问题。我强烈建议您尝试解决此问题。

【讨论】:

  • 但是使用数据工厂有何不同?它也只是自动化工具(据我所知),它仍然会像你一样在同一台机器上运行程序,可能会出现相同的连接中断。
  • Azure 数据工厂主要是一个编排工具(具有一定的转换能力),专为长时间运行的工作流而设计 - 因此具有策略和超时属性。我强烈建议您将您的 DDL 包括索引、一些示例数据和 MERGE 声明作为单独的问题发布,有人会帮助您。能否请您提供有关层级要求的其他信息?
  • 我不是 OP,只是好奇的人 :)
  • 代码大了才能贴在这里,数据工厂和Azure数据库的连接稳定吗?如果你有长时间运行的存储过程,我不确定是否可以删除来​​自数据工厂的连接,我认为 VM 上的 Agent Job 是最好的选择
猜你喜欢
  • 1970-01-01
  • 2018-02-07
  • 2013-06-11
  • 2015-01-19
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多