索引自连接是一种索引扫描,您可以将它视为一个含有很多小索引扫描的整体,其中每个索引扫描都具有一个由前导关键字列和非前导关键字列上的过滤器组成的唯一组合。
小索引扫描的集合构成了仅使用所有组合索引的子集的访问路径。该表在逻辑上是自连接的,并且更具选择性的非前导关键字应作为索引边界过滤器应用到前导关键字值的每个唯一的组合。
图 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 >= 100103 和 c3 <= 100104)上的谓词具有好的选择性。
因此,对于 c1 和 c2 的每个唯一值,在 c1、c2 和 c3 上发生了有效的索引扫描。
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 指南:语法。