为什么 Oracle 在一个查询中对同一张表同时执行 TABLE SCAN 和 INDEX UNIQUE SCAN?

问题描述 投票:0回答:0

我不是在寻找以下的优化,只是一个解释。我有这个问题:

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 获取其余行,然后再次运行全表扫描?

sql oracle sql-execution-plan
© www.soinside.com 2019 - 2024. All rights reserved.