应用对象
SQL Server 2008 R2 Standard SQL Server 2008 R2 Datacenter SQL Server 2008 R2 Developer SQL Server 2008 R2 Enterprise SQL Server 2008 R2 Web SQL Server 2008 R2 Workgroup SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2012 Web

Microsoft 在一个可下载文件中分发 Microsoft SQL Server 2008 R2 Service Pack 1 (SP1)或 Microsoft SQL Server 2012 修复程序。 由于修补程序是累积的,因此每个新版本都包含以前的 SQL Server 2008 R2 Service Pack 1 (SP1)或 SQL Server 2012 更新版本附带的所有修补程序和所有安全更新。

症状

请考虑以下方案。 在 Microsoft SQL Server 2008 R2 或 Microsoft SQL Server 2012 中运行查询时,查询优化器将生成包含 Top 运算符的执行计划。 在这种情况下,查询可能需要很长时间才能运行。 例如,你可以运行类似于以下内容的查询:

SELECT TableA.Col1 FROM TableA JOIN TableB ON TableA.Col1 = TableB.Col1 WHERE TableA.Col2 = N'A' AND TableB.Col3 IN (SELECT Col1 FROM TableC )此查询涉及两个联接。 一个联接在 TableB 和 TableC 之间。 (这是 "IN" 谓语的存在暗示的。) 另一个联接位于表 A 和第一个联接的结果之间。 如果查询找到至少一个满足第一个联接谓词的行,则 IN 谓词将返回 true。 因此,查询优化器将在查询执行计划中添加 Top 运算符。这样的查询可能只返回几行。 但是,执行此查询的时间可能比预期更长。 在实际查询执行计划中,估计的行数与实际行数显著不同。 这会影响查询优化器准确估计不同计划选项的成本的能力。如果你显式使用 TOP 运算符或使用以下运算符之一,也可能会发生此问题:

  • 选项(FAST N)

  • 登录

  • 现有

解决方案

累积更新信息

SQL Server 2008 R2 Service Pack 2

此问题的修补程序首次在 SQL Server 2008 R2 Service Pack 2 的累积更新1中发布。有关如何获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2720425 SQL Server 2008 R2 Service Pack 2 的累积更新包1注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 修补程序版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2730301 发布 SQL Server 2008 R2 Service Pack 2 后发布的 SQL Server 2008 R2 版本

SQL Server 2008 R2 Service Pack 1

此问题的修补程序首次发布于 SQL Server 2008 R2 Service Pack 1 的累积更新7。有关如何获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2703282 SQL Server 2008 R2 Service Pack 1 的累积更新包7注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 修补程序版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2567616 在发布 SQL Server 2008 R2 Service Pack 1 之后发布的 SQL Server 2008 R2 版本

SQL Server 2012

此问题的修补程序首次在 SQL Server 2012 的累积更新2中发布。有关此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2703275 SQL Server 2012 累积更新包2注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2012 修复版本附带的所有修补程序和所有安全修补程序。 Microsoft 建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2692828 在 SQL Server 2012 发布后发布的 SQL Server 2012 版本 必须将 SQL Server 2012 修补程序应用到 SQL Server 2012 的安装。

SQL Server 2008 R2

此问题的修补程序首次在累积更新13中发布。有关如何为 SQL Server 2008 R2 获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

2679366 SQL Server 2008 R2 的累积更新程序包13注意 由于这些版本是累积的,因此每个新的修复版本都包含了以前的 SQL Server 2008 R2 修补程序版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

981356 发布 SQL Server 2008 R2 后发布的 SQL Server 2008 R2 版本注意 安装累积更新后,应打开跟踪标记4199以启用此累积更新中提供的修复(如果满足以下条件):

  • 查询计划的 TOP 运算符位于另一个应用/联接运算符(联接2)右侧的嵌套循环联接运算符(联接1)之上。

  • 联接1的外部方具有对联接2的外部方的外部引用。

  • 联接1在具有唯一性的左侧列上使用相等谓词。

"症状" 部分中将显示此类查询的示例。 (这假设数据库中存在一些唯一性约束。) 如果有其他查询包含 TOP、OPTION (FAST N)、IN 或 EXISTS 运算符并产生类似的症状,但不符合此处描述的模式,请打开跟踪标记4138。警告 此解决方法可能会导致你的计算机或网络更易受到恶意用户或恶意软件(例如病毒)的攻击。 如果启用跟踪标记4138,则对于包含 TOP、OPTION (FAST N)、IN 或 EXISTS 运算符的其他查询,性能可能会降低。 仅当满足以下条件时,才应使用跟踪标志4138:

  • 它对涉及这些运算符的慢速查询的影响已得到确认。

  • 没有其他有用的解决方法。

  • 在包含类似运算符的其他查询中检测不到回归。

状态

Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。

解决方法

若要解决此问题,请使用左外部联接运算符或多个优化程序提示中的任何一个。

需要更多帮助?

需要更多选项?

了解订阅权益、浏览培训课程、了解如何保护设备等。