1.什么叫做执行计划?一个SQL语句表示你想要从中得到的结果,但是数据库服务器收到这条SQL的时候,一开始并不是马上解析它,如果这条SQL没有语法错误,数据库服务器才会继续工作,并且选择最好的计算方式,如果你是查询一张表的话,服务器会选择一下是读取整张表呢还是利用索引,那种执行效率好就会选择哪种!最终SQL语句被物理性执行的方法被称作执行计划!
一个执行计划由若干基本操作组成,负责处理或计算出最优的执行计划的DB 组件叫做优化器,优化器是建立在其所在的DB资源的基础上进行工作的。
数据库服务器在执行SQL语句之前会定制几套执行计划!看哪个执行计划消耗的系统资源少就用哪套执行计划!被数据库服务器执行的那套执行计划就叫做SQL语句的执行计划!
2.不借助第三方工具,怎样查看SQL的执行计划?
首先,创建一个叫做Plustrace的角色,具体创建过程如下:
因为我的装在E盘下,所以在路径E:\oracle\product\10.1.0\Db_1\sqlplus\admin的目录下找到plustrce.sql文件,文件内容自己可以以记事本的方式打开看。然后以员的身份登录到SQL命令窗口,在命令窗口运行该文件 SQL> @ E:\oracle\product\10.1.0\Db_1\sqlplus\admin\plustrce.sql 效果如下:
SQL> drop role plustrace;
角色已删除。
SQL> create role plustrace;
角色已创建。
SQL>
SQL> grant select on v_$sesstat to plustrace;
授权成功。
SQL> grant select on v_$statname to plustrace;
授权成功。
SQL> grant select on v_$mystat to plustrace;
授权成功。
SQL> grant plustrace to dba with admin option;
授权成功。
SQL>
SQL> set echo off
当然,你可以将该角色的权限授予给其他用户
其次,创建一个plan_table表,用来存储分析SQL语句的结果,可以在路径 E:\oracle\product\10.1.0\Db_1\RDBMS\ADMIN下找到 utlxplan.sql,这个文件就是用来创建plan_table表的SQL语句。
create table PLAN_TABLE (
statement_id varchar2(30),
plan_id number,
timestamp date,
remarks varchar2(4000),
operation varchar2(30),
options varchar2(255),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_alias varchar2(65),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
depth numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30),
cpu_cost numeric,
io_cost numeric,
temp_space numeric,
access_predicates varchar2(4000),
filter_predicates varchar2(4000),
projection varchar2(4000),
time numeric,
qblock_name varchar2(30)
);
在SQL命令窗口中运行该文件 SQL> @ E:\oracle\product\10.1.0\Db_1\RDBMS\ADMIN\utlxplan.sql这样存储分析SQL语句结果的表就建成了。如果现在在SQL命令窗口中执行一条SQL语句的话,我们会发现还是看不到执行计划的!因为我们有几个回显参数没有设定!
set time on; (说明:打开时间显示)
set autotrace on; (说明:打开自动分析统计,并显示SQL语句的运行结果)
set autotrace traceonly; (说明:打开自动分析统计,不显示SQL语句的运行结果)
所以我们在SQL命令窗口 set autotrace on 或 set autotrace traceonly 时,我们才能看到SQL语句的执行计划和统计信息!
例如在我的system用户模式下有表员工表 e,我执行 SELECT * FROM SYSTEM.e ,将得到如下返回信息:
EID ENAME SEX ID
---------- ---------- ---------- ----------
001 赵1 男 yy
002 钱2 男 02
003 孙3 男 03
004 李4 女 04
005 周5 女 55
执行计划
----------------------------------------------------------
Plan hash value: 3822424092
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 185 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| E | 5 | 185 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
784 bytes sent via SQL*Net to client
373 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed