【问题标题】:"Fire and forget" T-SQL query in SSMSSSMS 中的“一劳永逸”T-SQL 查询
【发布时间】:2018-07-19 23:18:18
【问题描述】:

我有一个 Azure SQL 数据库,有时我想在其中执行临时 SQL 语句,这可能需要很长时间才能完成。例如创建索引、从大表中删除记录或在表之间复制数据。由于涉及的数据量很大,这些操作可能需要 5 分钟到几个小时不等。

我注意到如果在 SSMS 中执行一条 SQL 语句,那么整个事务将自动回滚,以防 SSMS 在执行完成之前失去与服务器的连接。这对于长时间运行的查询是有问题的,例如在本地 wifi 连接问题的情况下,或者如果我只是想关闭我的计算机以离开办公室。

有没有什么方法可以指示 SQL Server 或 SSMS 在不需要打开连接的情况下执行 SQL 语句?我们不能使用 SQL Server 代理作业,因为这是一个 Azure SQL DB,我们希望尽可能避免基于其他 Azure 服务的解决方案,因为这只是为了满足简单的 Ad-hoc 需求。

我们尝试了 SSMS 中的“执行后丢弃结果”选项,但这仍然保持打开的连接,直到语句完成执行:

这不是我正在寻找的异步解决方案,因为我并不真正关心执行结果(我总是可以检查查询是否仍在运行,例如使用 sys.dm_exec_requests)。换句话说,就是一种简单的 T-SQL 查询“即发即弃”机制。

【问题讨论】:

  • “一劳永逸”的问题是你假设成功。你真的想开枪然后忘记,4 小时后发现它没有完成你想要的,但你没有错误消息要检查?
  • 谈论fire-and-forget没有任何意义。当 any 连接关闭时,事务会回滚。服务器不关心该查询来自何处。如果您希望查询在后台运行,请将其安排为作为作业运行,或作为 SSIS 包的一部分运行。这也有其他机制
  • @Damien_The_Unbeliever - 好点。请记住,这是一个 Azure SQL 数据库,您认为“从其他地方”运行查询以支持我所描述的临时场景的最简单方法是什么?
  • 您必须找到一台连接稳定的机器。没有办法解决这个问题,因为 SQL Server 不会在对方不在的地方保持打开的连接。理想情况下,您会在机器本身上执行此操作(如在计划作业中),但这不是 Azure SQL DB 的选项,因此您可以获得的最接近的是 Azure VM。要么在这样的远程机器上使用 RDP 完成所有工作,要么投资一些 Cat 5 电缆。
  • 如果你打算使用 Azure VM(我以为你不需要额外的组件?)那么你可能想节省一些成本,而是使用Azure Automation 来启动预定的 SQL

标签: sql-server tsql azure-sql-database ssms


【解决方案1】:

如果您可以将即席查询放在存储过程中,那么您可以 schedule 在服务器上运行,前提是您拥有必要的权限。

请注意,这可能不是一个好主意,但应该可以。

【讨论】:

  • 投反对票,因为我的方案特别不允许我使用 SQL Server 代理作业(它是 Azure SQL 数据库 - 没有可用的 SQL Server 代理)。
【解决方案2】:

很遗憾,如果没有 SSMS 中的开放连接,我认为您将无法完成查询。

我可以建议以下方法:

  1. 将查询传递到 azure 函数/AWS Lambda 以代表您执行(也许,通过休息将其公开为服务)并让它存储或将结果发送到可访问的地方。
  2. 在云中启动 VM 并通过 RDP 从 VM 运行查询。准备就绪后,您可以重新建立与 VM 的 RDP 连接,您将能够查看查询结果。
  3. 使用 Azure 自动化 Runbook 在计划的触发器上执行查询。

【讨论】:

  • 选项 1 不适用于运行时间超过约 10 分钟的任何查询,因为 Azure 函数在此之前会超时。我不了解 AWS Lambda,但我认为它们具有相同的限制,毕竟它们是无服务器架构。我试图避免在查询期间运行 VM 的成本,这排除了选项 2。自动化运行手册(选项 3)有一个“合理使用”限制,AFAIK,大约 3 小时,所以对于查询运行比这更长,我将面临与选项 1 相同的问题。
【解决方案3】:

虽然我最初的要求表明我们不想使用其他 Azure 服务,但我发现使用 Azure 数据工厂似乎是解决问题的最经济、最简单的方法。此处提出的其他解决方案似乎受到高成本(启动 VM)或超时限制(Azure Functions、Azure 自动化运行手册)的影响,当用于此目的时,这些都不适用于 ADF。

这个想法是:

  1. 将长时间运行的 SQL 语句放入存储过程中
  2. 创建具有存储过程活动的数据工厂管道以在数据库上执行 SP。确保将活动的超时和重试值设置为合理值。
  3. 触发管道

由于数据工厂中没有发生数据移动,因此此解决方案非常便宜,而且我使用此方法运行了 10 多个小时的查询,效果很好。

【讨论】:

    猜你喜欢
    • 2016-07-20
    • 2017-06-16
    • 1970-01-01
    • 2016-11-11
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多