包含索引自连接路径的查询计划

索引自连接是一种索引扫描,您可以将它视为一个含有很多小索引扫描的整体,其中每个索引扫描都具有一个由前导关键字列和非前导关键字列上的过滤器组成的唯一组合。

小索引扫描的集合构成了仅使用所有组合索引的子集的访问路径。该表在逻辑上是自连接的,并且更具选择性的非前导关键字应作为索引边界过滤器应用到前导关键字值的每个唯一的组合。

索引自连接在以下情况中有优势:

图 1 中的查询显示一个包含索引自连接路径的查询计划的 SET EXPLAIN 输出。

图: 包含索引自连接路径的查询的 SET EXPLAIN 输出

QUERY:
------
SELECT a.c1,a.c2,a.c3 FROM tab1 a WHERE (a.c3 >= 100103) AND
     (a.c3 <= 100104) AND (a.c1 >= 'PICKED      ') AND
     (a.c1 <= 'RGA2        ') AND (a.c2 >= 1) AND (a.c2 <= 7)
     ORDER BY 1, 2, 3

Estimated Cost: 155
Estimated # of Rows Returned: 1
  1) gbasedbt.a: INDEX PATH
    (1) Index Keys: c1 c2 c3 c4 c5   (Key-Only)  (Serial, fragments: ALL)
        Index Self Join Keys (c1 c2 )
          Lower bound: gbasedbt.a.c1 >= 'PICKED      ' AND (gbasedbt.a.c2 >= 1 ) 
          Upper bound: gbasedbt.a.c1 <= 'RGA2        ' AND (gbasedbt.a.c2 <= 7 )
        Lower Index Filter: (gbasedbt.a.c1 = gbasedbt.a.c1 AND
          gbasedbt.a.c2 = gbasedbt.a.c2 ) AND gbasedbt.a.c3 >= 100103
        Upper Index Filter: gbasedbt.a.c3 <= 100104
        Index Key Filters:  (gbasedbt.a.c2 <= 7 ) AND
                            (gbasedbt.a.c2 >= 1 )

图 1 中,索引存在于 c1、c2、c3、c4 和 c5 列。优化器选择 c1 和 c2 作为前导键,这表明 c1 和 c2 列有很多重复。c3 列的重复很少,因此 c3 列(c3 >= 100103c3 <= 100104)上的谓词具有好的选择性。

正如图 1 所示,索引自连接路径是使用相同索引的两个索引扫描的自连接。第一个索引扫描为前导键列(c1 和 c2)检索每个唯一值。 然后使用 c1 和 c2 的唯一值探测第二个索引扫描,该扫描还使用 c3 列的谓词。因为 c3 列上的谓词具有良好的选择性:

因此,对于 c1 和 c2 的每个唯一值,在 c1、c2 和 c3 上发生了有效的索引扫描。

示例中的以下行指示优化器已经为该表选择了一个索引自连接路径,c1 和 c2 作为该索引自连接的前导键:
Index Self Join Keys (c1 c2 )
          Lower bound: gbasedbt.a.c1 >= 'PICKED      ' AND (gbasedbt.a.c2 >= 1 ) 
          Upper bound: gbasedbt.a.c1 <= 'RGA2        ' AND (gbasedbt.a.c2 <= 7 )

此示例显示了列 c1 和 c2 的范围,可将其作为索引扫描的范围以检索索引的有效主关键字。

该示例中的以下信息显示自连接:
(gbasedbt.a.c1 = gbasedbt.a.c1 AND gbasedbt.a.c2 = gbasedbt.a.c2 )

本信息表示内部索引扫描。对于自连接谓词使用的前导键列 c1 和 c2,指示了来自外部索引扫描的 c1 和 c2 的值。c3 列的谓词充当使内部索引扫描生效的索引过滤器。

规则索引扫描不使用 c3 列上的过滤器来定位索引扫描,因为前导键列 c1 和 c2 不具有等式谓词。

甚至当数据分布统计信息对于前导索引关键字列不可用的时候,INDEX_SJ 伪指令也可通过使用特定的索引或选择索引列表中成本最低的索引来强制索引自连接路径。AVOID_INDEX_SJ 伪指令防止指定索引的自连接路径。另请参阅访问方法伪指令GBase 8s SQL 指南:语法