sqlplus下看执行计划的两种方法

SQL> connect /as sysdba
SQL> @?/rdbms/admin/utlxplan.sql  --建立plan_table表
SQL> create public synonym plan_table for plan_table;
SQL> grant all on plan_table to public;
SQL> @?/sqlplus/admin/plustrce.sql  --建立plustrace角色
SQL> grant plustrace to public;

在有了plan_table表和plustrace角色的情况下:

1、先explain plan for sql_stmt;
把SQLPLUS的linesize参数调整到至少120,把pagesize值调到可以一页显示完整信息;
然后 @?/rdbms/admin/utlxplp 或 select * from table(dbms_xplan.display()); 看执行计划,如:
explain plan for sql_stmt;
set autot off
set hea off
set lines 150
set pages 0
select * from table(dbms_xplan.display);

2、先 set autotrace on 然后直接执行sql_stmt;会自动显示执行计划和统计信息。
缺点:用该方法查看执行时间较长的sql语句时,需要等待该语句执行成功后,才返回执行计划,使优化的周期大大增长。
如果不想执行语句而只是想得到执行计划可以采?set autotrace traceonly 这样,就只会列出执行计划,而不会真正的执行语句,大大减少了优化时间。虽然也列出了统计信息,但是因为没有执行语句,所以该统计信息没有用处。
set autotrace 选项
on       显示查询结果,执行计划,统计 数据
on statistics 显示查询结果,统计数据,不显示执行计划
on explain   显示查询结果,执行计划,不显示统计数据
traceonly   显示执行计划和统计结果,但不包括查询结果
traceonly statistics 仅显示统计数据

--统计信息的各个参数的意思:
statistics

---------------------------------------------------------

     10  recursive calls

     33  db block gets

  11244060  consistent gets

   330674  physical reads

     68  redo size

132579265  bytes sent via SQL*Net to client

  2147396  bytes received via SQL*Net from client

   58033  SQL*Net roundtrips to/from client

     4  sorts (memory)

     1  sorts (disk)

   870466  rows processed


recursive Calls. 在用户级和系统级产生的递归调用的数目。Oracle 数据库维护用于内部处理的表。当它需要改变那些表时,Oracle数据库生成一个内部SQL语句,该语句反过来产生一个递归调用。简而言之,因此,如果你必须解析该查询,例如,你可能必须运行一些其他的查询来得到数据字典的信息。这就是递归调用。空间管理、 安全性检查、从SQL中调用PL/SQL,所有这些都会引起递归SQL调用。

db block gets. 当前块被请求的次数。当存在时,当前(current)模式块将被立即检索,而不会以一致读的方式检索。通常,查询检索的块如果在查询开始时存在,它们就被检索。当前模式块如果存在就立即被检索,而不是从一个以前的时间点检索。在一个SELECT期间,你可以看到当前模式检索,因为对于需要进行全面扫描的表来说,需要读数据字典来找到范围信息(因为你需要"立即"信息,而不是一致读)。在修改期间,为了向块中写入内容,你要以当前模式访问块。

consistent gets. 对于一个块一致读被请求的次数。这是你以"一致读"模式处理的块数。为了回滚一个块,这将包括从回滚段读取的块的数目。例如,这是你在SELECT语句中读取块的模式。当你进行一个指定的UPDATE/DELETE操作时,你也以一致读模式读取块,然后以当前模式获得块以便实际进行修改。

physical Reads. 从 磁盘读取的数据块的总数。这个数等于"physical reads direct"(物理上直接读取的块数)的值加上读入缓存区的所有块数。

redo Size. 所产生的以字节为单位的redo(重做日志)总数。

bytes Sent via SQL*Net to Client. 从前台进程发送到客户端的字节总数。一般来说,这是你的结果集的整体大小。

bytes Received via SQL*Net from Client. 通过网络从客户端收到的字节总数。一般来说,这是通过网络传输的你的查询的大小。

SQL*Net Round-trips to/from Client. 发送到客户端和从客户端接收的网络消息总数。一般来说,这是为了得到回答在你和 服务器间发生的交互次数。当你在SQL*Plus中增加ARRAYSIZE 设置值时,你将看到对于返回多条记录的SELECT语句,这个数字会下降(更少的来回交互,因为每获取N条记录是一个来回)。当你减少你的 ARRAYSIZE值时,你将看到这个数字增加。

sorts (memory). 完全在内存中执行、且不需要任何磁盘写的排序操作的数目。没有比在内存中排序更好的排序了,除非根本没有排序。排序通常是由表连接SQL操作的选择条件设定所引起的。

sorts (disk). 至少需要一次磁盘写的排序操作的次数。需要磁盘输入/输出的排序操作需要耗费大量资源。请试着增加初始化参数SORT_AREA_SIZE的大小。

rows Processed. 这是由SELECT语句所返回的或是由INSERT、UPDATE或DELETE语句修改的总行数。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12712263/viewspace-606381/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12712263/viewspace-606381/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值