Oracle查看SQL执行计划,分析SQL性能

如何查看SQL执行计划

    使用 PL/SQL 查看,具体使用方法如下:

  • 新建 解释计划窗口 ,将 SQL 复制进去执行,即可显示执行计划。
    解释计划窗口

  • 选中 SQL 语句,点击菜单 工具-解释计划 或 按快捷键 F5

执行计划结果说明

表扫描

table access by index rowid

通过ROWID的表存取,一次I/O只能读取一个数据块。通过rowid读取表字段,rowid可能是索引键值上的rowid

table access full

全表扫描,对所有表中记录进行扫描。表字段不涉及索引时往往采用这种方式,此时效率最低。

索引扫描

index unique scan

索引唯一扫描,如果表字段有 UNIQUEPRIMARY 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较小时则能取得更好的效率。

  • 只能用于等值连接

posted @ 2020-06-13 15:29  活宝战斗机  阅读(809)  评论(0编辑  收藏  举报