------ 问题的提出:
在SQL-server2005中如何对运行慢的查询进行分析?
引起查询或更新的执行时间超过预期时间的原因有多种。查询运行慢,可能是由与运行 SQL Server 的网络或计算机相关的性能问题引起的,也可能是由物理数据库设计问题引起的。
查询和更新运行慢的最常见原因有:
- 网络通讯速度慢。
- 服务器的内存不足,或者没有足够的内存供 SQL Server 使用。
- 索引列上缺少有用的统计信息。
- 索引列上的统计信息过期。
- 缺少有用的索引。
- 缺少有用的索引视图。
- 缺少有用的数据条带化。
- 缺少有用的分区。
--------问题的判断,检查,操作:
- 是与组件而不是与查询相关的性能问题吗?例如,是网络性能低的问题吗?有其他可能引起或造成性能降低的组件吗?
Windows 系统监视器可用于监视与 SQL Server 和非 SQL Server 相关的组件的性能。 - 如果性能问题与查询相关,那么涉及到的是哪个或哪组查询?
首先使用 SQL Server Profiler 来帮助找出运行慢的查询。
在找出运行慢的查询后,可以使用 SET 语句启用 SHOWPLAN、STATISTICS IO、STATISTICS TIME 和 STATISTICS PROFILE 选项,进一步分析查询的性能,相关描述如下:
- SET SHOWPLAN_XML ON 描述 SQL Server 查询优化器选择用来检索完善的 XML 文档数据的方法。在 Microsoft SQL Server 2005 中,建议使用这种方法。此 SET 选项生成的信息比 SHOWPLAN_ALL 和 SHOWPLAN_TEXT SET 选项生成的信息详细。
- SET SHOWPLAN_ALL ON 描述 SQL Server 查询优化器选择的数据检索方法。此 SET 选项生成的信息比 SHOWPLAN_TEXT SET 选项生成的信息详细。
- SET SHOWPLAN_TEXT ON 返回每条 Transact-SQL 语句的执行信息,但不执行它们。
- SET STATISTICS XML ON 显示每个查询执行后的结果集,并以完善的 XML 文档的形式显示查询执行的概要信息。在 SQL Server 2005 中,建议使用这种方法。此 SET 选项生成的信息比 STATISTICS PROFILER SET 选项生成的信息详细。
- SET STATISTICS PROFILE ON 显示每个查询执行后的结果集,并显示查询执行的概要信息。
- SET STATISTICS IO ON 报告与语句中引用的每个表的扫描数、逻辑读取数(在高速缓存中访问的页数)和物理读取数(访问磁盘的次数)的相关信息。
- SET STATISTICS TIME ON 显示分析、编译和执行查询所需的时间(毫秒)。
- SET SHOWPLAN_XML ON 描述 SQL Server 查询优化器选择用来检索完善的 XML 文档数据的方法。在 Microsoft SQL Server 2005 中,建议使用这种方法。此 SET 选项生成的信息比 SHOWPLAN_ALL 和 SHOWPLAN_TEXT SET 选项生成的信息详细。
- 是否已经用有用的统计信息优化查询?(关于索引的)
SQL Server 自动在索引列上创建对列内值的分布情况的统计信息。也可以手动(使用 SQL Server Management Studio 或 CREATE STATISTICS 语句)或自动(如果将 AUTO_CREATE_STATISTICS 数据库选项设置为 TRUE)在非索引列上创建这些统计信息。查询处理器可以利用这些统计信息来确定最佳的查询评估策略。在联接操作所涉及的非索引列上维护附加的统计信息可以提高查询性能。
使用 SQL Server Profiler 或 SQL Server Management Studio 内的图形执行计划来监视查询,以确定查询是否有足够的统计信息。 - 查询统计是最新的吗?统计信息是自动更新的吗?(关于索引的)
SQL Server 自动在索引列上创建并更新查询统计信息(只要没有禁用对查询统计信息的自动更新)。另外,也可以手动(使用 SQL Server Management Studio 或 UPDATE STATISTICS 语句)或自动(如果将 AUTO_UPDATE_STATISTICS 数据库选项设置为 TRUE)在非索引列上更新统计信息。最新的统计信息不取决于日期或时间数据。如果尚未执行 UPDATE 操作,则查询统计信息仍是最新的。
如果没有将统计信息设置为自动更新,请进行设置。 - 有合适的索引吗?(索引添加不当会适得其反的)添加一个或多个索引会不会提高查询性能?数据库引擎优化顾问也可以建议创建必要的统计信息(自动创建除外)。
- 有数据热点或索引热点吗?请考虑使用磁盘条带化。使用 0 级 RAID(独立磁盘冗余阵列)可实现磁盘条带化,在这种 RAID 上,数据分布在多个磁盘驱动器上。(不过我们的服务器系统经常是做5级RAID啦!看起来database和程序物理上彻底分离啊!)
- 是否为查询优化器提供了优化复杂查询的最有利条件?
- 如果将数据的表和索引进行相似的分区,则分区还可以提高查询性能。为什么呢?懂计算机系统结构的,对磁盘结构了解的人就会发现,这跟磁盘的工作原理有关,具体就不说了,请另了解磁盘工作原理。