暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 19C 索引联接扫描 INDEX_JOIN (多个索引的哈希联接检索查询所请求的所有数据,而无需访问表)

原创 Asher.HU 2021-02-04
1679


索引联接扫描是多个索引的哈希联接,它们一起返回查询请求的所有列。数据库不需要访问表,因为所有数据都是从索引中检索的。


8.3.7.1当优化器考虑索引联接扫描时

在某些情况下,避免表访问是最具成本效益的选择。

在以下情况下,优化器考虑使用索引联接:

  • 多个索引的哈希联接检索查询所请求的所有数据,而无需访问表。
  • 从表中检索行的成本比 不从表中(即索引中)检索行而读取索引要高。索引联接通常很昂贵。例如,在扫描两个索引并将它们联接时,选择最有选择性的索引然后探查表的成本通常较低。

您可以使用提示指定索引连接 INDEX_JOIN(table_name)

也可以看看:

Oracle数据库SQL语言参考

 

8.3.7.2索引联接扫描如何工作

索引联接涉及扫描多个索引,然后对从这些扫描获得的行标识使用哈希联接以返回行。

在索引联接扫描中,始终避免表访问。例如,在单个表上联接两个索引的过程如下:

  1. 扫描第一个索引以检索行ID。
  2. 扫描第二个索引以检索行ID。
  3. 通过rowid执行哈希联接以获得行。


8.3.7.3索引联接扫描:示例

本示例查询姓氏和电子邮件,以姓氏开头的员工A(指定索引联接)。

SELECT /*+ INDEX_JOIN(employees) */ last_name, email
FROM   employees
WHERE  last_name like 'A%';

(last_name,first_name) 和 email上存在单独的索引在部分emp_name_ix指标可能如下所示:

Banda,Amit,AAAVgdAALAAAABSABD
Bates,Elizabeth,AAAVgdAALAAAABSABI
Bell,Sarah,AAAVgdAALAAAABSABc
Bernstein,David,AAAVgdAALAAAABSAAz
Bissot,Laura,AAAVgdAALAAAABSAAd
Bloom,Harrison,AAAVgdAALAAAABSABF
Bull,Alexis,AAAVgdAALAAAABSABV


emp_email_uk索引的第一部分可能如下所示:

ABANDA,AAAVgdAALAAAABSABD
ABULL,AAAVgdAALAAAABSABV
ACABRIO,AAAVgdAALAAAABSABX
AERRAZUR,AAAVgdAALAAAABSAAv
AFRIPP,AAAVgdAALAAAABSAAV
AHUNOLD,AAAVgdAALAAAABSAAD
AHUTTON,AAAVgdAALAAAABSABL


以下示例使用DBMS_XPLAN.DISPLAY_CURSOR函数检索计划数据库检索索引中的所有rowid emp_email_uk,然后检索以emp_name_ix开头的姓氏的rowid A数据库使用哈希联接在两组行ID中搜索匹配项。例如,AAAVgdAALAAAABSABD在两组行标识符中都出现了行标识符,因此数据库在employees表中查找与该行标识符相对应的记录。

示例8-4索引联接扫描

SQL_ID  d2djchyc9hmrz, child number 0
-------------------------------------
SELECT /*+ INDEX_JOIN(employees) */ last_name, email FROM   employees
WHERE  last_name like 'A%'

Plan hash value: 3719800892
-------------------------------------------------------------------------------------------
| Id  | Operation              | Name             | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |                  |       |       |     3 (100)|          |
|*  1 |  VIEW                  | index$_join$_001 |     3 |    48 |     3  (34)| 00:00:01 |
|*  2 |   HASH JOIN            |                  |       |       |            |          |        <-----从两个索引中获取查询结果。 
|*  3 |    INDEX RANGE SCAN    | EMP_NAME_IX      |     3 |    48 |     1   (0)| 00:00:01 |
|   4 |    INDEX FAST FULL SCAN| EMP_EMAIL_UK     |     3 |    48 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("LAST_NAME" LIKE 'A%')
   2 - access(ROWID=ROWID)
   3 - access("LAST_NAME" LIKE 'A%')
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论