【问题标题】:SQL Server : delay before output (a print statement) is producedSQL Server:产生输出(打印语句)之前的延迟
【发布时间】: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


【解决方案1】:

我可以通过 MSSM 判断,当您使用 PRINT 语句时,它们会迟到,因为一旦缓冲区已满,就会发生输出。如果您想立即输出消息,请使用:

RAISERROR('Message',0,0) WITH NOWAIT

它将作为打印工作,但会立即输出。

希望这会有所帮助。

【讨论】:

  • 哇,我不知道为什么我没有想到查看 RAISEERROR,我想是因为 print 正在工作,它刚刚从我身边经过。您发布的内容实际上并没有改变我的行为,但是通过谷歌搜索,我发现了“WITH NOWAIT”子句,这正是我所追求的:RAISERROR('Message',0,0) WITH NOWAIT 让我得到在发生其他任何事情之前发送消息。我不确定是否有任何相关的性能问题。我读到:mssqltips.com/sqlservertip/1660/… 感谢您的提示 =D
【解决方案2】:

我更喜欢使用 SELECT 语句而不是 PRINT -

SELECT 'Beginning processing'

Create Temp Table
Insert into Temp Table from Table Valued UDF

SELECT 'Creating working Tables'

Create more Temp Tables
Insert into Temp Tables from SPs (each SP contains a print statement e.g 'Starting SP1').

【讨论】:

  • 您好,感谢您的回复。在这种情况下,“选择”会将输出发送到结果窗口,当然可以使用它,但我不相信它会触发我用来检测应用程序中消息的 InfoMessage。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2010-11-20
相关资源
最近更新 更多