在SQL里调用“reader.NextResult”会导致长时间延迟

问题:在SQL里调用“reader.NextResult”会导致长时间延迟

我们的应用程序执行一个包含多个结果集的长而复杂的存储过程。用户对此查询的等待时间很长,因此我着手确定导致延迟的原因。

我在执行和读取数据时放了一个秒表,每次需要 6-7 秒。我对存储过程的执行进行了计时,预计这会一直持续下去。不是——它花了 30 毫秒左右。

所以我在大约 20 个结果集的每一个周围放置了计时器。每个“块”花费的时间非常短(< 10ms),除了处理中间的一个,需要 5-6 秒。经过进一步研究,我发现它一直是“reader.NextResult()”调用。这种长时间的延迟每次都发生在同一个地方。

如果我只是执行存储过程,它似乎运行得非常快,所以查询不会出现问题 – 但我不知道……

我如何解释这个?SQL 是否在获得结果集时向我发送了结果集,有问题的结果集是否可能是我的 SQL 查询中的问题区域?还是其他原因可能导致延迟?

我最好奇的是为什么我的延迟发生在“NextResult()”调用上。作为 SQL 开发的新手,我假设在等待“ExecuteReader()”调用返回时,由于长时间执行存储过程而导致的延迟会出现在我的应用程序中。现在似乎 SQL 将在查询完成之前开始返回数据,如果有延迟,它将延迟 NextResult() 调用。

我开始认为我的延迟是在存储过程中。当 ExecuteReader() 调用很快返回时,我认为我的延迟是在我的代码对阅读器的处理中。当延迟最终出现在 NextResult() 调用上时,我很困惑。我现在回到查看存储过程。

解决方案

如果它是 SQL Server 和 .NET,那么根据我的经验:

  1. 检查用于调用存储过程的同一连接上的其他打开事务。他们可能在您的选择之一正在执行的表上具有行锁。您可以尝试将“MultipleActiveResultSets=false”添加到您的 SQL Server 连接字符串中,看看您是否得到了改进,或者更有可能是异常(并且您可以从异常中找出问题)。这也可能是返回到连接池的未重置连接的影响(自从我开始使用MARS以来我就遇到过这种情况)。
  2. 如果脏读是可接受的,您可能需要在 SELECT 查询中指定 NOLOCK(或 READUNCOMMITTED,同样的东西)表提示。

    SELECT * FROM [table] WITH NOLOCK

当您从 .Net 命令执行存储过程时,一旦 SQL 准备好结果,结果就会开始流式传输。

这意味着您可能会在执行整个存储过程之前开始在 .Net 应用程序中看到结果。

您的瓶颈可能在存储过程中,运行 sql server 跟踪,并跟踪存储过程中运行的所有语句(获取持续时间)。您将能够追踪 proc 中缓慢的确切语句,并且您还能够了解传递给 proc 的参数,以便您可以在 Query Analyzer 中对其进行测试并查看计划。

问题中缺少的另一点似乎是您正在移动的数据量,虽然不太可能,但可能是您正在发送一些非常大的数据块(如 blob)并且时间花费在金属丝。您确实需要稍微扩展问题以帮助诊断。

来源:SQL – 调用“reader.NextResult”会导致长时间延迟 | 技术开发问答

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值