【发布时间】:2012-10-24 11:02:28
【问题描述】:
我可能对正在发生的事情有一点感觉,但我想我会要求得到确认,并可能会寻找替代方案。
作为一个小背景,我编写了一个 C# 应用程序,它为存储过程提供了一个小型前端。该过程包含一些来自其他存储过程的临时表插入(和一个表值 udf),以及一些 xml 处理。
为了了解我在存储过程中的进展情况,我从SqlConnection 订阅了InfoMessage(使用SqlInfoMessageEventHandler)。我已经在整个 SP 的各个地方放置了一些信息丰富的打印语句,因此我可以了解已完成的处理并相应地更新状态栏)。
SP 的粗略结构是这样的:
Print 'Beginning processing'
Create Temp Table
Insert into Temp Table from Table Valued UDF
Print 'Creating working Tables'
Create more Temp Tables
Insert into Temp Tables from SPs (each SP contains a print statement e.g 'Starting SP1').
所有消息都已成功接收并处理,但是在从服务器返回任何消息之前有几秒钟的延迟,然后前几条消息同时到达(好像它们都已处理但输出被保留一会儿回来)。
我天真地假设(我仍然需要了解很多关于 DB 机制的知识)我的初始打印语句将在 SP 中的任何其他处理指令发生之前返回。
我假设服务器正在执行有关获取执行计划和/或可能重新计算计划的操作,或者查询优化器是否在返回任何结果之前进行了一些预处理?
希望我的问题可以从那乱七八糟的文字中得到合理的理解。本质上,查询优化器是否会让服务器在过程实际开始顺序遇到我的打印语句之前执行一些选择/插入?
我还尝试在我的初始打印语句之前进行一些小的临时表操作,因此在缓慢的操作开始之前会返回一些行,但结果大致相同。
感谢您的回复。
【问题讨论】:
-
我认为您可能是对的,我不太清楚解释发生了什么的最佳方式,所以我在搜索时没能找到,谢谢!我以为执行顺序实际上是有问题,而不是缓冲问题。
标签: c# sql sql-server sql-server-2008 sql-execution-plan