sql tuning (three utilities)

1. using the explain plan

   The EXPLAIN PLAN tool is great for this experimentation, as it immediately lets you know how
   the query will perform. with each change in the code. Because the utility gives you the
   execution plan without executing the code, you save yourself from having to run untuned
   software to see whether the changes were beneficial or not.
   
   SQL> EXPLAIN PLAN
  2  SET statement_id = 'test1'
  3  INTO plan_table
  4  FOR select p.product_id,i.quantity_on_hand
  5  FROM oe.inventories i,
  6  oe.product_descriptions p,
  7  oe.warehouses w
  8  WHERE p.product_id=i.product_id
  9  AND i.quantity_on_hand > 250
 10  AND w.warehouse_id = i.warehouse_id;
Explained.
SQL>
  
SQL> SET LINESIZE 130
SQL> SET PAGESIZE 0
SQL> SELECT * FROM table (DBMS_XPLAN.DISPLAY);
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |    1  |  37   | 3      (0) | 00:00:01 |
|*  1 |  TABLE ACCESS FULL| PERSONS |    1  |  37   | 3      (0) | 00:00:01 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id) :
______________________________________________
-  filter ("ENAME" LIKE '%ALAPATI%' AND "CREATED_DATE">SYSDATE@!-30)

13 rows selected.
SQL>
  
  
  
2. autotrace
The Autotrace facility enables you to produce EXPLAIN PLANs automatically when you execute a
SQL statement in SQL*Plus

 
  SQL> @ORACLE_HOME/sqlplus/admin/plustrce.sql
SQL> DROP ROLE plustrace;
drop role plustrace
          *
ERROR at line 1:
ORA-01919: role 'PLUSTRACE' does not exist
SQL> CREATE ROLE plustrace;
Role created.
SQL>
SQL> GRANT SELECT ON v_$sesstat TO plustrace;
Grant succeeded.
SQL> GRANT SELECT ON v_$statname TO plustrace;
Grant succeeded.
SQL> GRANT SELECT ON v_$mystat TO plustrace;
Grant succeeded.
SQL> GRANT plustrace TO dba WITH ADMIN OPTION;
Grant succeeded.
SQL>
 
SQL> GRANT plustrace TO salapati;
Grant succeeded.
SQL>

#

SET AUTOTRACE ON EXPLAIN: This generates the execution plan only and doesn't execute the query itself.
#
SET AUTOTRACE ON STATISTICS: This shows only the execution statistics for the SQL statement.
#
SET AUTOTRACE ON: This shows both the execution plan and the SQL statement execution statistics

SQL> SET AUTOTRACE ON;
SQL> SELECT * FROM EMP;
no rows selected
Execution Plan
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=74)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=1 Bytes=74)
Statistics
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        511  bytes sent via SQL*Net to client
        368  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed
SQL>


3. Using SQL Trace and TKPROF

SQL Trace is an Oracle utility that helps you trace the execution of SQL statements.
TKPROF is another Oracle utility that helps you format the trace files output by SQL
Trace into a readable form. Although the EXPLAIN PLAN facility gives you the expected
execution plan, the SQL Trace tool gives you the actual execution results of a SQL query.
Sometimes, you may not be able to identify the exact code, say, for dynamically generated SQL.
SQL Trace files can capture the SQL for dynamic SQL.

The Top Part of the TKPROF-Formatted Trace File
Image from book

TKPROF: Release 11.1.0.6.0 - Production on Mon Apr 28 12:49:38 2008

Copyright (c) 1982, 2007, Oracle.  All rights reserved.
Trace file: finance_ora_16340.trc
Sort options: default
********************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
********************************************************************************

Image from book

Each TKPROF report shows the following information for each SQL statement issued during the time the user's session was traced:

The SQL statement
Counts of parse, execute, and fetch (for SELECT statements) calls
Count of rows processed
CPU seconds used
I/O used
Library cache misses

Optional execution plan

Row-source operation listing

A report summary analyzing how many similar and distinct statements were found in the trace file

Let's analyze the formatted output created by TKPROF. Listing 19-12 shows the parts of the TKPROF output showing the parse, execute, and fetch counts.

Listing 19-12: The Parse, Execute, and Fetch Counts

SQL> select e.last_name,e.first_name,d.department_name
     from teste e,testd d
     where e.department_id=d.department_id;
call     count   cpu elapsed disk      query    current         rows
------- ------  ------ ---------- -- ---------- ----------   --------
Parse        1  0.00   0.00   0          0          0            0
Execute      1  0.00   0.00   0          0          0            0
Fetch    17322  1.82   1.85   3        136          5       259806
------- ------  -------- -------- -- ---------- ---------- ----------
total    17324  1.82   1.85   3        136          5       259806

Misses in library cache during parse: 0
Optimizer goal: CHOOSE
Parsing user id: 53

In Listing 19-12


    CPU stands for total CPU time in seconds.

    Elapsed is the total time elapsed in seconds.

    Disk denotes total physical reads.

    Query is the number of consistent buffer gets.

    Current is the number of database block gets.

    Rows is the total number of rows processed for each type of call.

From Listing 19-12, you can draw the following conclusions:

1 The SQL statement shown previously was parsed once, so a parsed version wasn't available
  in the shared pool before execution. The Parse column shows that this operation took less
  than 0.01 seconds. Note that the lack of disk I/Os and buffer gets indicates that there
  were no data dictionary cache misses during the parse operation. If the Parse column showed a
  large number for the same statement, it would be an indicator that bind variables weren't
  being used.

2 The statement was executed once and execution took less than 0.01 seconds. Again, there were no
  disk I/Os or buffer gets during the execution phase.

3 It took me a lot longer than 0.01 seconds to get the results of the SELECT statement back.
  The Fetch column answers this question of why that should be: it shows that the operation
  was performed 17,324 times and took up 1.82 seconds of CPU time.
 
4 The Fetch operation was performed 17,324 times and fetched 259,806 rows. Because the number
  of rows is far greater than the number of fetches, you can deduce that Oracle used array fetch
  operations.

5 There were three physical reads during the fetch operation. If there's a large difference
  between CPU time and elapsed time, it can be attributed to time taken up by disk reads.
  In this case, the physical I/O has a value of only 3, and it matches the insignificant gap
  between CPU time and elapsed time. The fetch required 136 buffer gets in the consistent mode
  and only 5 DB block gets.

6 The CBO was being used, because the optimizer goal is shown as CHOOSE.


SQL> ALTER SESSION SET sql_trace=true;
Session altered.
SQL>
 
or

SQL> EXECUTE sys.dbms_session.set_sql_trace(true);
PL/SQL procedure successfully completed.
SQL>

The recommended way is to use the DBMS_MONITOR package to trace a session. Regardless of the method
you use, once you start tracing a session, all statements are traced until you use the ALTER
SESSION statement or the DBMS_SESSION package to turn tracing off (replace true with false in
either of the preceding statements). Alternatively, when the user logs off, tracing is
automatically stopped for that user.

select sid,serial# from v$session
      where username = 'SH'

exec dbms_monitor.session_trace_enable  ( session_id =>145, serial_num => 4204, waits => true, binds => true);

show parameter user_dump_dest

cd $ORACLE_BASE/admin/orcl/udump

tkprof monitor.txt sys=no
 

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

转载于:http://blog.itpub.net/7336830/viewspace-697906/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值