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 的用法 » 查询处理 » 查询优化与执行

 

优化程序的工作原理

优化程序的作用是设计一种有效的方式来执行 SQL 语句。为此,优化程序必须为查询确定一个执行计划。这包括确定查询中引用的表的访问顺序、确定用于每个表的连接运算符和访问方法以及确定查询中未引用的实例化视图是否可以用于部分查询的计算。当为查询生成了可能的访问计划并预估了这些计划的开销后,优化程序将在连接枚举阶段尝试选取最佳计划来执行查询。最佳访问计划是指优化程序估计其将在最短的时间内以最低的开销返回所需结果集的访问计划。优化程序将通过估计所需的磁盘读写次数来确定每个枚举策略的开销。

在 Interactive SQL 中,可以通过单击 [结果] 窗格中的 [计划] 选项卡来查看用于执行查询的最佳访问计划。要更改所显示的细节级别,请更改 [选项] 窗口(通过 [工具] 菜单访问)的 [计划] 选项卡上的设置。请参见读取图形式计划读取执行计划

使返回第一行的开销最小化

优化程序使用通用磁盘访问开销模型来区分对数据库文件的随机检索和顺序检索之间存在的相对性能差异。可以利用 ALTER DATABASE 语句为特定的硬件配置校准数据库。请参见ALTER DATABASE 语句

缺省情况下,查询处理的优化目标是返回完整的结果集。您可以使用 optimization_goal 选项对此缺省行为进行更改,以最大程度地降低快速返回第一行所需的开销。注意,如果将选项设置为 First-row,优化程序会选择旨在减少提取查询结果的第一行所需时间的访问计划,而且很可能以牺牲总检索时间为代价。请参见optimization_goal 选项 [数据库]

使用语义上等效的语法

大多数命令都可以使用 SQL 语言以多种不同的形式来表示。这些表达式在语义上等效(因为它们执行相同的任务),但在语法上却具有明显的差异。优化程序仅根据每个语句的语义设计出合适的访问计划,几乎毫无例外。

语法差异虽然看起来可能很明显,但通常不会造成任何影响。例如,谓语、表和属性在查询语法中的顺序差异并不会影响访问计划的选择。而优化程序也不会因为查询是否包含非实例化视图而受到影响。

减少优化程序查询的开销

在理想情况下,优化程序将尽可能地找出最高效的访问计划,但这一目标通常是不切实际的。对于复杂的查询,可能会存在多种可能性。

无论优化程序具有多高的效率,如果对每一种选择都进行分析,则会消耗一定的时间和资源。优化程序会将进一步优化所需的开销和执行到当前为止所找到的最佳计划所需的开销进行比较。如果优化程序已设计出了开销较低的计划,就会停止下来执行该计划。与执行已找到的访问计划相比,进一步的优化可能会消耗更多的资源。可以将 optimization_level 选项设置为一个高值来控制优化程序所消耗的资源量。请参见optimization_level 选项 [数据库]

当查询开销大并且非常复杂,或者优化级别设置的高时,优化程序就会运行较长的时间。如果查询开销庞大,则优化程序可能会运行很长的时间,从而导致出现明显的延迟。


优化程序估计值和列统计信息
自动性能调优
优化程序的基础假定
在查询中使用谓语
MIN 和 MAX 函数基于开销的优化
计划高速缓存