Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 查询处理 » 查询优化与执行 » 查询处理阶段

 

跳过查询处理阶段的资格

几乎所有语句都要经历所有的查询处理阶段。但主要有以下两种例外:从计划高速缓存中受益的查询(其计划已由数据库服务器高速缓存的查询),以及跳过查询

  • 计划高速缓存   对于包含在存储过程和用户定义函数中的查询,数据库服务器可能会高速缓存执行计划,以便它们可以被重新使用。对于这类查询,查询执行计划将在执行之后进行高速缓存。下次执行此查询时,会对计划进行检索,执行阶段之前的所有阶段都会被跳过。请参见计划高速缓存

  • 跳过查询   跳过查询是具有某些特性的简单查询的子类,数据库服务器认为这些特性使得查询能够符合跳过优化程序的条件。跳过优化可以减少构建执行计划所需的时间。

    如果查询被识别为跳过查询,则将采用启发式优化(而不是基于开销的优化)—即,可以跳过语义转换和优化阶段,直接通过查询的分析树表示来构建查询执行计划。

简单查询

简单查询是具有单个查询块和以下特性的 SELECT、INSERT、DELETE 或 UPDATE 语句:

  • 查询块不包含子查询或其它诸如 UNION、EXCEPT 和公用表表达式之类的查询块。

  • 查询块引用单个基表或实例化视图。

  • 查询块可以包括 TOP N、FIRST、ORDER BY 或 DISTINCT 子句。

  • 在没有 GROUP BY 或 HAVING 子句的情况下,查询块可以包括集合函数。

  • 查询块不包含窗口函数。

  • 查询块表达式不包含 NUMBER、IDENTITY 或子查询。

  • 在基表中定义的约束为简单表达式。

复杂语句可以在语义转换阶段之后转换为简单语句。出现此转换时,查询可由优化程序跳过进行处理,或使其计划由 SQL Anywhere 服务器进行高速缓存。

强制优化与强制不优化

可以强制满足计划高速缓存条件或跳过优化程序条件的查询由 SQL Anywhere 优化程序进行处理。为此,请将 FORCE OPTIMIZATION 子句与任何 SQL 语句一起使用。

您还可以尝试强制语句跳过优化程序。为此,请使用该语句的 FORCE NO OPTIMIZATION 子句。如果该语句过于复杂以至于无法跳过优化程序(可能是由于数据库选项设置或者模式或查询的特性所导致),则查询会失败并返回错误。

以下语句的 OPTION 子句中允许使用 FORCE OPTIMIZATION 和 FORCE NO OPTIMIZATION 子句: