我不是在寻找以下的优化,只是一个解释。我有这个问题:
SELECT COUNT(LARGE_A.id_a), SUM(LARGE_A.b_integer)
FROM LARGE_A
INNER JOIN MEDIUM_A ON LARGE_A.id_a = MEDIUM_A.id
INNER JOIN MEDIUM_B ON LARGE_A.id_b = MEDIUM_B.id
WHERE
MEDIUM_A.a_varchar2 LIKE 'Example%' AND
EXTRACT(YEAR FROM MEDIUM_B.a_datetime) = 0 AND
LARGE_A.a_integer BETWEEN 0 AND 1000;
属性的类型写在他们的名字里。 ID 是整数。表
LARGE_A
有 1 000 000 行,中间的每行有 100 000 行。 ID是主键,但是表LARGE_A
有一个复合键(id_a, id_b)
.
然后我从
V$SQL
视图中获取了以下执行计划,因为 Autotrace 与此有关。
SELECT STATEMENT
|SORT AGGREGATE
||HASH JOIN
|||NESTED LOOPS
||||NESTED LOOPS
|||||STATISTICS COLLECTOR
||||||NESTED LOOPS
|||||||TABLE ACCESS FULL LARGE_A
|||||||TABLE ACCESS BY INDEX ROWID MEDIUM_A
||||||||INDEX UNIQUE SCAN PK(MEDIUM_A)
|||||INDEX UNIQUE SCAN PK(MEDIUM_B)
||||TABLE ACCESS BY INDEX ROWID MEDIUM_B
|||TABLE ACCESS FULL MEDIUM_B
PK 表示括号中给出的表的主键(整数)上的非聚集索引。我在这里不使用物联网。
为什么优化器会先从索引中一条一条查询记录
PK(MEDIUM_B)
然后使用 ROWID 获取其余行,然后再次运行全表扫描?