1、查看执行计划
EXPLAIN PLAN FOR SELECT * FROM temp_1 a ;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
2、执行计划说明
2.1、执行顺序
根据缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)
2.2、常见表访问方式
2.2.1、TABLE ACCESS FULL(全表扫描)
Oracle会读取表中所有的行,并检查每一行是否满足SQL语句中的 Where 限制条件;
全表扫描时可以使用多块读(即一次I/O读取多块数据块)操作,提升吞吐量;
使用建议:数据量太大的表不建议使用全表扫描,除非本身需要取出的数据较多,占到表数据总量的 5% ~ 10% 或以上
2.2.2、TABLE ACCESS BY INDEX SCAN(索引扫描)
索引扫描方式 | 说明 |
---|---|
INDEX UNIQUE SCAN(索引唯一扫描) | 表中某字段存在 UNIQUE、PRIMARY KEY 约束时,Oracle常实现唯一性扫描,每次至多只返回一条记录 |
INDEX RANGE SCAN(索引范围扫描) | 在唯一索引列上使用了范围操作符(如:> < <> >= <= between);在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描);对非唯一索引列上进行的任何查询 |
INDEX FULL SCAN(索引全扫描) | 它依赖数据库对象的统计信息,统计信息的准确与否会影响CBO做出最优的选择 |
INDEX FAST FULL SCAN(索引快速扫描) | 与 INDEX FULL SCAN 类似,但是一个显著的区别是它不对查询出的数据进行排序 |
INDEX SKIP SCAN(索引跳跃扫描) | 表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件,并且优化器模式为CBO时;当Oracle发现前导列的唯一值个数很少时,会将每个唯一值都作为常规扫描的入口,在此基础上做一次查找,最后合并这些查询 |
2.2.3、TABLE ACCESS BY ROWID(通过ROWID的表存取)
行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID可以快速定位到目标数据上,这也是Oracle中存取单行数据最快的方法
2.3、表连接方式
表连接方式 | 说明 |
---|---|
SORT MERGE JOIN(排序-合并连接) | 表无驱动顺序;排序-合并连接适用的连接条件有” < <= = > >= “,不适用的连接条件有” <> like“ |
NESTED LOOPS(嵌套循环) | 嵌套循环的表有驱动顺序,注意选择合适的驱动表。其好处是可以先返回已经连接的行,而不必等所有的连接操作处理完才返回数据,这样可以实现快速响应 |
HASH JOIN(哈希连接) | 哈希连接只适用于等值连接(即连接条件为 = ) |
CARTESIAN PRODUCT(笛卡尔积) | 笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配 |