如何解决 SQL Server 7.0 或更高版本上查询性能低的问题

Extended support for SQL Server 2005 ended on April 12, 2016

If you are still running SQL Server 2005, you will no longer receive security updates and technical support. We recommend upgrading to SQL Server 2014 and Azure SQL Database to achieve breakthrough performance, maintain security and compliance, and optimize your data platform infrastructure. Learn more about the options for upgrading from SQL Server 2005 to a supported version here.

本文的发布号曾为 CHS243589
概要
本文介绍如何解决当应用程序与 Microsoft SQL Server 结合使用时可能遇到的性能问题:一个特定查询或一组查询的性能较低。如果想要解决性能问题,但尚未找到引起此问题的某一特定查询或一组查询(其执行速度比预期速度慢),则在继续操作前请参见下面的 Microsoft 知识库文章:
224587 如何解决 SQL Server 应用程序的性能问题
本文假设您已使用 224587 一文缩小了问题范围,且已捕获到 SQL 事件探查器跟踪,其中包含 224587 一文中所详细描述的特定事件和数据列。

优化数据库查询可能需要多方面的努力。以下几节讨论研究查询性能时要检查的一般项目。

注意:如果您使用的是 SQL Server 2005,请使用 SQL Server Management Studio(而不使用 SQL 查询分析器),以及数据库引擎优化顾问(而不使用索引优化向导)。
返回页首

确认存在正确的索引

当查询执行时间较长时,首先要执行的一个检查是进行索引分析。如果正研究一个单独查询,可以使用 SQL 查询分析器中的执行索引分析选项;如果 SQL 事件探查器跟踪的负载较大,则可以使用索引优化向导。这两种方法都使用 SQL Server 查询优化器来确定对指定查询有帮助的索引。这是确定数据库中是否存在正确索引的非常有效的方法。

有关如何使用索引优化向导的信息,请参见 SQL Server 7.0 联机丛书中的“索引优化向导”主题。

如果从以前版本的 SQL Server 升级了应用程序,则在 SQL Server 7.0 中使用不同索引可能会更有效,原因是优化器和存储引擎发生了变化。索引优化向导可以帮助您确定索引策略的变化是否会提高性能。

有关如何在 SQL Server 2005 中使用数据库引擎优化顾问(而不使用索引优化向导)的更多信息,请参见 SQL Server 2005 联机丛书中的以下主题:
  • 数据库引擎优化顾问与索引优化向导的区别
  • 数据库引擎优化顾问教程
返回页首

删除所有查询、表和联接提示

提示会覆盖查询优化并防止查询优化器选择最快的执行计划。由于优化器发生了变化,因此早期版本的 SQL Server 中提高性能的提示可能对 SQL Server 7.0 中的性能不起作用或产生负面影响。另外,联接提示可能会因以下原因而导致性能降低:
  • 联接提示阻止特定查询进行自动参数化和查询计划缓存。
  • 如果使用联接提示,即使这些联接未明确使用某个提示,也表示您要强制实施查询中所有表的联接次序。
如果要分析的查询包括任何提示,请删除这些提示,然后重新评估性能。

返回页首

检查执行计划

确认存在正确的索引,且没有提示限制优化器生成有效计划的功能后,可以检查查询执行计划。可以使用以下任一方法查看查询的执行计划:
  • SQL 事件探查器

    如果在 SQL 事件探查器中捕获到 MISC:Execution Plan 事件,则该事件将恰好在对特定的系统进程 ID (SPID) 进行的查询的 StmtCompleted 事件前发生。
  • SQL 查询分析器:Graphical Showplan

    在查询窗口中选定查询后,单击查询菜单,然后单击显示估计的执行计划

    注意:如果存储过程或批处理创建并引用了临时表,则在您显示执行计划前,必须使用 SET STATISTICS PROFILE ON 语句或显式创建临时表。
  • SHOWPLAN_ALL 和 SHOWPLAN_TEXT

    要接收估计执行计划的文本版本,可以使用 SET SHOWPLAN_ALL 和 SET SHOWPLAN_TEXT 选项。有关更多信息,请参见 SQL Server 7.0 联机丛书中的“SET SHOWPLAN_ALL (T-SQL)”和“SET SHOWPLAN_TEXT (T-SQL)”主题。

    注意:如果存储过程或批处理创建并引用了临时表,则在您显示执行计划前,必须使用 SET STATISTICS PROFILE ON 选项或显式创建临时表。
  • STATISTICS PROFILE

    如果正以图形方式或使用 SHOWPLAN 显示估计的执行计划,则查询并没有真正执行。因此,如果在批处理或存储过程中创建临时表,则会因临时表不存在而无法显示估计的执行计划。STATISTICS PROFILE 先执行查询,然后显示实际执行计划。有关更多信息,请参见 SQL Server 7.0 联机丛书中的“SET STATISTICS PROFILE (T-SQL)”主题。如果在 SQL 查询分析器中运行,该计划会以图形格式显示在结果窗格的执行计划选项卡上。
