我有一个存储过程,我希望通过从存储过程中尽早返回数据然后允许它继续处理来加速。
现在基本上我有类似的东西:
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
@someargshere
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
UPDATE lastAccessedTime = GETUTCDATE() WHERE based on someargs;
SELECT some fields WHERE based on someargs;
END
我实际上并不关心last {CcessedTime对于SELECT
语句是什么,但我发现返回行结果集的唯一方法是在最后执行SELECT
,因为所有我发现的文档说RETURN
只接受一个整数表达式。我希望尽早返回结果,以便为应用程序提供尽可能绝对最快的响应时间,以便在服务器执行更新时继续处理。所以我想做一些像
SELECTT.....
RETURN results to app
UPDATE after connection has sent results
这可能还是有更好的方法呢?
答案 0 :(得分:6)
不,不要认为你能做到这一点,因为这是一个顺序处理。此外,即使你能够做到这一点,你最终会读取旧数据而不是实际更新的数据;这也称为DIRTY READ
。
您在第一部分发布的内容是正确的。首先执行UPDATE
,然后执行SELECT
数据并返回应用程序。只有当整个处理结束时,您的过程才会返回,而您所说的不一样(或者同样以多线程编程语言发生)。
虽然您可以根据您的应用程序编程语言(如果它支持多线程)在不同的过程/ adhoc查询中分隔SELECT
和UPDATE
;运行两个线程,其中一个将从表SELECT
运行,另一个将执行UPDATE
(如果C#
则可以使用TPL;特别是async - await
)。虽然在这种情况下你可能需要将TRANSACTION ISOLATION LEVEL
设置为READ UNCOMMITTED
。