Симптоми
Имайте предвид сценария, описан по-долу:
- Имате много голяма таблица Filestream.
- Изпълнявате заявка за изтриване на редове в таблицата Filestream, която създава скъп план за заявки, като например такъв, който е филтриран чрез вътрешно съединение към друга голяма таблица в системата.
- Оптимизаторът на заявките избира план за паралелно изпълнение.
В този случай ще възникне потвърждение и може да получите съобщения за грешка, подобни на следното в регистрационния файл за грешки на SQL Server:
DateTime spid Грешка SpidNumber: 5553, Степен на сериозност: 20, Щат: 6.
DateTime spid SpidNumber SQL Server вътрешна грешка. FILESTREAM Manager не може да продължи с текущата команда.
Състояние
Microsoft потвърждава, че това е проблем в продуктите на Microsoft, които са изброени в раздела „Важи за“.
Решение
Проблемът е решен в следните кумулативни актуализации за SQL Server:
За кумулативните актуализации за 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 (ИЗБОР НА * ОТ #T)
Справки
Научете повече относно терминологията, която Microsoft използва за описване на актуализациите на софтуера.