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;
sql优化的几种方式把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语句修改的总⾏
数。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。