我们的应用程序使用多个结果集执行一个冗长的多毛存储过程。用户正在经历此查询的漫长等待时间,因此我开始确定导致延迟的原因。
我在执行和读取数据时放了秒表,每次需要6-7秒。我定时执行存储过程,期望这将花费所有时间。它不是 - 它需要30ms左右。
所以我在约20个结果集中放置了定时器。每个“块”花费很少的时间(<10ms),除了处理过程中的一个,花费5-6秒。经过进一步的研究,我发现这是“reader.NextResult()”调用,一直都是这样。这种长时间的延迟每次发生在同一个地方。
如果我只是执行存储过程,它似乎运行真正的snappy,所以它不会出现查询问题 - 但我不知道......
我该如何解释? SQL是否将结果集运送给我,并且结果集是否可能是我的SQL查询中的问题区域?或者是其他可能导致延迟的事情?
编辑:
感谢您的回答和评论 - 我使用的是SQL Server和.NET
我最感兴趣的是为什么我的延迟发生在“NextResult()”调用上。作为SQL开发的新手,我假设在等待“ExecuteReader()”调用返回时,由于存储过程执行时间长而导致的延迟会出现在我的应用程序中。现在看来,SQL将在查询完成之前开始返回数据,如果有延迟,它将延迟NextResult()调用。
我开始认为我的延迟是在存储过程中。当ExecuteReader()调用快速返回时,我认为我的延迟是在我的代码处理读者时。当延迟结束于NextResult()调用时,我很困惑。我现在回来检查存储过程。
感谢那些花时间审查我的问题并提供帮助的人。
答案 0 :(得分:2)
当您从.Net命令执行存储过程时,结果将在SQL准备就绪后立即开始流式传输。
这意味着您可能会在执行整个存储过程之前在.Net应用中看到结果。
您的瓶颈可能在存储过程中,运行sql server跟踪,并跟踪存储过程中运行的所有语句(获取持续时间)。您将能够在proc中找到缓慢的确切语句,并且您还可以获取传递给proc的params,这样您就可以在查询分析器中对此进行测试并查看计划。 / p>
问题中缺少的另一点似乎是您正在移动的数据量,虽然不太可能,但可能是您正在发送一些非常大的数据块(如blob)并且时间正在花在电线上。你真的需要稍微扩展一下这个问题以帮助诊断。
答案 1 :(得分:1)
答案将取决于您正在使用的RDBMS。
如果它的SQL Server和.NET那么根据我的经验:
如果dirty reads are acceptible,您可能需要在SELECT查询中指定NOLOCK(或READUNCOMMITTED,同一事物)表提示。
SELECT * FROM [table] WITH NOLOCK