KB4488809 — POPRAWKA: Asercja występuje, gdy zapytanie równoległe usuwa się z tabeli Filestream w SQL Server 2014, 2016 i 2017

Dotyczy
SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Enterprise Core - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use)

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:

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:

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.