Benchmark Query di SQL*Plus

Ada kalanya pada saat query di SQL*Plus koq bisa-bisanya hari ini performance-nya mendadak letoy padahal perasaan logikanya udah bener deh. Kalo pake perasaan mah agak susah ngukurnya. Salah satu cara jadul yang sudah merupakan rahasia turun-temurun adalah melakukan benchmark. Cara yang saya lakukan adalah sebagai berikut :

  • Connect ke database dengan SQL*Plus :
    [topan@isengard ]$ $ORACLE_HOME/bin/sqlplus system/<password>@<connect_string>
    
    SQL*Plus: Release 9.2.0.4.0 - Production on Thu Dec 18 09:34:47 2008
    
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    
    
    Connected to:
    Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
    With the Partitioning, OLAP and Oracle Data Mining options
    JServer Release 9.2.0.1.0 - Production
    
    SQL>
    
  • Jalankan utlxplan.sql yang terdapat di folder $ORACLE_HOME/rdbms/admin :
    SQL> set echo on
    SQL> @utlxplan.sql
    SQL> rem
    SQL> rem $Header: utlxplan.sql 29-oct-2001.20:28:58 mzait Exp $ xplainpl.sql
    SQL> rem
    SQL> Rem Copyright (c) 1988, 2001, Oracle Corporation.  All rights reserved.
    SQL> Rem NAME
    SQL> REM    UTLXPLAN.SQL
    SQL> Rem  FUNCTION
    SQL> Rem  NOTES
    SQL> Rem  MODIFIED
    SQL> Rem     mzait      10/26/01  - add keys and filter predicates to the plan table
    SQL> Rem     ddas       05/05/00  - increase length of options column
    SQL> Rem     ddas       04/17/00  - add CPU, I/O cost, temp_space columns
    SQL> Rem     mzait      02/19/98 -  add distribution method column
    SQL> Rem     ddas       05/17/96 -  change search_columns to number
    SQL> Rem     achaudhr   07/23/95 -  PTI: Add columns partition_{start, stop, id}
    SQL> Rem     glumpkin   08/25/94 -  new optimizer fields
    SQL> Rem     jcohen     11/05/93 -  merge changes from branch 1.1.710.1 - 9/24
    SQL> Rem     jcohen     09/24/93 - #163783 add optimizer column
    SQL> Rem     glumpkin   10/25/92 -  Renamed from XPLAINPL.SQL
    SQL> Rem     jcohen     05/22/92 - #79645 - set node width to 128 (M_XDBI in gendef)
    SQL> Rem     rlim       04/29/91 -         change char to varchar2
    SQL> Rem   Peeler     10/19/88 - Creation
    SQL> Rem
    SQL> Rem This is the format for the table that is used by the EXPLAIN PLAN
    SQL> Rem statement.  The explain statement requires the presence of this
    SQL> Rem table in order to store the descriptions of the row sources.
    SQL>
    SQL> create table PLAN_TABLE (
     2          statement_id    varchar2(30),
     3          timestamp       date,
     4          remarks         varchar2(80),
     5          operation       varchar2(30),
     6          options         varchar2(255),
     7          object_node     varchar2(128),
     8          object_owner    varchar2(30),
     9          object_name     varchar2(30),
    10          object_instance numeric,
    11          object_type     varchar2(30),
    12          optimizer       varchar2(255),
    13          search_columns  number,
    14          id              numeric,
    15          parent_id       numeric,
    16          position        numeric,
    17          cost            numeric,
    18          cardinality     numeric,
    19          bytes           numeric,
    20          other_tag       varchar2(255),
    21          partition_start varchar2(255),
    22          partition_stop  varchar2(255),
    23          partition_id    numeric,
    24          other           long,
    25          distribution    varchar2(30),
    26          cpu_cost        numeric,
    27          io_cost         numeric,
    28          temp_space      numeric,
    29          access_predicates varchar2(4000),
    30          filter_predicates varchar2(4000));
    
    Table created.
    
  • Agar schema lain dapat mengakses PLAN_TABLE tanpa harus menggunakan prefix nama schema SYSTEM jalankan perintah berikut :
    SQL> create public synonym PLAN_TABLE for PLAN_TABLE;
    
    Synonym created.
    
  • Beri hak akses agar semua schema bisa menggunakannya :
    SQL> grant all on PLAN_TABLE to public;
    
    Grant succeeded.
    
  • Sekarang login sebagai SYSDBA :
    SQL> CONNECT sys/<password>@<connect_string> AS sysdba
    Connected.
    
  • Jalankan plustrce.sql yang terdapat di folder $ORACLE_HOME/sqlplus/admin :
    SQL> @plustrce.sql
    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> 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.
    
  • Beri hak akses agar semua schema bisa menggunakannya :
    SQL> grant all on PLUSTRACE to public;
    SQL> grant PLUSTRACE to public;
    
    Grant succeeded.
    
  • Login sebagai SCOTT dan coba benchmark beberapa query berbeda :
    SQL> CONNECT scott/tiger@<connect_string>
    Connected.
    SQL> set autotrace traceonly
    SQL> select * from emp,dept
     2  where emp.deptno=dept.deptno;
    
    14 rows selected.
    
    
    Execution Plan
    ----------------------------------------------------------
      0      SELECT STATEMENT Optimizer=CHOOSE
      1    0   NESTED LOOPS
      2    1     TABLE ACCESS (FULL) OF 'EMP'
      3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
      4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
    
    
    
    
    Statistics
    ----------------------------------------------------------
           238  recursive calls
             0  db block gets
            60  consistent gets
             5  physical reads
             0  redo size
          1595  bytes sent via SQL*Net to client
           495  bytes received via SQL*Net from client
             2  SQL*Net roundtrips to/from client
             4  sorts (memory)
             0  sorts (disk)
            14  rows processed
    
    SQL> select EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,emp.DEPTNO from emp,dept
     2  where emp.deptno=dept.deptno;
    
    14 rows selected.
    
    
    Execution Plan
    ----------------------------------------------------------
      0      SELECT STATEMENT Optimizer=CHOOSE
      1    0   NESTED LOOPS
      2    1     TABLE ACCESS (FULL) OF 'EMP'
      3    1     INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
    
    
    
    
    Statistics
    ----------------------------------------------------------
             0  recursive calls
             0  db block gets
             6  consistent gets
             2  physical reads
             0  redo size
          1198  bytes sent via SQL*Net to client
           495  bytes received via SQL*Net from client
             2  SQL*Net roundtrips to/from client
             0  sorts (memory)
             0  sorts (disk)
            14  rows processed
           
    SQL> set autotrace off
    

Untuk informasi lebih lanjut bisa mengacu ke dokumentasi Oracle yang terdapat DISINI. Khusus untuk topik ini bisa dibaca DISINI.

Syndicate content