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

时间:2008-10-23 17:31:32

标签: sql

我们的应用程序使用多个结果集执行一个冗长的多毛存储过程。用户正在经历此查询的漫长等待时间,因此我开始确定导致延迟的原因。

我在执行和读取数据时放了秒表,每次需要6-7秒。我定时执行存储过程,期望这将花费所有时间。它不是 - 它需要30ms左右。

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

如果我只是执行存储过程,它似乎运行真正的snappy,所以它不会出现查询问题 - 但我不知道......

我该如何解释? SQL是否将结果集运送给我,并且结果集是否可能是我的SQL查询中的问题区域?或者是其他可能导致延迟的事情?

编辑:

感谢您的回答和评论 - 我使用的是SQL Server和.NET

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

我开始认为我的延迟是在存储过程中。当ExecuteReader()调用快速返回时,我认为我的延迟是在我的代码处理读者时。当延迟结束于NextResult()调用时,我很困惑。我现在回来检查存储过程。

感谢那些花时间审查我的问题并提供帮助的人。

2 个答案:

答案 0 :(得分:2)

当您从.Net命令执行存储过程时,结果将在SQL准备就绪后立即开始流式传输。

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

您的瓶颈可能在存储过程中,运行sql server跟踪,并跟踪存储过程中运行的所有语句(获取持续时间)。您将能够在proc中找到缓慢的确切语句,并且您还可以获取传递给proc的params,这样您就可以在查询分析器中对此进行测试并查看计划。 / p>

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

答案 1 :(得分:1)

答案将取决于您正在使用的RDBMS。

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

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

    SELECT * FROM [table] WITH NOLOCK