KB4488809 - 修复:当并行查询从 SQL Server 2014、2016 和 2017 中的 Filestream 表中删除时发生断言

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

症状

请考虑以下情形:

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

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

DateTime 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 和 OuterTable.Alias < 30010

从 DB.dbo 中删除。[表]WHERE 别名 IN (SELECT * FROM #T)

参考资料

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