一、EXPLAIN PLAN:
目的是给出一个特定SQL的查询计划。Oracle查询计划可以在逻辑上分析SQL语句的优劣。
安装:
1、sqlplus " / as sysdba"
2、@$ORACLE_HOME/rdbms/admin/utlxplan.sql
3、create public synonym plan_table for plan_table;
4、grant select ,insert,update ,delete on plan_table to public
注:这里没有考虑安全性,plan_table对所有人都开发了增删改查权限,如果需要有安全性,可以针对某一个USER创建一个plan_table;
5、分析sql语句:(可以先select * from plan_table看看)
以oracle的scott用户登录(这个用户是被锁定的,使用前使用alter user scott account unlock;解锁)。
SQL> explain plan for SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno AND empno = 7782;
6、查看执行计划:
SQL> set linesize 700
SQL> @$ORACLE_HOME/rdbms/admin/utlxpls.sql (或者使用select * from table(dbms_xplan.display);可以出来一样的效果)
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 117 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 1 | 117 | 3 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 87 | 2 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | PK_EMP | 1 | | 1 (0)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID| DEPT | 409 | 12270 | 1 (0)| 00:00:01 |
|* 5 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
注意看Operation的“缩进”。这个语句被解析成一棵“树”。这课树大约是
1
/ \
2 4
/ \
3 5
上面的数字,和PLAN_TABLE_OUTPUT中的“Id”是对应的。简单来说,就是这个语句有2,4构成;2又由3构成;4由5构成。
详细的SQL查询计划可以参阅其他书籍,作为初学者可以仅仅关注一下报告中的“TABLE ACCESS FULL”。
如果你有where子句还有这个TABLE ACCESS FULL出现,表明你缺少索引(这仅仅针对初学者,但是现实生活中却也能解决60-70%的问题)。