重庆思庄Oracle、Redhat认证学习论坛

标题: 查看ORACLE SQL语句的执行计划有哪些方法? [打印本页]

作者: 郑全    时间: 2020-3-10 22:39
标题: 查看ORACLE SQL语句的执行计划有哪些方法?
我们在执行一条SQL语句时,发现语句很慢,这个语句到底是怎么执行的呢?
有什么办法看到这个语句的执行路径呢,也即SQL语句的执行计划?

比如:
      select employee_id,last_name,d.department_id,d.department_name
          from employees e ,departments d
          where e.department_id=d.department_id
          and d.department_id=80;

如何看它的执行计划呢 ?


作者: 郑全    时间: 2020-3-11 00:38
第一个获取执行计划的方法是 我们平时上课用的比较多的一个方法:
   1.先用 EXPLAIN PLAN FOR sql statement,往PLAN_TABLE里面插入计划数据
   2.再用SELECT * FROM TABLE(dbms_xplan.display()),提取

   这种方法SQL语句并不真实执行,
一般适用于

上线前的SQL预审,尤其对DML语句,由于SQL不执行,不用担心对生产数据造成影响
。这种方法查看的执行计划

有Predicate Information,无Statistics,查看到的执行计划不一定真实。

具体执行:
SQL>  explain plan
  2     for
  3      select e.employee_id,e.last_name,d.department_name
  4         from employees e, departments d
  5            where e.department_id=d.department_id
  6          and d.department_id=20;
Explained.




SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1475904561

----------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |                   |     2 |    62 |     2   (0)| 00:00:01 |
|   1 |  NESTED LOOPS                        |                   |     2 |    62 |     2   (0)| 00:00:01 |
|   2 |   TABLE ACCESS BY INDEX ROWID        | DEPARTMENTS       |     1 |    16 |     1   (0)| 00:00:01 |
|*  3 |    INDEX UNIQUE SCAN                 | DEPT_ID_PK        |     1 |       |     0   (0)| 00:00:01 |
|   4 |   TABLE ACCESS BY INDEX ROWID BATCHED| EMPLOYEES         |     2 |    30 |     1   (0)| 00:00:01 |
|*  5 |    INDEX RANGE SCAN                  | EMP_DEPARTMENT_IX |     2 |       |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("D"."DEPARTMENT_ID"=20)
   5 - access("DEPARTMENT_ID"=20)

18 rows selected.


作者: 郑全    时间: 2020-3-11 00:44
第二种,通过PLSQL DEVELOPER 的按F5 提取执行计划,原理和第一种一样,并不真正执行SQL