修复:在 SQL Server 2012或 SQL Server 2014中使用表变量会导致性能下降的问题

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 2952444
症状
当填充多行的表变量,然后将它联接与其他表时,查询优化器可以选择低效的查询计划,并可能导致减慢查询性能。
解决方案
应用此修补程序后,您可以打开跟踪标志 2453 允许表变量来足够的行数发生更改时触发重新编译。这使得查询优化器选择更有效的计划。

问题首先修复了下面的累积更新或 / 和 SQL Server 的服务包。

对于 SQL Server 2014年累积更新 3

有关累积更新 SQL Server

SQL Server 的每个新累积更新包含所有修补程序和所有安全修补程序,已包含在以前的累积更新。为 SQL Server,请查阅最新的累积更新:

SQL Server 2012年的 Service pack 2

有关 SQL Server 的服务包

Service pack 具有累积性。每个新服务包中包含以前的服务包,以及任何新的解决办法中的所有修补程序。我们的推荐是应用最新的 service pack 和该 service pack 累积更新。在安装最新的服务包之前不需要安装上一个服务包。用于表 1 下面文章中查找有关的最新服务包和最新的累积更新的其他信息:

更多信息
当您使用表变量批处理或过程中的时,查询编译并优化表变量的初始空状态。如果在运行时的多行填充此表变量,则预编译的查询计划可能不再是最佳。例如,查询可能会加入 table 变量与嵌套循环因为很少的行数通常更高。该查询计划可以是表变量具有数百万行的情况下效率低下。哈希联接可能是在这种条件下更好的选择。若要获取新的查询计划,它需要重新编译。与其他用户或临时表,但是,表变量中的行计数更改不会触发查询的重新编译。通常情况下,您可以变通解决此问题的选项 (重新编译),它有它自己的开销。
跟踪标志 2453年允许重新编译查询而无需选项 (重新编译) 的好处。此跟踪标志不同的选项 (重新编译) 两个主要方面。
(1) 它将其他表使用相同的行计数阈值。查询不需要编译的每次执行与不同选项 (重新编译)。仅当行计数更改超过预先定义的阈值时,它会触发重新编译。
(2) 选项 (重新编译),强制查询以查看参数和优化查询。此跟踪标记不会强制参数查看。

在运行时,注意此跟踪标记必须为 ON。不能在 QUERYTRACEON 中使用此跟踪标记。此跟踪标志必须谨慎使用,因为它可以增加数量的查询重新编译,这可能成本高于储蓄更好的查询优化从。
状态
Microsoft 已经确认这是"适用于"一节中列出的 Microsoft 产品中的问题。

警告:本文已自动翻译

属性

文章 ID:2952444 - 上次审阅时间:02/22/2016 07:12:00 - 修订版本: 3.0

Microsoft SQL Server 2012 Service Pack 2, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard

  • kbqfe kbfix kbsurveynew kbexpertiseadvanced kbmt KB2952444 KbMtzh
反馈