【问题标题】:SQL Server - Asynchronous Query ExecutionSQL Server - 异步查询执行
【发布时间】:2011-12-12 18:01:53
【问题描述】:

在 Sql Server 2008 中,我有一个存储过程,它将结果写入输出参数并将参数插入表中。我想让SP的“插入表”部分异步运行,这样就可以从输出参数中读取结果,而无需等待插入命令完成。

我该怎么做?

例如。

CREATE PROCEDURE dbo.Sample_sp
    @RESULT INT OUTPUT
    @PARAM_1 INT,
    @PARAM_2 INT,
    @PARAM_N FLOAT
AS

-- Perform Calculations like @RES = @PARAM_1 + @PARAM_2......
INSERT INTO DBO.A VALUES(@PARAM_1, @PARAM_2, ..... @PARAM_N)

 

EXECUTE ASYNC dbo.Sample_sp

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    这是可能的(参见Asynchronous procedure execution),但结果很可能不是您想要的。首先也是最重要的异步意味着打破过程调用者假定的事务上下文(插入发生在 不同 事务中)。此外,执行可靠的异步(如我的链接文章中所示)意味着执行更多的写入,因此没有性能优势。

    为什么要从异步开始?插入的成本在响应延迟中通常不明显,除非它在锁上阻塞。如果您有锁定争用,请解决那个问题。

    【讨论】:

    • 异步的原因是去做一些与用户执行的原子操作无关的单独操作。例如,您在堆栈溢出时添加了一个答案,我们想要启动存储过程来重新计算您的声誉、您的帖子历史记录、您的回答历史记录、您的活动历史记录、最近的活动列表。这些事情需要一段时间;但是您没有理由需要等待 1-3 分钟来执行所有这些计算。丑陋的解决方法是让代理任务每 1 秒运行一次,计划任务每​​ 1 秒运行一次,或者安装服务代理
    【解决方案2】:

    您无法在标准 SQL 中执行此操作:它是同步的。在存储过程完成之前,您也无法处理输出参数。

    您必须使用 service broker 来解耦计算和插入(编辑:根据 Remus 的示例回答)

    当然请注意,您现在需要更复杂的错误处理来处理任何错误和回滚,因为您的 INSERT 将被解耦并且您不会立即获得任何错误的反馈。

    当然,为什么不先在客户端进行计算呢?又名你真正想要解决的问题是什么......

    【讨论】:

    • 为什么不先在客户端进行计算?根据你的变化重新计算系统中所有内容的触发器耗时太长;用户没有理由等待它。其他系统使用服务代理、计划任务或代理作业。但是如果直接在 SQL Server 中完成就好了。而不是调用EXECUTE UpdateFincenCacheValues的触发器,它可以调用EXECUTE ASYNC UpdateFincenCacheValues
    猜你喜欢
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多