汽修软件-汽配软件-汽修厂用首佳汽修汽配管理软件系统管理汽修厂

2007年04月5日

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

类归于: 其它软件技术分享 — 标签:, — 汽修汽配管理软件 @ 2:05 上午

这篇文章中的信息适用于:
Microsoft SQL Server 7.0
Microsoft SQL Server 2000(所有版本)

本文的发布号曾为 CHS243589
概要
本文介绍应用程序在使用 Microsoft SQL Server 时可能遇到的一种特定类型的性能问题: 特定查询或查询组的低性能问题。 如果您正在解决性能问题,但没有将问题分离为执行比预期性能低的某个特定查询或某一小组查询,请参见 Microsoft Knowledge Base 中的下列文章:

224587 INF: 解决 SQL Server 中的应用程序性能问题

本文的其它内容假设您已经使用上述文章缩小了问题的范围,并且获取了 SQL Server“事件探查器”跟踪中的特定事件和文本所详细描述的数据列。
更多信息
调整数据库查询需要多方面的工作。 下面章节讨论研究查询性能时通常需要检查的项。

确认存在适当的索引

当您遇到查询执行时间过长时,一个最简单的检查方法是进行索引分析。 如果您正研究一个单独查询,则可以使用“查询分析器”中的执行索引分析选项,如果具有大工作负荷的“事件探查器”跟踪,则可以使用“索引优化向导”。 这两种方法均使用 SQL Server 查询优化器来确定对特定查询有帮助的索引。 这是确定数据库中是否存在适当索引的很有效的方法。

有关如何使用“索引优化向导”的详细信息,请参见 SQL Server 7.0 Books Online 中的“索引优化向导”主题。

如果您从以前版本的 SQL Server 升级应用程序,可能会发现由于优化器和存储引擎的变化,在 SQL Server 7.0 中使用不同的索引会更有效。 “索引优化向导”可以帮助您确定索引策略的变化是否能提高性能。
删除查询语句中所有的查询、表和联接提示

提示将替代查询优化,并能阻止查询优化器选择最快的执行计划。 由于查询优化器的变化,能在以前版本的 SQL Server 中提高性能的提示可能对 SQL Server 7.0 的性能无影响,或者事实上起到破坏作用。 而且,联接提示可能由于下列情况导致性能降低:
联接提示阻止特殊查询进行参数自动化及随后的查询计划缓冲。
当您使用联接提示时,即使这些联接不明确使用某个提示,它暗示您想要强制查询中所有表的联接次序。
如果您分析的查询包含任何提示,将其删除并重新估计性能。
检查执行计划

在确认存在适当的索引并且没有提示限制优化器产生一个有效的计划后,则可以检查查询执行计划了。 可以有多种方式查看查询的执行计划:
SQL Server 事件探查器
如果您在 SQL Server“事件探查器”中捕获了 MISC:Execution Plan 事件,则对于特定的系统进程 ID (SPID),此事件将在查询的 StmtCompleted 事件之前发生。
查询分析器: 图形显示计划
在查询窗口中选择查询后,单击查询菜单并单击显示估计执行计划。

备注:如果存储过程或批处理创建并引用了临时表,则在显示执行计划之前,需要使用 SET STATISTICS PROFILE ON 语句或显式创建临时表。
SHOWPLAN_ALL and SHOWPLAN_TEXT 要得到估计的执行计划的文本版本,可以使用 SET SHOWPLAN_ALL 及 SET SHOWPLAN_TEXT 选项。 有关详细信息,请参见 SQL Server 7.0 Books Online 中的 SET SHOWPLAN_ALL (T-SQL) 和 SET SHOWPLAN_TEXT (T-SQL) 主题。

