索引联接扫描是多个索引的哈希联接,它们一起返回查询请求的所有列。数据库不需要访问表,因为所有数据都是从索引中检索的。
8.3.7.1当优化器考虑索引联接扫描时
在某些情况下,避免表访问是最具成本效益的选择。
在以下情况下,优化器考虑使用索引联接:
- 多个索引的哈希联接检索查询所请求的所有数据,而无需访问表。
- 从表中检索行的成本比 不从表中(即索引中)检索行而读取索引要高。索引联接通常很昂贵。例如,在扫描两个索引并将它们联接时,选择最有选择性的索引然后探查表的成本通常较低。
您可以使用提示指定索引连接。 INDEX_JOIN(table_name)
也可以看看:
8.3.7.2索引联接扫描如何工作
索引联接涉及扫描多个索引,然后对从这些扫描获得的行标识使用哈希联接以返回行。
在索引联接扫描中,始终避免表访问。例如,在单个表上联接两个索引的过程如下:
- 扫描第一个索引以检索行ID。
- 扫描第二个索引以检索行ID。
- 通过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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




