Проблема
Рассмотрим следующий сценарий.
- У вас очень большая таблица Filestream.
- Вы выполняете запрос на удаление строк в таблице Filestream, который создает дорогостоящий план запроса, например тот, который фильтруется по внутреннему соединению с другой большой таблицей в системе.
- Оптимизатор запросов выбирает план параллельного выполнения.
В этом сценарии произойдет утверждение, и в журнале ошибок SQL Server могут появляться сообщения об ошибках, похожие на следующее:
Ошибка DateTimespidNumber : 5553, серьезность: 20, состояние: 6.
Во внутренней ошибке SQL Server dateTimespid SpidNumber. Диспетчер FILESTREAM не может продолжить работу с текущей командой.
Состояние
Корпорация Майкрософт подтвердила, что это проблема продуктов Microsoft, перечисленных в разделе «Относится к».
Решение
Проблема устранена в следующих накопительных обновлениях для SQL Server:
Накопительный пакет обновления 6 для SQL Server 2016 с пакетом обновления 2 (SP2)
Накопительный пакет обновления 14 для SQL Server 2016 с пакетом обновления 1 (SP1)
Накопительный пакет обновления 2 для SQL Server 2014 с пакетом обновления 3 (SP3)
Накопительный пакет обновления 16 для SQL Server 2014 с пакетом обновления 2 (SP2)
Сведения о накопительных обновлениях для SQL Server:
Каждое новое накопительное обновление для SQL Server содержит все исправления и все исправления для системы безопасности, которые были включены в предыдущее накопительное обновление. Ознакомьтесь с последними накопительными обновлениями для SQL Server:
Временное решение
Чтобы обойти эту проблему, можно использовать следующий метод:
Переместите запрос внутреннего соединения в отдельную инструкцию и сохраните результаты во временную таблицу. Затем выполните запрос на удаление, отфильтрованный по записям во временной таблице. Кроме того, можно увеличить порог затрат для параллелизма, чтобы заставить оптимизатор сериализовать план запроса.
Например:
SELECT RefTable.Alias INTO #T FROM DB.dbo.OuterTable INNER JOIN DB.dbo.RefTable ON RefTable.Alias = OuterTable.Alias
WHERE OuterTable.Alias > 30006 AND OuterTable.Alias < 30010
DELETE FROM DB.dbo. [Таблица] WHERE Alias IN (SELECT * FROM #T)
Ссылки
Узнайте о терминологии, используемой корпорацией Майкрософт для описания обновлений программного обеспечения.