SQL优化 - 执行计划基础

执行计划是什么?

执行计划是Oracle数据库用于执行语句的步骤组合。
每个步骤从数据库物理的检索数据或者为发出语句的用户准备数据行。
执行计划包括每个表的访问路径,以及连接表(连接顺序)的适当的连接方式

如何获取执行计划?

explain plan for

  • 实际执行SQL语句;
  • 未必是真实的执行计划;
  • 使用dbms_xplan显示;

sqlplus autotrace

  • 实际执行SQL语句(set autotrace traceonly explain除外);
  • 未必是真实的执行计划;

sql trace

  • 启用10046或sql trace;
  • 使用 tkprof 格式化;

V$SQL V$SQL_PLAN

  • 可以查询到多个子游标的计划信息;
  • 易用性差;

DBMS_XPLAN.DISPLAY_CURSOR

  • SQL执行后才能得到;
  • 真实的执行计划;
  • 需要通过 alter session set statistics_level=all 或加入 /*+ gather_plan_statistics */ hint 并在使用DBMS_XPLAN.DISPLAY_CURSOR时加入 format=>‘allstats last’ 才能得到 A-rows等实际值;

SQL Monitor

  • 准确显示各个步骤实际执行效果;
  • 真实的执行计划;
  • 执行超过5秒或使用并行会自动保存,否则需要加 monitor 的 hint;
  • 推荐使用

第三方工具

  • 未必是真实的执行计划;

DBMS_XPLAN的使用:select * from table(dbms_xplan.***);
这里给出了DBMS_XPLAN包中的五种方法的用途及数据源,具体使用及参数详见官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_XPLAN.html

方法 使用 数据源
DISPLAY explain plan plan_table
DISPLAY_CURSOR real plan share pool 中的游标缓存
DISPLAY_AWR history AWR 仓库基表 WRH$_SQL_PLAN
DISPLAY_SQLSET SQL Tuning Set SQL Set 视图
DISPLAY_SQL_PLAN_BASELINE SQLPLAN Baseline SQL 执行计划基准库

如何阅读执行计划?

执行计划的月度顺序

  • 先子后父,先上后下
  • 由上至下,从右向左

标量子查询例外,它在主SELECT的后面执行,却显示在上面。

两种说法,意思是一样的。关键是要多看、多思考、多练习、多总结。
示例:
执行计划示例1 执行顺序:3 - 4 - 2 - 1 - 0