如何查看SQL执行计划
使用 PL/SQL
查看,具体使用方法如下:
-
新建
解释计划窗口
,将SQL
复制进去执行,即可显示执行计划。
-
选中
SQL
语句,点击菜单工具
-解释计划
或 按快捷键F5
执行计划结果说明
表扫描
table access by index rowid
通过ROWID的表存取,一次I/O只能读取一个数据块。通过rowid读取表字段,rowid可能是索引键值上的rowid
table access full
全表扫描,对所有表中记录进行扫描。表字段不涉及索引时往往采用这种方式,此时效率最低。
索引扫描
index unique scan
索引唯一扫描,如果表字段有 UNIQUE
或 PRIMARY KEY
约束,Oracle实现索引唯一扫描,这种扫描方式条件比较极端,出现比较少。
index range scan
索引范围扫描,最常见的索引扫描方式。在非唯一索引上都使用索引范围扫描,具体如下:
- 在唯一索引列上使用了以下圈定范围的操作符(> < <> >= <= between等)
- 在组合索引上,只使用部分列进行查询,导致查询出多行
- 对非唯一索引列上进行的任何查询
index full scan
索引全扫描,这种情况下,是查询的数据都属于索引字段,一般都含有排序操作。
index fast full scan
索引快速扫描,如果查询的数据都属于索引字段,并且没有进行排序操作,那么是属于这种情况。条件比较极端,出现比较少。
index range scan
索引范围扫描,最常见的索引扫描方式。在非唯一索引上都使用索引范围扫描。
index range scan
索引范围扫描,最常见的索引扫描方式。在非唯一索引上都使用索引范围扫描。
表连接
排序合并连接(Sort Merge Join)
-
对于
非等值连接
,这种连接方式的效率是比较高的。 -
如果在关联的列上都有索引,效果更好。
-
对于将2个较大的
row source
做连接,该连接方法比Nested Loops
连接要好一些。 -
但是如果
sort merge
返回的row source
过大,则又会导致使用过多的rowid
在表中查询数据时,数据库性能下降,因为过多的I/O.
嵌套循环(Nested Loops)
-
如果
driving row source
(外部表)比较小,并且在inner row source
(内部表)上有唯一索引,或有高选择性非唯一索引时,使用这种方法可以得到较好的效率。 -
NESTED LOOPS
有其它连接方法没有的的一个优点是:可以先返回已经连接的行,而不必等待所有的连接操作处理完才返回数据,这可以实现快速的响应时间。
哈希连接(Hash Join)
-
这种方法是在
oracle7
后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器
中,而且需要设置合适的hash_area_size
参数,才能取得较好的性能。 -
在2个较大的
row source
之间连接时会取得相对较好的效率,在一个row source
较小时则能取得更好的效率。 -
只能用于
等值连接
中