ITPub博客

首页 > Linux操作系统 > Linux操作系统 > sqlplus下看执行计划的两种方法

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

原创 Linux操作系统 作者:babylonia 时间:2009-06-15 11:25:13 0 删除 编辑
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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-31

  • 博文量
    44
  • 访问量
    41333