KB4488809 - REMEDIERE: Afirmația apare atunci când o interogare paralelă se șterge dintr-un tabel Filestream în SQL Server 2014, 2016 și 2017

Se aplică la
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)

Simptome

Luați în considerare următorul scenariu:

  • Aveți un tabel Filestream foarte mare.
  • Executați o interogare de ștergere a rândurilor din tabelul Filestream care creează un plan de interogare costisitor, cum ar fi unul care este filtrat de o asociere internă la un alt tabel mare din sistem.
  • Instrumentul de optimizare a interogărilor alege un plan de executare în paralel.

În acest scenariu, va apărea o aserțiune și este posibil să primiți mesaje de eroare care seamănă cu următoarele, în jurnalul de erori SQL Server:

DateTime spid SpidNumber Eroare: 5553, Severitate: 20, Stare: 6.

DateTime spid SpidNumber Eroare internă SQL Server. Managerul FILESTREAM nu poate continua cu comanda curentă.
      

Stare

Microsoft a confirmat că aceasta este o problemă în produsele Microsoft care sunt listate în secțiunea „Se aplică la”.

Rezolvare

Problema este remediată în următoarele actualizări cumulative pentru SQL Server:

Despre actualizările cumulative pentru SQL Server:

Fiecare actualizare cumulativă nouă pentru SQL Server conține toate remedierile rapide și toate remedierile de securitate care au fost incluse cu actualizarea cumulativă anterioară. Consultați cele mai recente actualizări cumulative pentru SQL Server:

Soluție

Pentru a evita această problemă, puteți utiliza următoarea metodă:

Mutați interogarea de asociere internă într-o instrucțiune separată și salvați rezultatele într-un tabel temporar. Apoi rulați interogarea de ștergere filtrată după intrările din tabelul temporar. În plus, puteți mări pragul de cost pentru paralelism pentru a forța optimizatorul să serializeze planul de interogare.

De exemplu:

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

ȘTERGERE DIN DB.dbo. [Tabel] WHERE Alias in (selectați * din #T)

Referințe

Aflați despre terminologia pe care o utilizează Microsoft pentru a descrie actualizările de software.