KB4488809 - 修复:在 SQL Server 2014、2016 和 2017 中从文件流表中删除并行查询时发生断言

应用对象
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)

症状

请考虑以下情形:

  • 你有一个非常大的文件流表。
  • 在文件流表中运行行的删除查询会创建昂贵的查询计划,例如,通过内部联接筛选系统中另一个大型表的查询计划。
  • 查询优化器选择并行执行计划。

在这种情况下,将发生断言,并且你可能会在 SQL Server 错误日志中收到类似于以下内容的错误消息:

日期时间 spid SpidNumber 错误:5553,严重性:20,状态:6。

DateTime spid SpidNumber SQL Server 内部错误。 FILESTREAM 管理器无法继续执行当前命令。
      

状态

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 (SELECT * FROM #T)

参考资料

了解 Microsoft 用于描述软件更新的术语。