1

我可能对正在发生的事情有一点感觉,但我想我会要求得到确认,并可能会寻找替代方案。

作为背景,我编写了一个 C# 应用程序,它为存储过程提供了一个小型前端。该过程包含许多来自其他存储过程的临时表插入(和一个表值 udf),以及一些 xml 处理。

为了了解我在存储过程中的进展情况,InfoMessageSqlInfoMessageEventHandlerSqlConnection. 我已经在整个 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 中的任何其他处理指令发生之前返回。

我假设服务器正在做一些关于获取执行计划和/或可能重新计算计划的事情,或者查询优化器是否在返回任何结果之前进行了一些预处理?

希望我的问题可以从那乱七八糟的文字中合理地理解。本质上,查询优化器是否会让服务器在过程实际开始顺序遇到我的打印语句之前执行一些选择/插入?

我还尝试在我的初始打印语句之前进行一些小型临时表操作,因此在缓慢的操作开始之前会返回一些行,但结果大致相同。

感谢您的任何回复。

4

2 回答 2

2

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

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

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

希望这可以帮助。

于 2012-10-24T11:06:44.500 回答
0

我宁愿使用 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').
于 2012-10-24T11:27:24.137 回答