SQL Server: задержка перед выводом (оператором печати)

У меня может быть небольшое чувство относительно того, что происходит, но я подумал, что попрошу получить подтверждение и, возможно, взгляну на альтернативу.

В качестве небольшого фона я написал приложение на C#, которое предоставляет небольшой интерфейс для хранимой процедуры. Процедура содержит несколько вставок временных таблиц из других хранимых процедур (и одну таблицу с именем udf) и некоторую обработку XML.

Чтобы понять, как далеко я продвинулся в хранимой процедуре, я подписываюсь на InfoMessage (используя SqlInfoMessageEventHandler) из SqlConnection, Я поместил некоторые информативные операторы печати в разных местах 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').

Все сообщения принимаются и обрабатываются успешно, но перед возвратом каких-либо сообщений с сервера происходит задержка в несколько секунд, затем первые несколько приходят сразу (как если бы они были обработаны, но вывод был задержан на некоторое время). в то время как).

Я наивно предполагал (мне еще многое предстоит узнать о механике БД), что мой первоначальный оператор печати будет возвращен до того, как будут выполнены любые другие инструкции по обработке в SP.

Я предполагаю, что сервер что-то делает для извлечения планов выполнения и / или потенциально пересчета планов, или это тот случай, когда оптимизатор запросов выполняет некоторую предварительную обработку, прежде чем будут возвращены какие-либо результаты?

Надеюсь, мой вопрос достаточно понятен из этого беспорядка текста. По сути, оптимизатор запросов заставит сервер выполнить некоторые операции выбора / вставки до того, как процедура фактически начнет последовательно встречаться с моими операторами печати?

Я также попытался выполнить некоторые небольшие манипуляции с временной таблицей перед моим начальным оператором печати, чтобы некоторые строки возвращались до начала медленных операций, но результат был почти таким же.

Спасибо за любые ответы.

2 ответа

Решение

Я могу судить по MSSM, когда вы используете операторы PRINT, они запаздывают, потому что вывод происходит, когда буфер заполнен. Если вы хотите вывести сообщение сразу, используйте:

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

Он будет работать как Print, но будет выведен сразу.

Надеюсь это поможет.

Я бы предпочел использовать оператор 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').
Другие вопросы по тегам