备注:如果存储过程或批处理创建并引用了临时表,则在显示执行计划之前,需要使用 SET STATISTICS PROFILE ON 或显式创建临时表。
STATISTICS PROFILE
当 以图形方式或 SHOWPLAN 显式估计的执行计划时,并没有真正执行查询。 因此,如果您在批处理或存储过程内创建临时表,由于临时表不存在,将不能显示估计的执行计划。 STATISTICS PROFILE 首先执行查询,然后显示真正的执行计划。 有关详细信息,请参见 SQL Server 7.0 Books Online 中的 SET STATISTICS PROFILE (T-SQL) 主题。 当在“查询分析器”上运行时,这将在结果窗格的执行计划选项卡上以图形格式显示。
检查显示计划输出

在显示计划输出中,有对于某个特定查询 SQL Server 所使用的执行计划的详细信息。 有关产生的信息和事件的详细信息,请参见 SQL Server 7.0 Books Online 中的 Optimizing Database Performance 一章。 下面是有关执行计划的基本方面,可用于确定是否使用了最好的查询计划:
使用适当的索引
显示计划输出将显示查询中的每个表以及用于从 查询中获取数据的访问路径。 对于图形显示计划,将鼠标指针放置于表上,查看每个表中包含的详细信息。 如果使用了某个索引,则将看到 Index Seek,否则,将看到关于堆集的 Table Scan 以及关于具有群集索引表的 Clustered Index Scan。 注意:“Clustered Index Scan”表明正通过群集索引扫描表,而不是群集索引直接用于访问单独行。

如果您确定存在有用的索引,而查询没有使用该索引,则可以通过索引提示强行使用该索引。 有关索引提示的详细信息,请参见 SQL Server 7.0 Books Online 中的 FROM (T-SQL) 主题。
适当的联接次序
显 示计划输出指明查询中的表以何种次序联接的。 对于嵌套循环联接,列出的上部表为外部表,应为两个表中的较小者。 对于哈希联接,上部表成为生成输入,应为两表中的较小者。 然而,如果查询处理器发现查询优化器作出错误判断,它在运行时间内将把生成输入和探测输入倒置,因而上面的次序并非很重要。 您可以通过检查显示计划输出中的 Row Count 估算数来确定哪个表返回的行较少。

如果您确定通过另一种联接次序可以改善查询,则可以用联接提示强制进行连接次序。 有关联接提示的详细信息,请参见 SQL Server 7.0 Books Online 中的 FROM (T-SQL) 主题。

备注: 在大的查询中使用联接提示也隐含地强制查询中的其他表进行联接的次序,就象设置了 FORCEPLAN 一样。
适当的联接类型
SQL Server 使用嵌套循环、哈希联接和合并联接。 如果某个低性能查询正使用某一联接技术,而非另一种联接技术,则可以尝试强制使用不同的联接类型。 例如,如果某查询正使用哈希连接,可以通过 LOOP 联接提示强制执行嵌套循环联接。 有关联接提示的详细信息,请参见 SQL Server 7.0 Books Online 中的 FROM (T-SQL) 主题。

备注: 在大的查询中使用联接提示也暗中规定了查询中的其它表的联接类型,就象设置了 FORCEPLAN 一样。
并行执行
如 果您正使用多处理器计算机,则也可以检查其是否使用了并行计划。 如果使用了并行技术,则将看到一个 PARALLELISM (Gather Streams) 事件。 如果某个使用并行计划的特定查询的性能很低,则可以使用 OPTION (MAXDOP 1) 提示强制非并行计划。 有关详细信息,请参见 SQL Server 7.0 Books Online 中的 SELECT (T-SQL) 主题。
注意: 由于查询优化器通常为查询选择最佳的执行计划,建议只有有经验的数据库管理员才使用联接提示、查询提示及表提示作为最后的解决措施。

相关文章

评论暂缺 »

还没有任何评论。

这篇文章上的评论 RSS feed TrackBack URL

留下评论

首佳软件是专业从事汽修软件、汽配软件、汽车美容软件及4S店管理软件研发和销售的公司,是知名的汽修汽配管理软件供应商.因首佳软件的简单易学易用、性价比高的特性,而广泛应用于全国各地的汽修厂,汽配店,汽车4S店,汽车维修站,汽车美容连锁店等企业. 本博客由 WordPress 所驱动