连接方法伪指令

使用连接方法伪指令影响表在 GBase 8s 扩展的连接查询中如何连接。

连接方法伪指令
元素 描述 限制 语法
comments 用于记录伪指令的文本 必须出现在注释符号之间 字符串

使用逗号或空格分隔括号内置的元素。

下表描述了每个连接方法伪指令。

关键字
作用
USE_NL
使用指定的表作为嵌套循环连接的内部表

如果在 FROM 子句中指定了 n 个表,那么 USE_NL 连接方法伪指令中最多可以指定(n-1)个表。

USE_HASH
使用哈希连接访问指定的表

也可以选择表是用来创建哈希列表或探测哈希表。

AVOID_NL
请勿在嵌套循环连接中使用指定的表作为内部表

这个伪指令列出的表仍然可以作为外部表参与嵌套循环连接。

AVOID_HASH
不要使用哈希连接访问指定的表

可以选择使用哈希连接,但是要对哈希连接中表的作用强行加以限制。

连接方法伪指令优先于 OPTCOMPIND 配置参数强制的连接方法。

当指定 USE_HASH 或 AVOID_HASH 伪指令(分别表示使用或避免使用哈希连接)时,也可以指定每个表的的作用:
  • /BUILD

    和 USE_HASH 伪指令一起使用,这个关键字表示指定的表用来构造一个哈希表,和 AVOID_HASH 伪指令一起使用,这个关键字表示指定的表用来构造哈希表。

  • /PROBE

    和 USE_HASH 伪指令一起使用,这个关键字表示指定的表用来探测一个哈希表。和 AVOID_HASH 伪指令一起使用,这个关键字表示指定的表用来探测一个哈希表。只要至少有一个表没有指定为 PROBE,就可以指定多个探测表。

为使优化程序找到有效的连接查询计划,必须至少为在连接中涉及的每个表运行 UPDATE STATISTICS LOW ,以提供适当的开销估计。否则,优化程序可能会选择将整个表广播给所有实例,即使表非常大。

如果没有指定 /BUILD 关键字也没有指定 /PROBE 关键字,那么优化程序使用成本估计来确定表的作用。

在这个例子中,USE_HASH 伪指令强制优化程序在 dept 表上构造一个哈希表,并且只考虑用哈希表来连接 dept 和其它表。因为没有指定其它伪指令,所以优化程序为查询中的其它连接选择花费最小的连接方法。
SELECT /*+ USE_HASH (dept /BUILD) 
          The optimizer must use dept to construct a hash table */
          name, title, salary, dname
          FROM emp, dept, job WHERE loc = 'Phoenix' 
          AND emp.dno = dept.dno  AND emp.job = job.job;

您为符合 ANSI 连接查询的指定的连接方法优化程序伪指令会被忽略,但是它在解释输出文件中的 Directives Not Followed 下列出。

1 请参阅 存取方法伪指令