用于对运行慢的查询进行分析的清单

引起查询或更新的执行时间超过预期时间的原因有多种。查询运行慢,可能是由与运行 SQL Server 的网络或计算机相关的性能问题引起的,也可能是由物理数据库设计问题引起的。

查询和更新运行慢的常见原因有多种:

  • 网络通讯速度慢。

  • 服务器的内存不足,或者没有足够的内存供 SQL Server 使用。

  • 缺少有用的统计信息。

  • 缺少有用的索引。

  • 缺少有用的索引视图。

  • 缺少有用的数据条带化。

  • 缺少有用的分区。

当查询或更新花费的时间比预期时间长时,请考虑以下问题,找到可解答前一节中列出的查询运行慢的原因:

提示提示

为了节省时间,请在与技术支持提供商联系之前查阅此清单。

  1. 是与组件而不是与查询相关的性能问题吗?例如,是网络性能低的问题吗?有其他可能引起或造成性能降低的组件吗?

    Windows 系统监视器可用于监视与 SQL Server 和非 SQL Server 相关的组件的性能。有关详细信息,请参阅监视资源使用情况(系统监视器)

  2. 如果性能问题与查询相关,那么涉及到的是哪个或哪组查询?

    使用 SQL Server Profiler 帮助识别速度缓慢的查询。有关详细信息,请参阅使用 SQL Server Profiler。使用 sys.dm_exec_query_statssys.dm_exec_requests 动态管理视图查找共同消耗大量资源的类似查询。有关详细信息,请参阅使用查询和查询计划哈希值查找和优化类似查询

  3. 如何分析运行慢的查询的性能?

    标识了运行慢的一个或多个查询之后,可以通过生成显示计划来进一步分析查询性能,该显示计划可以是查询优化器生成的文本、XML 或查询执行计划的图形表示形式。您可以使用 Transact-SQL SET 选项、SQL Server Management Studio 或 SQL Server Profiler 来生成显示计划。

    有关使用 Transact-SQL SET 选项显示文本和 XML 执行计划的信息,请参阅通过使用 Showplan SET 选项显示执行计划 (Transact-SQL)

    有关使用 SQL Server Management Studio 显示图形执行计划的信息,请参阅显示图形执行计划 (SQL Server Management Studio)

    有关使用 SQL Server Profiler 显示文本和 XML 执行计划的信息,请参阅使用 SQL Server Profiler 事件类显示执行计划

    由这些工具收集的信息使您能够确定 SQL Server 查询优化器如何执行查询以及使用的是哪些索引。利用这些信息,可以确定通过重写查询、更改表上的索引或修改数据库设计等方法能否提高性能。有关详细信息,请参阅分析查询

  4. 是否已经用有用的统计信息优化查询?

    查询优化器使用统计信息来创建可提高查询性能的查询计划。对于大多数查询,查询优化器已为高质量查询计划生成必要的统计信息,在少数情况下,您需要创建附加的统计信息或修改查询设计以得到最佳结果。

    有关详细信息,请参阅使用统计信息提高查询性能。此主题提供有关提高查询性能统计信息的效率的指导原则,具体如下:

    • 使用数据库范围的统计信息选项。例如,应验证启用了自动创建统计信息 AUTO_CREATE_STATISTICS 和自动更新统计信息 AUTO_UPDATE_STATISTICS 这两个数据库范围的选项。如果未启用,查询计划可能不是最佳的,查询性能可能下降。

    • 确定何时创建统计信息。在少数情况下,可以通过使用 CREATE STATISTICS (Transact-SQL) 语句创建附加的统计信息,优化查询计划。这些附加的统计信息可以捕获查询优化器在为索引或单列创建统计信息时并未考虑的统计关联。

    • 确定何时更新统计信息。在某些情况下,启用 AUTO_UPDATE_STATISTICS 时,可以通过更频繁更新统计信息来优化查询计划,提高查询性能。可以使用 UPDATE STATISTICS 语句或存储过程 sp_updatestats 来更新统计信息。

    • 设计高效使用统计信息的查询。某些查询实现(如查询谓词中的局部变量和复杂的表达式)可能导致查询计划不是最佳的。遵循有关高效使用统计信息的查询设计指导原则可以避免这种情况。

  5. 有合适的索引吗?添加一个或多个索引会不会提高查询性能?有关详细信息,请参阅常规索引设计指南查找缺失索引数据库引擎优化顾问概述。数据库引擎优化顾问也可能建议创建必要的统计信息。

  6. 有数据热点或索引热点吗?请考虑使用磁盘条带化。使用 0 级 RAID(独立磁盘冗余阵列)可实现磁盘条带化,在这种 RAID 上,数据分布在多个磁盘驱动器上。有关详细信息,请参阅使用文件和文件组RAID

  7. 是否为查询优化器提供了优化复杂查询的最有利条件?有关详细信息,请参阅查询优化建议

  8. 如果数据量很大,需要将其分区吗?便于数据管理是分区的主要优点,而如果将数据的表和索引进行相似的分区,则分区还可以提高查询性能。有关详细信息,请参阅了解分区优化物理数据库设计