Microsoft SQL Server 查询处理器的内部机制与结…

2008-02-23 05:36:23来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



优化
SQL Server 优化器其实是由独立的段组成的。第一段是一个非基于成本的优化器,称为琐细计划优化。琐细计划优化的完整概念是,当 SQL 语句确实只有一个可变计划时,基于成本的优化太昂贵了。最好的例子是,带 VALUES 子句的 INSERT 语句组成的查询。它只可能有一个计划。另一个例子是,所有的列都在唯一的封面索引(且没有其他列的索引)中的 SELECT 语句。这两例中,SQL Server 只要简单地生成一个计划,用不着在多个计划选一个更好的方案。琐细计划优化器可找到真正显而易见的计划,而且通常非常便宜。所以,最简单的查询在处理的前期就趋于被清除,优化器不花很多时间来搜索一个好计划。这是好事,因为随着 SQL Server 将杂凑连接、合并连接和索引相交增加到其处理技术列表上, SQL Server 7.0 版上的潜在计划数呈天文数字增长。

如果琐细计划优化器不能找到一个计划,SQL Server 便进入优化的下一部分,称为简化。简化是查询本身的语法变换,寻找可交换的特性和可重新排列的运算。SQL Server 可进行常数合并,以及无需考虑成本或分析索引是什么但能得出更有效查询的其他运算。SQL Server 然后上载关于索引和列的统计信息,并输入优化的最后的主要部分,即基于成本的优化器。

基于成本的优化有三个阶段。第一个基于成本的阶段,称为交易处理阶段,查找简单请求的计划,即典型的交易处理系统。这些请求一般比由琐细计划优化器处理的那些请求要复杂些,并要求比较众多计划查找出成本最低的计划。当交易处理阶段完成时,SQL Server 便将找到的成本最低的计划与内部阈值进行比较。阈值用于决定是否要求进一步的优化。如果计划成本比阈值低,那么,进行附加优化比只执行已找到的计划成本要高。所以,SQL Server 不做进一步优化,并使用交易处理阶段找到的计划。

如果交易处理阶段找到的计划,仍比该阶段的阈值贵,SQL Server 便进入第二个阶段。这个阶段有时称为 QuickPlan 阶段。QuickPlan 阶段扩大搜索范围来寻找一个好计划,包括选择好的、适度复杂的查询。QuickPlan 检查可能的计划范围,完成之后,将最佳计划的成本与第二个阈值进行比较。因为在交易处理阶段,如果发现了一个成本比阈值低的计划,优化便终止,并使用那个计划。一般来说,SQL Server 6.5 版中已有的查询的计划,在 SQL Server 7.0 版中也应当是最佳的,这个计划将要么被琐细计划优化器找到,要么被基于成本的优化的头两个阶段中的一个发现。这些规则被有意地组织起来以达到这个目的。这个计划将很可能由使用单一的索引和使用嵌套循环联合组成。

优化的最后阶段,称为完全优化,旨在对复杂和非常复杂的查询产生一个好计划。对复杂的查询来说,QuickPlan 产生的计划,经常被认为比继续搜索一个更好的计划要昂贵得多,而完全优化将被执行。在完全优化中,实际上有两个适用的独立选择。如果 QuickPlan 阶段产生的最佳成本比“并行成本阈值”的配置值要高,并且如果服务器是一个多处理器机器,那么优化器的最后阶段将涉及查找一个能在多个处理器上并行运行的计划。如果 QuickPlan 阶段的最佳计划的成本比配置的“并行成本阈值”低,那么,优化器将只考虑串行计划。完全优化阶段能执行各种可能性,而且很耗时,因为在这最后阶段必须找到一个计划。优化器仍可能没有检查每个可得到的计划,因为它将任何潜在的计划成本与优化中得出此结果的成本进行比较,并且它估算继续试用不同优化的可能成本。在某些情况下,优化器可能认为,使用现有的计划比继续查找更优方案还要便宜,而且支付继续优化的附加编译成本将不具备高的成本效率比。在这最后阶段处理的各种查询的计划一般只使用一次,所以,几乎没有这样的机会:为编译和优化所付出的额外代价,会在后续执行的计划重用中一次结清。那些后续执行很可能不会发生。

找到一个计划后,该计划便变为优化器的输出,然后 SQL Server 在执行该计划之前,遍历前面已讨论过的全部缓存机制。您应该意识到,如果完全优化阶段产生了该查询的并行计划,并不一定意味着该计划将在多个处理器上执行。如果机器很忙,而且不支持在多个 CPU 上运行单一的查询,该计划则使用单一的处理器。

图 13 显示了优化器的处理流程。



图 13. 优化

执行
查询处理的最后一步是执行。除了这一小段外,我们不会再讨论执行的详细过程。执行引擎采用优化器生成的计划,并执行之。处理实际执行以外,执行引擎还为要运行的处理器调度线程,并提供线程间的通信。

摘要
如前所述,SQL Server 的内部机制与结构是一个非常大的主题,远远超过了我们能在本文中提供的内容。我们重在直接介绍 SQL Server 与客户机的交互方式,以及 SQL Server 关系引擎如何处理来自客户机的请求。我们希望,在了解 SQL Server 如何处理查询,以及如何和何时编译或重新编译它们之后,您就能利用 SQL Server 7.0 的功能和技巧编写出更好的应用程序。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Microsoft SQL Server 查询处理器的内部机制与结构(1)

下一篇:Microsoft SQL Server 7.0数据库设置与数据结构