优化器指令
优化器指令的作用
优化器针对每个查询计算最优查询计划。即使优化器使用了大量统计信息,一些情况下仍然无法做出最佳的决策。要重写优化器决策,您可以使用优化器指令来强制优化器使用指定的查询计划。
优化器指令语法
优化器指令通常针对当前查询的范围。要查看指令的工作方式,您可以使用 SET EXPLAIN ON 获得查询计划。要禁用指令,您可以在环境中设定 IFX_DIRECTIVE 0,也可以在 onconfig 中设置 DIRECTIVE 0。
优化器指令使用有效的注释指示符作为分隔符。其中包括:
- { 表示开始分隔符,} 表示结束分隔符
- /* 表示开始分隔符,而 */ 表示结束分隔符
- --(两个短划线)表示开始分隔符;无需使用结束分隔符
在分隔符之后,每条指令的第一个字符必须是 + 号(加号)。优化器指令紧跟在 SELECT、INSERT 和 UPDATE 关键字后面。
清单 11. 优化器指令示例
SELECT --+<Directive>
customer_name from customer where customer_num > 103
|
指令包含以下几种类型:
- 访问方法指令:这些指令描述优化器搜索表的方式。示例包括
INDEX <indexname>、AVOID_FULL 和 AVOID_INDEX <indexname>。
- 连接顺序(Join-order)指令:连接顺序指令
ORDERED 强制优化器按照查询中使用的顺序使用表。
连接方法(Join-method)指令:连接方法指令在嵌套循环和散列连接之间进行选择。其中 USE_NL 和 AVOID_NL 用于嵌套循环连接,而 USE_HASH 和 AVOID_HASH 用于散列连接。
- 优化目标(Optimization-goal)指令:优化目标指令指定查询性能的衡量方法。指令包括
ALL_ROWS 和 FIRST_ROWS。FIRST_ROWS 只返回第一个屏幕,其中显示查询返回的行。
- 解释模式(Explain-mode)指令:解释模式指令用于测试和调试查询计划,并将信息输出到 sqexplain.out 文件。
EXPLAIN 基本上与 SET EXPLAIN ON 相同。AVOID_EXECUTE 仅仅执行查询计划,而不执行查询本身。这一特性使您不必等到查询完成就可以了解查询计划是否符合您的需要,在处理大型表时等待查询完成将耗费很多时间。
- 重写方法(Rewrite-method)指令:默认情况下,优化器不允许执行非嵌套的相关子查询。
NESTED 关键字可阻止使用非嵌套子查询重写查询。