Objawy
Rozważmy następujący scenariusz:
- Masz bardzo dużą tabelę Filestream.
- Uruchamiasz zapytanie usuwające wiersze w tabeli Filestream, co tworzy kosztowny plan zapytania, na przykład filtrowany przez sprzężenie wewnętrzne z inną dużą tabelą w systemie.
- Optymalizator zapytań wybiera plan wykonywania równoległego.
W tym scenariuszu wystąpi potwierdzenie i mogą zostać wyświetlone komunikaty o błędach dziennika SQL Server podobne do poniższych:
DateTime spid SpidNumber Error: 5553, Dotkliwość: 20, Stan: 6.
DateTime spid SpidNumber Błąd wewnętrzny programu SQL Server. Menedżer FILESTREAM nie może kontynuować bieżącego polecenia.
Stan
Firma Microsoft potwierdziła, że jest to problem dotyczący produktów firmy Microsoft wymienionych w sekcji „Dotyczy”.
Rozwiązanie
Ten problem został rozwiązany w następujących aktualizacjach zbiorczych dla programu SQL Server:
Aktualizacja zbiorcza 6 dla programu SQL Server 2016 z dodatkiem SP2
Aktualizacja zbiorcza 14 dla programu SQL Server 2016 z dodatkiem SP1
Aktualizacja zbiorcza 2 dla programu SQL Server 2014 z dodatkiem SP3
Aktualizacja skumulowana 16 dla programu SQL Server 2014 z dodatkiem SP2
Informacje o aktualizacjach zbiorczych programu SQL Server:
Każda nowa aktualizacja zbiorcza programu SQL Server zawiera wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji skumulowanej. Sprawdź najnowsze aktualizacje zbiorcze dla programu SQL Server:
Najnowsza aktualizacja zbiorcza dla programu SQL Server 2017
Najnowsza aktualizacja zbiorcza dla programu SQL Server 2016
Najnowsza aktualizacja zbiorcza dla programu SQL Server 2014
Obejście
Ten problem można obejść, korzystając z następującej metody:
Przenieś zapytanie sprzężenia wewnętrznego do oddzielnej instrukcji i zapisz wyniki w tabeli tymczasowej. Następnie uruchom zapytanie usuwające, które jest filtrowane według wpisów w tabeli tymczasowej. Ponadto można zwiększyć próg kosztów równoległości, aby wymusić serializację planu zapytania przez optymalizator.
Na przykład:
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
USUŃ Z BAZY DANYCH DB.dbo. [Tabela] WHERE Alias IN (SELECT * FROM #T)
Źródła informacji
Dowiedz się więcej o terminologii używanej przez firmę Microsoft do opisywania aktualizacji oprogramowania.