有的时候,业务程序很长时间难以得到响应,甚至根本就无法正常响应,有可能是程序的问题,也有可能是数据库的sql语句的问题(在需要访问的数据量很大的情况下)也有可能是程序调用sql的时候的异常,咱们dba为了协助开发人员排查数据库的时候,需要查看咱们的存储过程或者单独使用过程中的sql语句的执行效率,此时我们就需要查看执行计划。
查看oracle的执行计划方法很多:
方法一,可以通过pl/sql软件里面的窗口,然后输入sql语句运行即可看到;
方法二,先执行SQL> explain plan for select count(*) from event_performance_last where city='beijing';
Explained.
再SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1592467753
--------------------------------------------------------------------------------
----------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
Time |
--------------------------------------------------------------------------------
----------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 9 | 29 (0)|
00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 9 | |
|
|* 2 | INDEX FAST FULL SCAN| IDX_EP_LAST_CITY | 9589 | 86301 | 29 (0)|
00:00:01 |
--------------------------------------------------------------------------------
----------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("CITY"='beijing')
14 rows selected.
便可以看到oracle的执行计划了。
方法三,使用autotrace,
1)先用sys用户运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql
输出如下:
set echo on
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$session to plustrace;
grant plustrace to dba with admin option;
set echo off
2)产生plustrace角色,然后在sys用户下把此角色赋予需要使用autotrace查看执行计划的用户
SQL> grant plustrace to its;
3)然后使用当前用户(即授予查看执行计划的普通用户,如its)运行/ORACLE_HOME/rdbms/admin/utlxplan.sql,创建一个plan_table,用来存储分析sql语句的结果;
输出如下:
表已创建
表的内容如下:
create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id 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));
4)最后使用当前普通用户在sqlplus中执行
set time on; (说明:打开时间显示)
set autotrace on; (说明:打开自动分析统计,并显示SQL语句的运行结果)
set autotrace traceonly; (说明:打开自动分析统计,不显示SQL语句的运行结果)
5)最后在sqlplus中执行你需要查看执行计划的sql,就可输出该语句的执行计划。
eg:
SQL> select count(*) from event_performance_last where city='dalian';
COUNT(*)
----------
1584
Execution Plan
----------------------------------------------------------
Plan hash value: 2372559996
--------------------------------------------------------------------------------
------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
------
| 0 | SELECT STATEMENT | | 1 | 9 | 7 (0)| 00:0
0:01 |
| 1 | SORT AGGREGATE | | 1 | 9 | |
|
|* 2 | INDEX RANGE SCAN| IDX_EP_LAST_CITY | 1593 | 14337 | 7 (0)| 00:0
0:01 |
--------------------------------------------------------------------------------
------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CITY"='dalian')
Statistics
----------------------------------------------------------
304 recursive calls
0 db block gets
114 consistent gets
8 physical reads
0 redo size
527 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
1 rows processed
6)要关闭以上功能,只用当前普通用户在sqlplus中运行
set time off; (说明:关闭时间显示)
set autotrace off; (说明:关闭自动分析统计)
查看oracle的执行计划方法很多:
方法一,可以通过pl/sql软件里面的窗口,然后输入sql语句运行即可看到;
方法二,先执行SQL> explain plan for select count(*) from event_performance_last where city='beijing';
Explained.
再SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1592467753
--------------------------------------------------------------------------------
----------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
Time |
--------------------------------------------------------------------------------
----------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 9 | 29 (0)|
00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 9 | |
|
|* 2 | INDEX FAST FULL SCAN| IDX_EP_LAST_CITY | 9589 | 86301 | 29 (0)|
00:00:01 |
--------------------------------------------------------------------------------
----------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("CITY"='beijing')
14 rows selected.
便可以看到oracle的执行计划了。
方法三,使用autotrace,
1)先用sys用户运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql
输出如下:
set echo on
drop role plustrace;
create role plustrace;
grant select on v_$sesstat to plustrace;
grant select on v_$statname to plustrace;
grant select on v_$session to plustrace;
grant plustrace to dba with admin option;
set echo off
2)产生plustrace角色,然后在sys用户下把此角色赋予需要使用autotrace查看执行计划的用户
SQL> grant plustrace to its;
3)然后使用当前用户(即授予查看执行计划的普通用户,如its)运行/ORACLE_HOME/rdbms/admin/utlxplan.sql,创建一个plan_table,用来存储分析sql语句的结果;
输出如下:
表已创建
表的内容如下:
create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),
options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id 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));
4)最后使用当前普通用户在sqlplus中执行
set time on; (说明:打开时间显示)
set autotrace on; (说明:打开自动分析统计,并显示SQL语句的运行结果)
set autotrace traceonly; (说明:打开自动分析统计,不显示SQL语句的运行结果)
5)最后在sqlplus中执行你需要查看执行计划的sql,就可输出该语句的执行计划。
eg:
SQL> select count(*) from event_performance_last where city='dalian';
COUNT(*)
----------
1584
Execution Plan
----------------------------------------------------------
Plan hash value: 2372559996
--------------------------------------------------------------------------------
------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
------
| 0 | SELECT STATEMENT | | 1 | 9 | 7 (0)| 00:0
0:01 |
| 1 | SORT AGGREGATE | | 1 | 9 | |
|
|* 2 | INDEX RANGE SCAN| IDX_EP_LAST_CITY | 1593 | 14337 | 7 (0)| 00:0
0:01 |
--------------------------------------------------------------------------------
------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("CITY"='dalian')
Statistics
----------------------------------------------------------
304 recursive calls
0 db block gets
114 consistent gets
8 physical reads
0 redo size
527 bytes sent via SQL*Net to client
520 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
1 rows processed
6)要关闭以上功能,只用当前普通用户在sqlplus中运行
set time off; (说明:关闭时间显示)
set autotrace off; (说明:关闭自动分析统计)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23502881/viewspace-705265/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23502881/viewspace-705265/