EXPLAIN PLAN FOR
SELECT sightings.sighting_id, spotters.spotter_name,
sightings.sighting_date
FROM sightings
INNER JOIN spotters
ON sightings.spotter_id = spotters.spotter_id
WHERE sightings.spotter_id = 1255;
SELECT plan_table_output
FROM table(dbms_xplan.display('plan_table',null,'basic'));
id Operation Name
0 select statement
1 nested loops
2 table access by index rowid spotters
3 index unique scan pk_spotter_ID
4 table access full sightings
我试图理解这里到底发生了什么,这听起来是对的:
首先评估select语句,并忽略输出中不在选择列表中的属性
嵌套循环然后计算spotters上的内连接.spotters_id = sightings.spotter_id
索引rowid的表访问权限检索带有步骤3从spotters表返回的rowid的行
索引唯一扫描,扫描PK_SPOTTER_ID索引中的spotter_id,并在spotters表中找到与rowids相关的行
表格访问已满,然后完全扫描目击事件,直到发现目标_id = 1255
答案 0 :(得分:2)
注意:这些答案反映了问题的原始版本。
Oracle正在全面阅读这两个表。
基于join
键对每个表进行哈希处理 - “重新排序”表格,使得相似的键出现在彼此附近。
正在进行加入。
然后进行最终select
的计算并将结果返回给用户。
答案 1 :(得分:2)
步骤似乎基本上是正确的,但应该是按钮。 投影(选择相关列)在扫描阶段尽可能早地完成。 索引操作是SEEK(您没有扫描整个索引)
答案 2 :(得分:0)
这是非正式地按正确的顺序发生的事情:
-- The index pk_spotter_id is scanned for at most one row that satisfies spotter_id = 1255
3 index unique scan pk_spotter_ID
-- The spotter_name column is fetched from the table spotters for the previously found row
2 table access by index rowid spotters
-- A nested loop is run for each (i.e. at most one) of the previously found rows
1 nested loops
-- That nested loop will scan the entire sightings table for rows that match the join
-- predicate sightings.spotter_id = spotters.spotter_id
4 table access full sightings
-- That'll be it for your select statement
0 select statement
一般情况下(有大量例外情况),可以阅读Oracle执行计划
这意味着你走到树下直到找到第一个叶子操作(例如#3),然后执行"第一个",它的结果被输入到父级(例如# 2),所有的兄弟姐妹然后自上而下执行,所有的兄弟姐妹'结果也被输入父母,然后父母结果被送到祖母(例如#1),直到你达到顶级操作。
这是对发生的事情的非正式解释。请注意,一旦语句变得更复杂,这些规则将有许多例外。