KB4488809 - FIX: L'asserzione si verifica quando una query parallela viene eliminata da una tabella Filestream in SQL Server 2014, 2016 e 2017

Si applica a
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)

Sintomi

Si consideri lo scenario seguente:

  • Si dispone di una tabella Filestream molto grande.
  • Si esegue una query di eliminazione di righe nella tabella Filestream che crea un piano di query costoso, ad esempio uno filtrato da un inner join in un'altra tabella di grandi dimensioni nel sistema.
  • Query Optimizer sceglie un piano di esecuzione parallela.

In questo scenario verrà eseguita un'asserzione ed è possibile che vengano visualizzati messaggi di errore simili ai seguenti nel log degli errori di SQL Server:

Errore SpidNumber SpidDateTime: 5553, Gravità: 20, Stato: 6.

DateTimespid SpidNumber SQL Server errore interno. Gestione FILESTREAM non può continuare con il comando corrente.
      

Stato

Microsoft ha confermato che si tratta di un problema relativo ai prodotti elencati nella sezione "Si applica a".

Risoluzione

Il problema è stato risolto negli aggiornamenti cumulativi seguenti per SQL Server:

Informazioni sugli aggiornamenti cumulativi per SQL Server:

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli aggiornamenti rapidi e tutte le correzioni per la sicurezza inclusi nell'aggiornamento cumulativo precedente. Scopri gli aggiornamenti cumulativi più recenti per SQL Server:

Soluzione alternativa

Per risolvere il problema, è possibile usare il metodo seguente:

Spostare la query inner join in un'istruzione separata e salvare i risultati in una tabella temporanea. Quindi eseguire la query di eliminazione filtrata in base alle voci della tabella temporanea. Inoltre, è possibile aumentare la soglia dei costi per il parallelismo per forzare l'utilità di ottimizzazione a serializzare il piano di query.

Ad esempio:

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. [Tabella] WHERE Alias IN (SELECT * FROM #T)

Riferimenti

Informazioni sulla terminologia utilizzata da Microsoft per descrivere gli aggiornamenti software.