有关如何在 SQL Server 2005 中显示估计执行计划的更多信息,请参见 SQL Server 2005 联机丛书中的“如何显示估计的执行计划”主题。
返回页首

检查 Showplan 输出

Showplan 输出提供了有关 SQL Server 用于特定查询的执行计划的大量信息。有关这些信息和生成的事件的细节,请参见 SQL Server 7.0 联机丛书的“优化数据库性能”一章。下面是有关执行计划的一些基本内容,您可以进行查看以确定是否使用了最佳计划:
  • 使用正确的索引

    Showplan 输出可显示查询中包含的每个表以及用于获取其中数据的访问路径。对于 Graphical Showplan,将指针移到表上可查看每个表的详细信息。如果正在使用某个索引,则会看到“索引查找”;如果未使用索引,则会看到用于堆的“表扫描”或用于具有聚集索引的表的“聚集索引扫描”。“聚集索引扫描”表示正通过聚集索引扫描表,而不是正在使用聚集索引直接访问各行。

    如果确定存在有用索引,且该索引未用于此查询,则可以使用索引提示尝试强制实施此索引。有关索引提示的更多信息,请参见 SQL Server 联机丛书中的“FROM (T-SQL)”主题。
  • 正确的联接次序

    Showplan 输出表示查询中包含的表以何种次序联接。对于嵌套循环联接,列出的上部表为外部表,且应为两个表中的较小者。对于哈希联接,上部表成为生成输入,也应为两个表中的较小者。但请注意,次序不太重要,因为如果查询处理器发现优化器做出错误决定,它会在运行时倒转生成输入和探测输入。可以通过检查 Showplan 输出中的“行计数”估计值来确定哪个表返回的行较少。

    如果确定查询可能会受益于不同的联接次序,可以使用联接提示尝试强制实施联接次序。有关联接提示的更多信息,请参见 SQL Server 7.0 联机丛书中的“FROM (T-SQL)”主题。

    注意:在大型查询中使用联接提示会隐式强制实施查询中其他表的联接次序,如同设置了 FORCEPLAN 一样。
  • 正确的联接类型

    SQL Server 使用嵌套循环联接、哈希联接和合并联接。如果低性能查询使用其中的一种联接技术,则可以尝试强制实施其他联接类型。例如,如果某查询正使用哈希联接,则可以使用 LOOP 联接提示来强制实施嵌套循环联接。有关联接提示的更多信息,请参见 SQL Server 7.0 联机丛书中的“FROM (T-SQL)”主题。

    注意:在大型查询中使用联接提示会隐式强制实施查询中其他表的联接类型,如同设置了 FORCEPLAN 一样。
  • 并行执行

    如果您使用的是多处理器计算机,还可以检查是否正在使用并行计划。如果正使用并行计划,则会看到 PARALLELISM (Gather Streams) 事件。如果特定查询在使用并行计划时性能较低,则可以使用 OPTION (MAXDOP 1) 提示尝试强制实施非并行计划。有关更多信息,请参见 SQL Server 7.0 联机丛书中的“SELECT (T-SQL)”主题。
有关如何在 SQL Server 2005 中使用 Showplan 执行计划输出的更多信息,请参见 SQL Server 2005 联机丛书中的以下主题:
  • 如何以 XML 格式保存执行计划
  • XML Showplans
  • Showplan 安全
小心:由于查询优化器通常为查询选择最佳执行计划,因此 Microsoft 建议您仅在别无选择的情况下才使用联接提示、查询提示和表提示,而且仅当您是经验丰富的数据库管理员时才可使用。返回页首
参考
SQL Server 7.0 联机丛书中的以下主题提供有关优化查询的信息:
  • “使用有效数据检索优化应用程序性能”
  • “查询优化”
  • “查询优化建议”
  • “Transact-SQL 提示”
返回页首
属性

文章 ID:243589 - 上次审阅时间:05/16/2011 13:01:00 - 修订版本: 6.0

Microsoft SQL Server 2000 标准版, Microsoft SQL Server 2000 64-bit Edition, Microsoft SQL Server 7.0 标准版, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise, Microsoft SQL 2005 Server Workgroup

  • kbsqldeveloper kbhowtomaster KB243589
反馈