Корпорация Майкрософт распространяет исправления Microsoft SQL Server 2012 в одном загружаемом файле. Так как исправления являются накопительными, каждый новый выпуск содержит все исправления и все обновления для системы безопасности, которые были включены в предыдущий выпуск обновления SQL Server 2012 года.
Проблемы
Рассмотрим следующий сценарий.
-
Вы создаете хранимую процедуру, которая использует параметр с табличным значением (TVP) в Microsoft SQL Server 2012.
-
Для записи событий RPC:Starting и RPC:Completed используется SQL Profiler или SQL Server Расширенные события.
-
Вы выполняете запрос, использующий TVP.
-
Время ожидания запроса истекает.
В этом сценарии возникает ошибка планировщика, и запросы, выполняемые в том же планировщике, выполняются медленно. Кроме того, в папке журнала SQL Server создается файл мини-дампа.При возникновении этой проблемы появляется сообщение об ошибке, примерно следующее:
System.Data.SqlClient.SqlException (0x80131904): истекло время ожидания. Время ожидания, прошедшее до завершения операции, или сервер не отвечает.в System.Data.SqlClient.SqlInternalConnection.OnError(Исключение SqlException, Boolean breakConnection)at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()в System.Data.SqlClient.TdsErStateObject.ReadSniError(TdserStateObject stateObjectObjj, Ошибка UInt32)at System.Data.SqlClient.TdserStateObject.ReadSni(DbAsyncResult asyncResult, TdserStateObject stateObject)at System.Data.SqlClient.TdserParserStateObject.ReadNetworkPacket()в System.Data.SqlClient.TdsParserStateObject.ReadByte()at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)в System.Data.SqlClient.SqlCommand.ExecuteNonQuery()at TVPApp.Program.Main(String[] args)
Ошибка планировщика не возвращается вместе с сообщением об ошибке, похожем на следующее, регистрируется в журнале ошибок SQL Server:
<Сервер даты><времени> с помощью dbghelp.dll версии "4.0.5"<Сервер даты><времени> **Не удается получить контекст потока для spid #<Date><Time> Server * *******************************************************************************><2 ******************************************************************************* Сервер> даты><даты><6><* сервер> даты><времени * BEGIN STACK DUMP:><0 сервер даты><времени> *> <даты><времени> spid #><8 Date><Time> Server *><2 Сервер даты><времени> * Сервер даты><6 даты><времени> сервер< даты><времени> сервер *******************************************************************************<дата><время> серверный стек для дампа 0x000000000000002C<Date><Time> server External Dump process 0x20000001.Процесс внешнего дампа не вернул ошибок.<рабочая><время> серверного процесса 0:0:0 (0x1670) 0x0000000004EDE160 в планировщике 5 не дает результатов. Время создания потока: 13014210386757. Использование ЦП приблизительного потока: ядро 0 мс, пользователь 70106 мс. Использование процесса 16%. Простой системы 77%. Интервал: 70140 мс.<рабочая><время> серверного процесса 0:0:0 (0x1670) 0x0000000004EDE160 в планировщике 5 не дает результатов. Время создания потока:
Причина
Эта проблема возникает из-за ошибки в ядре СУБД SQL Server 2012. Текстовые столбцы в TVP реализуются в виде строк вставки или буферов, а увеличение числа строк увеличивает количество буферов. Однако процесс высвобождения буферов занимает много времени. Таким образом, при выполнении операций выпуска и сжатия создается ошибка планировщика, не возвращающая результатов. Примечание. Аналогичная проблема устранена в следующей статье базы знаний Майкрософт. Однако пакет накопительных обновлений, описанный в статье, не предназначен для проблемы с временем ожидания запроса.
2520808 ИСПРАВЛЕНИЕ. Ошибка планировщика при выполнении запроса, использующего TVP в SQL Server 2008 или в SQL Server 2008 R2, если используется SQL Profiler или SQL Server расширенные события
Решение
Сведения о накопительном пакете обновления
Накопительный пакет обновления 5 для SQL Server 2012 с пакетом обновления 1 (SP1)
Исправление этой проблемы было впервые выпущено в накопительном обновлении 5. Дополнительные сведения о том, как получить этот накопительный пакет обновления для SQL Server 2012 г., щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:
2861107 Накопительный пакет обновления 5 для SQL Server 2012Примечаемые сборки являются накопительными, каждый новый выпуск исправления содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправления SQL Server 2012 года. Рекомендуется применить последний выпуск исправления, содержащий это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:
2772858 Сборки SQL Server 2012 года, выпущенные после выпуска SQL Server 2012 с пакетом обновления 1 (SP1)
Обходное решение
Чтобы обойти эту проблему, воспользуйтесь одним из описанных ниже методов.
-
Не используйте SQL Profiler или SQL Server расширенные события.
-
Щелкните, чтобы очистить поля RPC:Starting и RPC:Completed проверка в определении трассировки.
Статус
Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе "Применяется к".