是否要求进一步的优化。如果计划成本比阈值低,那么,进行附加优化比只执行已找到的计划成本要高。所以,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 的功能和技巧编写出更好的应用程序。
如果交易处理阶段找到的计划,仍比该阶段的阈值贵,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 的功能和技巧编写出更好的应用程序。