oracle 培训 --sql 性能优化

207
ORACLE 培训 --SQL 性能优化 老方块内部培训班使用

Upload: kyrene

Post on 11-Jan-2016

287 views

Category:

Documents


0 download

DESCRIPTION

ORACLE 培训 --SQL 性能优化. 老方块内部培训班使用. 内容概述. 课程主要讨论: SQL 语句执行的过程、 ORACLE 优化器 ,表之间的关联,如何得到 SQL 执行计划,如何分析执 行计划等内容,从而由浅到深的方式了解 SQL 优化的过 程,使大家逐步掌握 SQL 优化。. 目录. 优化基础知识 性能调整综述 有效的应用设计 SQL 语句的处理过程 Oracle 的优化器 Oracle 的执行计划 注意事项. 一、优化基础知识. 概述. 性能管理 性能问题 调整的方法 SQL 优化机制 应用的调整 - PowerPoint PPT Presentation

TRANSCRIPT

  • ORACLE--SQL

  • SQLORACLESQLSQLSQL

  • SQL Oracle Oracle

  • SQLSQLSQLSQLSQLOracle SQL Tunning TipsTools

  • 80/20

  • SQL

    SQLSQLSQLSQL

    * SQLSQL SQLSQL SQL

    * SQLSQLSQL CBO

  • * SQL *

    2. * * *

    3. * I/O * SWAP * Parameters

    Oracle SQL

  • SQLI/O

  • SQL

    OracleSQL

    SQL

  • SQLSQLHINTSQL

  • SQLCPU

  • SQL ORACLESQL(shared buffer pool)SQL(),, ORACLE . SQL

  • SQLSQLOracleSQLSGA(systemglobal area)(shared buffer poo1)SQL()OracleOracleSQLOracle(cache bufferiIlg)OracleSQLOracle

  • SQL

    SQL(bind variables)

  • SQLOracleSQL() SELECT * FROM ATABLESQLSELECT *from ATABLESelect * From Atable SQLSQL select pinname from people where pin = blk1.pinselect pinname from people where pin =blk1.pin select pinname from people where pin =blk1.ot_jndselect pinname from people where pin = blk1.ov_jnd

  • SQLSQL

  • Sql

  • SQL PARSESQLOraclesql1Create a Cursor 2Parse the Statement 3Describe Results of a Query 4Define Output of a Query 5Bind Any Variables 6Parallelize the Statement 7Run the Statement 8Fetch Rows of a Query 9Close the Cursor

  • bind variables?:SELECT * FROM USER_FILES WHERE USER_NO = 10001234; SELECT * FROM USER_FILES WHERE USER_NO = 10004321;

    select name,executionsfrom v$db_object_cachewhere name like 'select * from user_files%'

  • SHARE POOL CPU

    select * from dConMsg where contract_no = 32013484095139

  • sprintf(sqlstr, "insert into scott.test1 (num1, num2) values (%d,%d)",n_var1, n_var2);

    EXEC SQL EXECUTE IMMEDIATE :sqlstr ;EXEC SQL COMMIT;

    strcpy(sqlstr, "insert into test (num1, num2) values (:v1, :v2)");EXEC SQL PREPARE sql_stmt FROM :sqlstr;EXEC SQL EXECUTE sql_stmt USING :n_var1, :n_var2;EXEC SQL COMMIT;

  • 1cursor_sharing force similar

    2> <

  • SQLSQL

  • (PARSE)SQLSQL(MERGE)

  • (BIND)SQL ()

  • (EXECUTE)SQL I/O

    (FETCH) ARRAY FETCH

  • SQL

  • ORACLE Oracle3RULE ()COST()CHOOSE() OPTIMIZER_ MODERULECOSTCHOOSEALL_ ROWSFIRST_ ROWSSQL

    (CBOCostBased Optimizer)analyze(object statistics) analyzeanalyzeCBORULEOracleCHOOSECHOOSE

  • Oracle(database block)

    ROWIDROWIDROWIDOracle(ROWID) ROWID

  • CPU,RAM,;OS,ORACLE;SQLsql

  • SQL Tunning SQL: insert, update, delete, select;select

  • SQLIOoracleFULL TABLE SCANsqlsql

  • OracleSQL

    PCTFREEPCTUSEDtruncate tabledelete

    OLTP

  • *select count(key)fromtab where key> 0select count(*)from tab

    CPUorunion allOracle

    commitalter tablecache

    OracleSQLexecutedbms_sql

  • ** SQL Tunning Tips **

  • sql SQLSQLSQLSQL

    OracleSQLwhereSQLSQLSQL

  • sql SQLSQL

    SQLSQL

  • Tunning Tip1.Oracle

    2. 3.

    4.

  • 1.Oracle

  • select from user_files uf, df_money_files dm, cw_charge_record ccwhere uf.user_no = dm.user_noand dm.user_no = cc.user_noand and not exists(select )

    ???

  • * SELECTCOLUMN,SQL * .,. ,ORACLE, * , ,

  • DISTINCT,UNION,MINUS,INTERSECT,ORDER BYSQLSQL(SORT). DISTINCT, .

    ,UNION,GROUP BY, GROUP BY(NESTED SORT) ; , , UNION, (SORT UNIQUE). .

    , UNION, MINUS , INTERSECTSQL.

  • :

    : SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO

    : SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT X FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);EXISTSDISTINCT

  • UNION-ALL UNION ( if possible)SQLUNION,UNION-ALL, .

    : SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95 UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95 UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = 31-DEC-95

  • 2.

  • ORACLE

    :SELECT ENAMEFROM EMPWHERE EMPNO = 2326 AND DEPTNO = 20 ;

    EMPNOEMPNOTABLE ACCESS BY ROWID ON EMP INDEX UNIQUE SCAN ON EMP_NO_IDX

  • , (leading column)where,.

    SQL> create table multiindexusage ( inda number , indb number , descr varchar2(10));Table created.SQL> create index multindex on multiindexusage(inda,indb);Index created.SQL> set autotrace traceonlySQL> select * from multiindexusage where inda = 1;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE' 2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE)SQL> select * from multiindexusage where indb = 1;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE' , ,

  • WHERE

    :

    SELECT FROM DEPTWHERE SAL * 12 > 25000;

    :SELECT FROM DEPTWHERE SAL > 25000/12;

  • WHERE, (WILDCARD), . SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE USER_NO LIKE '%109204421';

    ORACLE.

  • NOTNOT, NOT. ORACLENOT,.

    : : (,) SELECT FROM DEPT WHERE DEPT_CODE NOT = 0; : (,) SELECT FROM DEPT WHERE DEPT_CODE > 0;

  • IS NULLIS NOT NULLORACLE . .

    AB, A,B(123,null) , ORACLEA,B123,null(). ORACLE. 1000,!

    ,WHEREORACLE.

    whereis nullis not null

  • , ORACLE.

    EMP_TYPE.

    SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE USER_NO = 109204421

    ORACLE:SELECT USER_NO,USER_NAME,ADDRESSFROM USER_FILESWHERE TO_NUMBER(USER_NO) = 109204421

    , !

  • WHERE a.order_no = b.order_no

    WHERE TO_NUMBER (substr(a.order_no, instr(b.order_no, '.') - 1)

    = TO_NUMBER (substr(a.order_no, instr(b.order_no, '.') - 1)

  • 3.

  • SQL, ORACLE: SQL, , , . , , ORACLE.

  • DECODE: SELECT COUNT(*)SUM(SAL) FROMEMP WHERE DEPT_NO = 0020 AND ENAME LIKESMITH%; SELECT COUNT(*)SUM(SAL) FROMEMP WHERE DEPT_NO = 0030 AND ENAME LIKESMITH%;

    DECODE

    SELECT COUNT(DECODE(DEPT_NO,0020,X,NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,X,NULL)) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SALFROM EMP WHERE ENAME LIKE SMITH%;

  • SQL,.

    : SELECT TAB_NAME FROM TABLES WHERE TAB_NAME = ( SELECT TAB_NAME FROM TAB_COLUMNS WHERE VERSION = 604) ANDDB_VER= ( SELECT DB_VER FROM TAB_COLUMNS WHERE VERSION = 604) SELECT TAB_NAME FROM TABLES WHERE (TAB_NAME,DB_VER) = ( SELECT TAB_NAME,DB_VER) FROM TAB_COLUMNS WHERE VERSION = 604)

  • 4.

  • WHEREORACLEWHERE,, WHEREWHEREWHERE

    empWHEREselect * from emp e,dept d where d.deptno >10 and e.deptno =30 ;

    deptselect * from emp e,dept d where e.deptno =30 and d.deptno >10 ;

  • WHERE WHERE

  • Order by ORDER BYOracleOrder byOrder by

    order byorder byorder by

  • select * from employss where first_name||''||last_name ='Beill Cliton';

    last_name SQLOraclelast_name select * from employee where first_name ='Beill' and last_name ='Cliton';

  • %like %Oraclelast_name select * from employee where last_name like '%cliton%';

    select * from employee where last_name like 'c%';

  • WhereHAVINGHAVING, HAVING . ,. WHERE,.

    : : SELECT REGIONAVG(LOG_SIZE) FROM LOCATION GROUP BY REGION HAVING REGION REGION != SYDNEY AND REGION != PERTH SELECT REGIONAVG(LOG_SIZE) FROM LOCATION WHERE REGION REGION != SYDNEY AND REGION != PERTH GROUP BY REGION WHERE > GROUP > HAVING

  • NOT EXISTS NOT IN,NOT IN. ,NOT IN (). NOT EXISTS NOT EXISTSNOT INNOTNOT EXISTSNOT IN

    :1

    SELECT dname, deptno FROM dept WHERE deptno NOT IN (SELECT deptno FROM emp);

    2

    SELECT dname, deptno FROM dept WHERE NOT EXISTS (SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);

    211empfull table scan,1empindex where2emp

  • ,ORACLEB-tree. ,. ORACLEUpdate, ORACLE. . ,(primary key)

    , . ,, ,. ,. ,, , . INSERT , DELETE , UPDATE4 , 5 I/O . ,.

  • WHERE

    SELECT FROM DEPT WHERE SAL * 12 > 25000;

    : SELECT FROM DEPT WHERE SAL > 25000/12;

  • >= >DEPTNO

    :

    SELECT * FROM EMP WHERE DEPTNO >=4 :

    SELECT * FROM EMP WHERE DEPTNO >3

  • >=
  • "+" "+""=""+""+""+" not in

    select a.empno from emp a where a.empno not in

    (select empno from emp1 where job='SALE');

    :

    select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job='SALE';

    .

  • COMMIT COMMIT:

    . redo log buffer ORACLE3

  • TRUNCATEDELETE,, (rollback segments ) . COMMIT,ORACLE()

    TRUNCATE, .,.,.

  • , count(*) count(1) , ,. COUNT(EMPNO)

  • PHONE_NOCHAR,WHERE

    WHERE PHONE_NO=13920202022WHERE PHONE_NO=13920202022

  • EXPORTIMPORTBUFFER(10MB , 10,240,000)EXPORTIMPORT;

    ORACLE,,.,;

  • ** Tools **

  • SQL

    SQL

    ORACLE ORACLE

    ORACLE

  • OracleSQL,,(Optimizer)

    Oracle,(Rule-Based Optimization,RBO)(Cost-Based Optimization,CBO)

    ARBOSQL,Oracle ,where

    BCBO(Cost),Cpu,Oracle8,OracleCBO

    Oracle10g,RBO

  • Rule:

    Choose:Oracle,CBO,,,,,RBO

    First Rows:Choose,,,

    All Rows:all_rowsoracle,,.

    first_rows_n:first_rows_n.n1,10,100,1000first_rows(n) hint.nn,.

  • EXPLAIN PLAN SQLEXPLAIN PLAN SQL,SQL. ,ORACLE,().

    ,.

    EXPLAIN PLAN, , ,.

    NESTED LOOP, NESTED LOOP,.

  • Autotrace Current mode:Read-consistent mode: Physical block:8192Recursive calls:

  • TKPROF SQL trace SQL. ,.,CPU..

    SQL TRACE:

    ALTER SESSION SET SQL_TRACE TRUESQL TRACE , SQL_TRACEinit.oraTRUE, USER_DUMP_DEST

    TKPROFTRACE

  • SQLPLUS AUTOTRACE

    AUTOTRACE SET AUTOTRACE OFFAUTOTRACE. .SET AUTOTRACE ON EXPLAINAUTOTRACESET AUTOTRACE ON STATISTICSSQLAUTOTRACESET AUTOTRACE ONAUTOTRACESET AUTOTRACE TRACEONLYSET AUTOTRACE ON,

  • SQLPLUS AUTOTRACE1 PLUSTRACEpublicSql> @$ORACLE_HOME/sqlplus/admin/plustrce.sql

    2 Sql> grant plustrace to public;

    3SYSTEMPLAN_TABLE Sql> @$ORACLE_HOME/rdbms/admin/utlxplan.sqlSql> create public synonym plan_table for plan_table;Sql> grant all on plan_table to public;

    AUTOTRACE

  • SQL> select ename,dname from emp, dept where emp.deptno=dept.deptno and dept.dname in ('ACCOUNTING','RESEARCH','SALES','OPERATIONS'); 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) where

  • SQL Oracle Oracle

  • ? ?

  • . SQL. . /

  • DBA

  • (SGA)I/OOracle Oracle

  • :

  • :

  • I/O

  • I/O

    /20/8020%()80%

  • SQL

    SQL90%

  • OracleSQL

    Oracle

  • - - Oracle - Oracle - - -- -

  • SQL Oracle Oracle

  • 2(OLTP)(DSS)

    (OLTP) OLTPOTLP cluster

  • 2(OLTP)(DSS)(DSS) OLTP() OLTPcluster table OLAP

  • SQL Oracle Oracle

  • SQL1 2 DML(insert, update, delete) 3 DDL (create .. , drop .. , alter .. , ) 4 (commit, rollback)

  • sqlOraclesqlDEFINEFETCHSQL

  • DML Pro*CSQL

    EXEC SQL UPDATE employees SET salary = 1.10 * salary WHERE department_id = :var_department_id; var_department_idSQL

  • DML 1: Create a Cursor 2: Parse the Statement 5: Bind Any Variables 7: Run the Statement 9: Close the Cursor

    6: Parallelize the Statement

    3: Describe Results of a Query 4: Define Output of a Query 8: Fetch Rows of a Query

  • 1: (Create a Cursor) cursorSQLDML(pro*c)

    2:(Parse the Statement) SQLOracleSQLSQLSQL

  • SQL SQL *

  • SQLSQLSQL OracleSQLSQL(bind variable)SQLSQL SQLSQL()

  • SQL

    3: (Describe Results of a Query)

    4: (Define Output of a Query) Oracle

  • 5: (Bind Any Variables)OracleSQLOracle Oracledepartment_id(binding variables)Oracle OracleOracle oracleOracle Call Interface Programmer's Guide

  • 6: (Parallelize the Statement )ORACLE SELECTs, INSERTs, UPDATEs, MERGEs, DELETEsDDL(oracle server processes)SQLSQL7: (Run the Statement)OracleSQLSELECTINSERTUPDATEDELETE(array processing)NN

  • 8: (Fetch Rows of a Query)fetchfetch

    9: (Close the Cursor)SQL

  • DDL DDLDMLDDLDDL

  • () (one consistent change to the data)SQL

    Eg:()(SQL)(SQL)2 BEGIN_DISCRETE_TRANSACTIO

  • SQL Oracle Oracle

  • Oracle 2

  • -- Rule Based (Heuristic) Optimization(RBO) (Heuristic Approach)(Rules)where(where clause)(predicate=, >,
  • -- Rule Based (Heuristic) Optimization(RBO) 1) empemprowidrowidemp

    2) empdeptno = 10(50%)40005000008k4Gdb_file_multiblock_read_count200500000/db_file_multiblock_read_count=500000/200=2500I/Odeptnocache4000x 50% = 2000200099.9%20000I/O,2500

  • -- Cost Based Optimization(CBO) Oracle(Cost Engine)CBO

    3I/OCPUnetworkI/OSGAI/OCPU(sort)(join)CPU ()networknetwork

  • optimizer_modefirst_rows_[1 | 10 | 100 | 1000] | first_rows | all_rows | choose | rule RULERBO CHOOSECBORBO ALL_ROWSCBO FIRST_ROWS FIRST_ROWS_[1 | 10 | 100 | 1000] n ORACLE 9I

    show parameter OPTIMIZER_MODE

  • SQL Oracle Oracle

  • Oracle

  • SQLSELECT,INSERT,UPDATEDELETEOracleOracleOptimizer

  • Oracle

  • SQL SQL()ORACLESQLSGA(system global area)(shared buffer pool)SQL()ORACLEORACLESQL(shared buffer pool)SQL

  • Rowid rowidrowidROWIDrowidrowid

  • RowidrowidROWIDROWIDROWIDROWID ORACLE8ROWIDFILE BLOCKROW NUMBERoracle8ROWIDROWIDOBJECTFILEBLOCKROW NUMBERDBMS_ROWIDrowidrowid

  • Recursive SQL sqlOraclerecursive callsrecursive SQL statementsDDLORACLErecursive SQLDDLRecursive callsRecursive callsrecursive SQLORACLEDMLSELECTrecursive SQLrecursive SQL

  • Row Source() 2row source(join)Predicate() WHERE

  • Driving Table()(OUTER TABLE)HASHrow source(driving row source)WHERE()row sourcerow source 1

  • Probed Table()(INNER TABLE)(row source)row source 2

  • (concatenated index)create index idx_emp on emp(col1, col2, col3, )idx_emp(leading column)col1where col1 = ? where col1 = ? and col2 = ?where col2 = ?

  • (selectivity)/1

  • Oracle

  • OracleOracle

    SQLORACLESQLDBA1. 2. ;

  • SQL

    SELECT ename, job, sal, dname FROM emp, dept WHERE emp.deptno = derpt.deptno AND NOT EXISTS ( SELECT * FROM salgrade WHERE emp.sal BETWEEN losal AND hisal );

  • EMPSALGRADE PK_DEPTNODEPTNODEPTROWID

    DEPTROWID 2(C)

  • Oracle(356)Oracle

    Oracle

    Oracle Oracle OracleROWID Oracle Oracle OracleOracleOracleSQL

  • Oracle

  • first_rows Oracle all_rows

    354ORACLE

  • Oracle

  • () -- access path SQL() oracle()I/Omultiblockoracle1 Full Table Scans, FTS 2 ROWIDTable Access by ROWIDrowid lookup 3 Index Scanindex lookup

  • OracleWHEREOracle(high water mark, HWM)I/O(db_block_multiblock_read_count)I/OHWMdeleteHWMdeletetruncateHWM0oracle 10GHWM FTSLeast Recently Used (LRU) FTS5% -- 10% ~~~~~~~~~~~~~~~~~~~~~~~~ SQL> explain plan for select * from dual; Query Plan ----------------------------------------- SELECT STATEMENT [CHOOSE] Cost= TABLE ACCESS FULL DUAL

  • ROWIDTable Access by ROWIDrowid lookup ROWIDROWIDOracle ROWIDOracle ROWIDWHEREOracleROWID I/O

    ROWID SQL> explain plan for select * from dept where rowid = 'AAAAyGAADAAAAATAAF'; Query Plan ------------------------------------ SELECT STATEMENT [CHOOSE] Cost=1 TABLE ACCESS BY ROWID DEPT [ANALYZED]

  • Index Scanindex lookup indexrowid(rowid)rowidrowidi/oi/o ROWID2 (1) rowid (2) rowid

    I/OCACHE1I/OI/O2I/OI/OI/O5% -- 10% SQL> explain plan for select empno, ename from emp where empno=10; Query Plan ------------------------------------ SELECT STATEMENT [CHOOSE] Cost=1 TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX UNIQUE SCAN EMP_I1

    TABLE ACCESS BY ROWID EMPFTSrowid lookuprowidempnoINDEX UNIQUE SCANEMP_I1

  • where4 (index unique scan) (index range scan) (index full scan) (index fast full scan) Index Scanindex lookup

  • (index unique scan) ROWID()create index idx_test on emp(ename, deptno, loc)select ename from emp where ename = JACK and deptno = DEVselect ename from emp where deptno = DEVwhereUNIQUE PRIMARY KEY Oracle SQL> explain plan for select empno,ename from emp where empno=10; Query Plan ------------------------------------ SELECT STATEMENT [CHOOSE] Cost=1 TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX UNIQUE SCAN EMP_I1 Index Scanindex lookup

  • (index range scan) select ename from emp where ename = JACK and deptno = DEV(where)(>= explain plan for select empno,ename from emp where empno > 7876 order by empno; Query Plan -------------------------------------------------------------------------------- SELECT STATEMENT [CHOOSE] Cost=1 TABLE ACCESS BY ROWID EMP [ANALYZED] INDEX RANGE SCAN EMP_I1 [ANALYZED] Index Scanindex lookup col = 5

    index rang scan3 (a) range(> < >=

  • (index full scan)CBOCBO An Index full scan will not perform single block i/o's and so it may prove to be inefficient. e.g. Index BE_IX is a concatenated index on big_emp (empno, ename) SQL> explain plan for select empno, ename from big_emp order by empno,ename; Query Plan -------------------------------------------------------------------------------- SELECT STATEMENT [CHOOSE] Cost=26 INDEX FULL SCAN BE_IX [ANALYZED] Index Scanindex lookup

  • (index fast full scan) index full scan BE_IX big_emp (empno,ename) SQL> explain plan for select empno, ename from big_emp; Query Plan ------------------------------------------ SELECT STATEMENT [CHOOSE] Cost=1 INDEX FAST FULL SCAN BE_IX [ANALYZED] 2 SQL> explain plan for select ename from big_emp; Query Plan ------------------------------------------ SELECT STATEMENT [CHOOSE] Cost=1 INDEX FAST FULL SCAN BE_IX [ANALYZED] Index Scanindex lookup

  • Oracle

  • Join2Joinrow sourcejoinrow sourcerow sourcejoin2 row source()row sourcewhere

  • 2row source(WHERE A.COL3 = B.COL4)(WHERE A.COL3 > B.COL4)(WHERE A.COL3 = B.COL4(+))

    SELECT A.COL1, B.COL2 FROM A, B WHERE A.COL3 = B.COL4; ARow Soruce1COL 3BRow Soruce2COL 4

  • - - (Sort Merge Join (SMJ) )

    (Nested Loops (NL) )

    (Hash Join)

    (Cartesian Product)

  • row source1 (A.col3) row source2sort source1(B.col4) 2row source - - (Sort Merge Join (SMJ) )

  • row sourcesort row source(a.col3b.col4)row sourcerow sourcerow source().

    SMJ2row source - - (Sort Merge Join (SMJ) )SMJ SQL> explain plan for select /*+ ordered */ e.deptno, d.deptno from emp e, dept d where e.deptno = d.deptno order by e.deptno, d.deptno; Query Plan ------------------------------------- SELECT STATEMENT [CHOOSE] Cost=17 MERGE JOIN SORT JOIN TABLE ACCESS FULL EMP [ANALYZED] SORT JOIN TABLE ACCESS FULL DEPT [ANALYZED]

  • 2row source()I/O (Nested Loops (NL) )

  • Row source1Row 1 -------------- -- Probe -> Row source 2 Row source1Row 2 -------------- -- Probe -> Row source 2 Row source1Row 3 -------------- -- Probe -> Row source 2 . Row source1Row n -------------- -- Probe -> Row source 2 row source1row source2row source1row source2()I/OI/OI/OI/O (Nested Loops (NL) )

  • Row Source1Row Source2

    NESTED LOOPSOraclerow source1row sourc2row source1row source1 driving row source()inner row source()NESTED LOOPS (Nested Loops (NL) )

  • where (CPU) (Nested Loops (NL) ) NL SQL> explain plan for select a.dname, b.sql from dept a, emp b where a.deptno = b.deptno; Query Plan ------------------------- SELECT STATEMENT [CHOOSE] Cost=5 NESTED LOOPS TABLE ACCESS FULL DEPT [ANALYZED] TABLE ACCESS FULL EMP [ANALYZED]

  • NLSMJCBO

    row sourcehash tablebitmap2row sourcehansedrow sourcehash tableBitmaphash tablehash tableNLhash tablebitmaphash tablebitmap HASH_JOIN_ENABLED=TRUETRUEhash_area_size (Hash Join, HJ) HASH SQL> explain plan for select /*+ use_hash(emp) */ empno from emp, dept where emp.deptno = dept.deptno; Query Plan ---------------------------- SELECT STATEMENT [CHOOSE] Cost=3 HASH JOIN TABLE ACCESS FULL DEPT TABLE ACCESS FULL EMP

  • row sourcerow source()

    2 SQL> explain plan for select emp.deptno, dept,deptno from emp,dept Query Plan ------------------------------ SLECT STATEMENT [CHOOSE] Cost=5 MERGE JOIN CARTESIAN TABLE ACCESS FULL DEPT SORT JOIN TABLE ACCESS FULL EMP CARTESIAN2empndeptmn * m (Cartesian Product)

  • - - (Sort Merge Join, SMJ) 2row sourceNL sort mergerow source rowidI/O (Nested Loops, NL) driving row source()inner row source() NESTED LOOPS

  • (Hash Join, HJ) oracle7 2 CBOhash_area_size 2row source row source

  • Oracle

  • 3 1) Sql> set autotrace on Sql> select * from dual; explain plan sql Sql> set autotrace traceonly a. Sqlplus > @ ?\rdbms\admin\utlxplan.sql b. sys Sqlplus > @ ?\sqlplus\admin\plustrce.sql Sqlplus > grant plustrace to user_name; -- user_name

  • 2)explain plan (1) sqlplus > @ ?\rdbms\admin\utlxplan.sql (2) sqlplus > explain plan set statement_id =??? for select

    sqlplan_tableset autotrace traceonly set linesize 150 set pagesize 500 col PLANLINE for a120 SELECT EXECORD EXEC_ORDER, PLANLINE FROM (SELECT PLANLINE, ROWNUM EXECORD, ID, RID FROM (SELECT PLANLINE, ID, RID, LEV FROM (SELECT lpad(' ',2*(LEVEL),rpad(' ',80,' '))|| OPERATION||' '|| -- Operation DECODE(OPTIONS,NULL,'','('||OPTIONS || ') ')|| -- Options DECODE(OBJECT_OWNER,null,'','OF '''|| OBJECT_OWNER||'.')|| -- Owner DECODE(OBJECT_NAME,null,'',OBJECT_NAME|| ''' ')|| -- Object Name DECODE(OBJECT_TYPE,null,'','('||OBJECT_TYPE|| ') ')|| -- Object Type DECODE(ID,0,'OPT_MODE:')|| -- Optimizer DECODE(OPTIMIZER,null,'','ANALYZED','', OPTIMIZER)|| DECODE(NVL(COST,0)+NVL(CARDINALITY,0)+NVL(BYTES,0), 0,null,' (COST='||TO_CHAR(COST)||',CARD='|| TO_CHAR(CARDINALITY)||',BYTES='||TO_CHAR(BYTES)||')') PLANLINE, ID, LEVEL LEV, (SELECT MAX(ID) FROM PLAN_TABLE PL2 CONNECT BY PRIOR ID = PARENT_ID AND PRIOR STATEMENT_ID = STATEMENT_ID START WITH ID = PL1.ID AND STATEMENT_ID = PL1.STATEMENT_ID) RID FROM PLAN_TABLE PL1 CONNECT BY PRIOR ID = PARENT_ID AND PRIOR STATEMENT_ID = STATEMENT_ID START WITH ID = 0 AND STATEMENT_ID = 'aaa') ORDER BY RID, -LEV)) ORDER BY ID;

  • 2)explain plan 2SQLSQL SELECT ADDRESS, substr(SQL_TEXT,1,20) Text, buffer_gets, executions, buffer_gets/executions AVG FROM v$sqlarea WHERE executions>0 AND buffer_gets > 100000 ORDER BY 5; SQLtracetkprofSQL(ParseExecuteFetch)(CPUDISKelapsed)

  • 3)dbms_system

    dbms_systemsqlSQL

  • Oracle

  • 1 LARGE_TABLEusername SQL> SELECT * FROM LARGE_TABLE where USERNAME = TEST; Query Plan ----------------------------------------- SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14) TABLE ACCESS FULL LARGE_TABLE [:Q65001] [ANALYZED] TABLE ACCESS FULL LARGE_TABLELARGE_TABLErow sourceSELECT STATEMENT Optimizer=CHOOSE optimizer_modeoptimizer_mode costCBOcost: SELECT STATEMENT Optimizer=CHOOSE (Cost=1234 Card=1 Bytes=14)

  • RBOcostcost SELECT STATEMENT Optimizer=CHOOSE Cost= SELECT STATEMENT Optimizer=CHOOSE Optimizer Optimizer=ALL_ROWS| FIRST_ROWS| FIRST_ROWS_nCBO Optimizer=RULERBO costoraclecostcost [:Q65001] slave [ANALYZED] CBO

  • 2 ABCAA(a.col1,a.col2) a.col1

    2row sourceBAC B A C col3=10 col3=5

  • 3SQLBC2 BB.col3 = 10Bwhere(B.col3 = 10)row source, BAA(Acol1leading column) C(C.col3 = 5)CCrow sourceA.col2 = C.col2AAcol2leading columnnested loopNL

  • (B - - > A) - - > CCBOCBOORACLEhintsCBO

    select /*+ ordered */ A.col4 from B,A,C where B.col3 = 10 and A.col1 = B.col1 and A.col2 = C.col2 and C.col3 = 5

  • rowidrowid Execution Plan-----------------------------------------------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE1 0 MERGE JOIN2 1 SORT (JOIN)3 2 NESTED LOOPS4 3 TABLE ACCESS (FULL) OF 'B'5 3 TABLE ACCESS (BY INDEX ROWID) OF 'A'7 1 SORT (JOIN)8 7 TABLE ACCESS (FULL) OF 'C'

  • NESTED LOOPSTABLE ACCESS (FULL) OF 'B'B()ABArow source row sourceCrow source(C.col3 = 5)MSJBArow sourceC

  • CBABCORACLE ()() (ABC)SQL

  • RBO

    ORACLERBOfrom All things being equal RBO chooses the driving order by taking the tables in the FROM clause RIGHT to LEFTRBOwhere where

    3

    create table A(col1 number(4,0),col2 number(4,0), col4 char(30));

    create table B(col1 number(4,0),col3 number(4,0), name_b char(30));

    create table C(col2 number(4,0),col3 number(4,0), name_c char(30));

    create index inx_col12A on a(col1,col2);

    select A.col4

    from B, A, C

    where B.col3 = 10

    and A.col1 = B.col1

    and A.col2 = C.col2

    and C.col3 = 5;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=RULE

    1 0 MERGE JOIN

    2 1 SORT (JOIN)

    3 2 NESTED LOOPS

    4 3 TABLE ACCESS (FULL) OF 'B'

    5 3 TABLE ACCESS (BY INDEX ROWID) OF 'A'

    6 5 INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)

    7 1 SORT (JOIN)

    8 7 TABLE ACCESS (FULL) OF 'C'

    select A.col4

    from B, A, C

    where A.col1 = B.col1

    and A.col2 = C.col2;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=RULE

    1 0 MERGE JOIN

    2 1 SORT (JOIN)

    3 2 NESTED LOOPS

    4 3 TABLE ACCESS (FULL) OF 'B'

    5 3 TABLE ACCESS (BY INDEX ROWID) OF 'A'

    6 5 INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)

    7 1 SORT (JOIN)

    8 7 TABLE ACCESS (FULL) OF 'C'

    Ainx_col12A

    select A.col4

    37

    from B, A, C

    where A.col1 = B.col1

    and A.col2 = C.col2;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=RULE

    1 0 MERGE JOIN

    2 1 SORT (JOIN)

    3 2 MERGE JOIN

    4 3 SORT (JOIN)

    5 4 TABLE ACCESS (FULL) OF 'C'

    6 3 SORT (JOIN)

    7 6 TABLE ACCESS (FULL) OF 'A'

    8 1 SORT (JOIN)

    9 8 TABLE ACCESS (FULL) OF 'B'

    oracle All things being equal RBO chooses the driving order by taking the tables in the FROM clause RIGHT to LEFThintsnested loophintsCBORBO

    CBO

    CBOfrom RBO(CBO determines join order from costs derived from gathered statistics. If there are no stats then CBO chooses the driving order of tables from LEFT to RIGHT in the FROM clause. This is OPPOSITE to the RBO) ordered (CBO)from CBO()costwherehintshints

    3

    create table A(col1 number(4,0),col2 number(4,0), col4 char(30));

    create table B(col1 number(4,0),col3 number(4,0), name_b char(30));

    create table C(col2 number(4,0),col3 number(4,0), name_c char(30));

    create index inx_col12A on a(col1,col2);

    select A.col4

    from B, A, C

    where B.col3 = 10

    38

    and A.col1 = B.col1

    and A.col2 = C.col2

    and C.col3 = 5;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=110)

    1 0 NESTED LOOPS (Cost=3 Card=1 Bytes=110)

    2 1 MERGE JOIN (CARTESIAN) (Cost=2 Card=1 Bytes=52)

    3 2 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)

    4 2 SORT (JOIN) (Cost=1 Card=1 Bytes=26)

    5 4 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)

    6 1 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

    select A.col4

    from B, A, C

    where A.col1 = B.col1

    and A.col2 = C.col2;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=55 Bytes=4620)

    1 0 HASH JOIN (Cost=5 Card=55 Bytes=4620)

    2 1 HASH JOIN (Cost=3 Card=67 Bytes=4757)

    3 2 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=82 Bytes=1066)

    4 2 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

    5 1 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=82 Bytes=1066)

    Ainx_col12A

    select A.col4

    from B, A, C

    where A.col1 = B.col1

    and A.col2 = C.col2;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5 Card=55 Bytes=4620)

    1 0 HASH JOIN (Cost=5 Card=55 Bytes=4620)

    2 1 HASH JOIN (Cost=3 Card=67 Bytes=4757)

    3 2 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=82 Bytes=1066)

    4 2 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

    5 1 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=82 Bytes=1066)

    select /*+ ORDERED */A.col4

    from C, A, B

    where B.col3 = 10

    and A.col1 = B.col1

    39

    and A.col2 = C.col2

    and C.col3 = 5;

    Execution Plan

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

    0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=110)

    1 0 NESTED LOOPS (Cost=3 Card=1 Bytes=110)

    2 1 NESTED LOOPS (Cost=2 Card=1 Bytes=84)

    3 2 TABLE ACCESS (FULL) OF 'C' (Cost=1 Card=1 Bytes=26)

    4 2 TABLE ACCESS (FULL) OF 'A' (Cost=1 Card=82 Bytes=4756)

    5 1 TABLE ACCESS (FULL) OF 'B' (Cost=1 Card=1 Bytes=26)

    ORDERED

  • Oracle

  • hints DBADBA: ORACLEhints() hintsoraclehints 1) 2) all_rowsfirst_rows 3) rowid 4) 5) 6)

  • hintsHintssql(statement blockselectupdatedelete)SQLunion2sqlsqlhintshintssql (comment)hintsSELECT, UPDATE, or DELETE hints {DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */ or {DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]... 1) DELETEINSERTSELECTUPDATE 2) +hints/* 3) hint 4) text hint hintsOraclehints

  • hintshintshintsINDEX()INDEXINDEXhints hintsORDERED SELECT /*+ ORDERED INDEX (b, jl_br_balances_n1) USE_NL (j b) USE_NL (glcc glf) USE_MERGE (gp gsb) */ b.application_id, b.set_of_books_id , b.personnel_id, p.vendor_id Personnel, p.segment1 PersonnelNumber, p.vendor_name Name FROM jl_br_journals j, jl_br_balances b, gl_code_combinations glcc, fnd_flex_values_vl glf, gl_periods gp, gl_sets_of_books gsb, po_vendors p WHERE ...

  • hintsALL_ROWS -- FIRST_ROWS(n) -- CHOOSE -- RULE -- SELECT /*+ FIRST_ROWS(10) */ employee_id, last_name, salary, job_id FROM employees WHERE department_id = 20; SELECT /*+ CHOOSE */ employee_id, last_name, salary, job_id FROM employees WHERE employee_id = 7566;

    SELECT /*+ RULE */ employee_id, last_name, salary, job_id FROM employees WHERE employee_id = 7566;

  • hints FULL /*+ FULL ( table ) */ ROWID /*+ ROWID ( table ) */ rowid INDEX /*+ INDEX ( table [index]) */ INDEX_FFS /*+ INDEX_FFS ( table [index]) */ NO_INDEX /*+ NO_INDEX ( table [index]) */ SELECT /*+ FULL(e) */ employee_id, last_name FROM employees e WHERE last_name LIKE :b1; SELECT /*+ROWID(employees)*/ * FROM employees WHERE rowid > 'AAAAtkAABAAAFNTAAA' AND employee_id = 155; SELECT /*+ INDEX(A sex_index) use sex_index because there are few male patients */ A.name, A.height, A.weight FROM patients A WHERE A.sex = m; SELECT /*+NO_INDEX(employees emp_empid)*/ employee_id FROM employees WHERE employee_id > 200;

  • hints ORDERED /*+ ORDERED */ from STAR /*+ STAR */

    SELECT /*+ORDERED */ o.order_id, c.customer_id, l.unit_price * l.quantity FROM customers c, order_items l, orders o WHERE c.cust_last_name = :b1 AND o.customer_id = c.customer_id AND o.order_id = l.order_id; /*+ ORDERED USE_NL(FACTS) INDEX(facts fact_concat) */

  • hints

    USE_NL /*+ USE_NL ( table [,table, ...] ) */ USE_MERGE /*+ USE_MERGE ( table [,table, ...]) */ - - USE_HASH /*+ USE_HASH ( table [,table, ...]) */ HASH alias()table

  • HINTShintsUSE_NLUSE_HASHORDERED

  • Oracle

  • nested loopdriving tablesql(SUPER_USER)driving tableoracleSWD_BILLDETAILcnSUPER_USERSWD_BILLDETAILrowidrowidSWD_BILLDETAILuser_classrowidrowid 1186387rowidSWD_BILLDETAIL1186387

  • (SWD_BILLDETAIL)driving(I/Ooracle)SUPER_USERSUPER_USERsqlSWD_BILLDETAIL(SWD_BILLDETAIL1120) SWD_BILLDETAILcnsqlSUPER_USER5002sqlSUPER_USER2sqlSUPER_USER

  • SQL Oracle Oracle

  • optimizer_moderuleoptimizer_mode3CBO 1) Index Only Tables(IOTs), CBO 2) Oracle 7.3Paralle degree option>1 CBO, rule hints3) rluehintsCBO

  • description Description ~~~~~~~~~~~ ~~~~~~~~~~~~ ~~~~~~~~~ Non-RBO Object (Eg:IOT) n/a #1 Parallelism > 1 n/a #1 RULE hint n/a RULE ALL_ROWS hint n/a ALL_ROWS FIRST_ROWS hint n/a FIRST_ROWS *Other Hint n/a #1 OPTIMIZER_GOAL=RULE n/a RULE OPTIMIZER_GOAL=ALL_ROWS n/a ALL_ROWS OPTIMIZER_GOAL=FIRST_ROWS n/a FIRST_ROWS OPTIMIZER_GOAL=CHOOSE NO RULE OPTIMIZER_GOAL=CHOOSE YES ALL_ROWS

    #1 OPTIMIZER_GOAL FIRST_ROWS ALL_ROWSPL/SQLALL_ROWS *Other Hint RULEALL_ROWS FIRST_ROWS

  • CBO, CBO, : 1) 2) 3) oracle 10G 4) RBORBO CBO 5) trace tkproftrace

  • trace (bind variables)parseSQLCBOsql row source 10000row source (+)driving tableorder hintorder hint

  • CBOexecution plan: cost ALWAYS_ANTI_JOIN B_TREE_BITMAP_PLANS COMPLEX_VIEW_MERGING DB_FILE_MULTIBLOCK_READ_COUNT FAST_FULL_SCAN_ENABLED HASH_AREA_SIZE HASH_JOIN_ENABLED HASH_MULTIBLOCK_IO_COUNT OPTIMIZER_FEATURES_ENABLE OPTIMIZER_INDEX_CACHING OPTIMIZER_INDEX_COST_ADJ OPTIMIZER_MODE> / GOAL OPTIMIZER_PERCENT_PARALLEL OPTIMIZER_SEARCH_LIMIT PARTITION_VIEW_ENABLED PUSH_JOIN_PREDICATE SORT_AREA_SIZE SORT_DIRECT_WRITES SORT_WRITE_BUFFER_SIZE STAR_TRANSFORMATION_ENABLED V733_PLANS_ENABLED CURSOR_SHARING

  • sqlSQL SQL (session)sessionsidserial# (sql)

    1)

    session(sql*plus)

    set linesize 190

    col machine format a30 wrap

    col program for a40

    col username format a15 wrap

    set pagesize 500

    select s.sid sid, s.SERIAL# "serial#", s.username, s.machine, s.program,

    p.spid ServPID, s.server

    from v$session s, v$process p

    where p.addr = s.paddr ;

    SID serial# USERNAME MACHINE PROGRAM SERVPID SERVER

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

    8 3 SCOTT WORKGROUP\SUNNYXU SQLPLUS.EXE 388 DEDICATED

    LOGON_TIME

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

    2005.06.28 18:50:11

    sid, serial# : session

    username :

    machine : hostname

    program : java jdbc thin

    servpid : unix

    server : (dedicaed)(shared)

    logon_time :

    machine, logon_time sessionsesionsid, serial#, session

    2)

    timed_statistics :

    sql

    user_dump_dest :

    max_dump_file_size :

    SQL> exec sys.dbms_system.set_bool_param_in_session( -

    sid => 8, -

    serial# => 3, -

    parnam => 'timed_statistics', -

    bval => true);

    SQL> alter system set user_dump_dest='c:\temp';

    -- system

    SQL> show parameter user_dump_dest

    SQL> exec sys.dbms_system.set_int_param_in_session( -

    sid => 8, -

    serial# => 3, -

    parnam => 'max_dump_file_size', -

    intval => 2147483647)

    3)

    SQL> exec sys.dbms_system.set_sql_trace_in_session(8, 3, true);

    sessionsqltrc

    4)

    5)

    SQL> exec sys.dbms_system.set_sql_trace_in_session(8,3,false);

    6)

    trace

    tkprof dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER

    tkprof

    (a) tkprof tracefile.trc sort_1.prf explain=apps/your_apps_password print=10 sort='(prsqry,exeqry,fchqry,prscu,execu,fchcu)' (b) tkprof tracefile.trc sort_2.prf explain=apps/your_apps_password print=10 sort='(prsela,exeela,fchela)' (c) tkprof tracefile.trc sort_3.prf explain=apps/your_apps_password print=10 sort='(prscnt,execnt,fchcnt)' (d) tkprof tracefile.trc normal.prf explain=apps/your_apps_password

    tkprof

    oraclesessionSQLsqlfetchCPUsqlTKPROFtkproforaclesql*plusoracle

    recursive callstkprofrecursive callsrecursive calls

    recursive callsrecursive callsrecursive callssqlsqlsqlrecursive callssysnorecursive calls

    tkprof

    tkprof

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

    oraclesqloraclesqlsql

    tkprofEXPLAINtkprofEXPLAIN PLANsql

    TKPROFtracetrace

    TKPROF

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

    TKPROF command ::=

    >>-- TKPROF traced_file formatted_file ---------------------------------------------->

    | |

    +- SORT = ---------------------------------+

    | |

    +-- OPTION --+

    | |

    | +---- , ----+ |

    | V | |

    |__( OPTION )__|

    >----------------------------------------------------------------------------->

    | | | | | |

    +-- PRINT = integer --+ +-- INSERT = filname3 --+ +-- SYS = ---------+

    | |

    +- YES -+

    | |

    +- NO --+

    >----------------------------------------------------------------------------->

    | |

    +---------------------------------------- EXPLAIN = user/password ------+

    | |

    +---- TABLE = schema.table ----+

    >----------------------------------------------------------------------------><

    | |

    +---- RECORD = filname ----+

    ' traced_file '

    oracletrace

    sessionsession(

    )

    'formatted_file'

    sql

    'EXPLAIN'

    tracesqlsql

    trace filesql

    tkproftrace filesqlexplian

    EXPLAIN PLANsql

    'TABLE'

    sql

    tkprof

    utlxplan.sql

    'SYS'

    syssqlsessionrecursive SQL

    YES

    NOsql

    sql

    SORT

    ()sql

    sql

    prscnt number of times parse was called

    prscpu cpu time parsing

    prsela elapsed time parsing

    prsdsk number of disk reads during parse

    prsqry number of buffers for consistent read during parse

    prscu number of buffers for current read during parse

    prsmis number of misses in library cache during parse

    execnt number of execute was called

    execpu cpu time spent executing

    exeela elapsed time executing

    exedsk number of disk reads during execute

    exeqry number of buffers for consistent read during execute

    execu number of buffers for current read during execute

    exerow number of rows processed during execute

    exemis number of library cache misses during execute

    fchcnt number of times fetch was called

    fchcpu cpu time spent fetching

    fchela elapsed time fetching

    fchdsk number of disk reads during fetch

    fchqry number of buffers for consistent read during fetch

    fchcu number of buffers for current read during fetch

    fchrow number of rows fetched

    userid userid of user that parsed the cursor

    PRINT

    sqlSORT

    tkprofsql

    Printsort:

    cpunsql

    nsql

    INSERT

    sqlcreate table insert

    sql(recursive SQL)

    ,depth,user_id,

    parse_cnt,parse_cpu,parse_elap,parse_disk,

    parse_query,parse_current,parse_miss

    ,exe_count,exe_cpu,exe_elap,exe_disk,exe_query,

    exe_current,exe_miss,exe_rows

    ,fetch_count,fetch_cpu,fetch_elap,fetch_disk,

    fetch_query,fetch_current,fetch_rows,ticks

    ,sql_statement

    sql

    sql

    RECORD

    sql

    recursive SQL

    sortsql.

    1

    "dsdb2_ora_18468.trc""dsdb2_trace.out"

    TKPROF dsdb2_ora_18468.trc dsdb2_trace.out SYS=NO EXPLAIN=SCOTT/TIGER

    EXPLAINTKPROFSCOTTEXPLAIN PLANsqlSYSNOTKPROFrecursive SQL

    2

    TKPROF DLSUN12_JANE_FG_SVRMGR_007.TRC OUTPUTA.PRF

    EXPLAIN=SCOTT/TIGER TABLE=SCOTT.TEMP_PLAN_TABLE_A

    INSERT=STOREA.SQL SYS=NO SORT=(EXECPU,FCHCPU)

    TABLETKPROFscottTEMP_PLAN_TABLE_Asql

    INSERTTKPROFSTOREA.SQLsql

    SORTTKPROFsqlcpufetchcpu

    tkprof

    tkprof

    header

    body

    summary

    header

    TKPROF

    TKPROF: Release 8.1.7.0.0 - Production on 6 30 13:10:59 2005

    (c) Copyright 2000 Oracle Corporation. All rights reserved.

    Trace file: D:\oracle\admin\xyj\udump\ORA01720.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

    ********************************************************************************

    body

    sqlsqlsql

    select *

    from

    emp

    call count cpu elapsed disk query current rows

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

    Parse 3 0.00 0.00 1 0 1 0

    Execute 3 0.00 0.00 0 0 0 0

    Fetch 6 0.00 0.00 1 6 12 36

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

    total 12 0.00 0.00 2 6 13 36

    Misses in library cache during parse: 1

    Optimizer goal: CHOOSE

    Parsing user id: 19 (SCOTT)

    Rows Row Source Operation

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

    12 TABLE ACCESS FULL EMP

    Rows Execution Plan

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

    0 SELECT STATEMENT GOAL: CHOOSE

    12 TABLE ACCESS (FULL) OF 'EMP'

    DELETE FROM RM$HASH_ELMS

    call count cpu elapsed disk query current rows

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

    Parse 2 0.00 0.00 0 0 0 0

    Execute 29 12.04 12.61 6786 6853 108 19

    Fetch 0 0.00 0.00 0 0 0 0

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

    total 31 12.04 12.61 6786 6853 108 19

    Misses in library cache during parse: 0

    Optimizer hint: CHOOSE

    Parsing user id: 9 (DES12A) (recursive depth: 3)

    Rows Execution Plan

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

    0 DELETE STATEMENT HINT: CHOOSE

    16 TABLE ACCESS (FULL) OF 'RM$HASH_ELMS'

    summary

    sql

    OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS - - sql

    call count cpu elapsed disk query current rows

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

    Parse 7 0.00 0.00 2 201 2 0

    Execute 7 0.00 0.00 1 2 7 1

    Fetch 10 0.00 0.00 2 67 16 52

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

    total 24 0.00 0.00 5 270 25 53

    Misses in library cache during parse: 5

    OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS - - sql

    call count cpu elapsed disk query current rows

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

    Parse 75 0.00 0.00 2 3 2 0

    Execute 81 0.00 0.00 1 1 5 1

    Fetch 153 0.00 0.00 21 355 0 110

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

    total 309 0.00 0.00 24 359 7 111

    Misses in library cache during parse: 29

    8 user SQL statements in session.

    74 internal SQL statements in session.

    82 SQL statements in session.

    5 statements EXPLAINed in this session.

    *********************************************************************

    Trace file: D:\oracle\admin\xyj\udump\ORA01720.TRC

    Trace file compatibility: 8.00.04

    Sort options: default

    1 session in tracefile.

    8 user SQL statements in trace file.

    74 internal SQL statements in trace file.

    82 SQL statements in trace file.

    34 unique SQL statements in trace file.

    5 SQL statements EXPLAINed using schema:

    SCOTT.prof$plan_table

    Default table was used.

    Table was created.

    Table was dropped.

    825 lines in trace file.

    body

    1) sql

    select3( )DML2( )sqlsqlsqlsql

    call : sqlsql3

    Parse: hard parsesoft parse

    Execute: DML

    select

    Fetch : selectDML

    sql

    COUNT

    parsedexecutedfetched

    CPU

    cpu

    ELAPSED

    (cpu)

    DISK

    (file system buffer)

    sql

    QUERY

    consistent mode bufferbuffers

    bufferconsistent mode

    CURRENT

    current modebufferbuffersBuffers are often

    DMLbuffercurrent mode

    QUERY + CURRENT sqlbuffer

    ROWS

    sql

    selectfetchdmlexecute

    0.0100.010.00

    2)

    Misses in library cache during parse: 1 -- hard parse

    Optimizer goal: CHOOSE --

    Parsing user id: 19 (SCOTT) -- sql

    Rows Row Source Operation

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

    12 TABLE ACCESS FULL EMP

    Rows Execution Plan --

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

    0 SELECT STATEMENT GOAL: CHOOSE

    12 TABLE ACCESS (FULL) OF 'EMP'

    Misses in library cache during parse: parsesqlparsebind variable

    autotrace

    sqltkprofcostsstatistics

    autotrace

    1) 10Goracle

    2) autotraceautotraceautracesql

    sql

    -

    ===========================================================

    OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS

    | call | count | cpu | elapsed | disk | query | current | rows |

    |--------- |------- |------ |--------- |--------- |-------- |--------- |-------- |

    | Parse | [A] 7 | 1.87 | 4.53 | 385 | [G] 553 | 22 | 0 |

    | Execute | [E] 7 | 0.03 | 0.11 | [P] 0 | [C] 0 | [D] 0 | [F] 0 |

    | Fetch | [E] 6 | 1.39 | 4.21 | [P] 182 | [C] 820 | [D] 3 | [F] 20 |

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

    Misses in library cache during parse: 5

    Misses in library cache during execute: 1

    8 user SQL statements in session.

    12 internal SQL statements in session.

    [B] 54 SQL statements in session.

    3 statements EXPLAINed in this session.

    (1). [A] [B]parsingsession547parsesparse

    (2). [P], [C] & [D]

    Hit Ratio is logical reads/physical reads:

    Logical Reads = Consistent Gets + DB Block Gets

    Logical Reads = query + current

    Logical Reads = Sum[C] + Sum[D]

    Logical Reads = 0+820 + 0+3

    Logical Reads = 820 + 3

    Logical Reads = 823

    Hit Ratio = 1 - (Physical Reads / Logical Reads)

    Hit Ratio = 1 - (Sum[P] / Logical Reads)

    Hit Ratio = 1 - (128 / 823)

    Hit Ratio = 1 - (0.16)

    Hit Ratio = 0.84 or 84%

    (3). fetchrowsfetch(array fetching)

    [E][F].

    [E] = 6 = Number of Fetches

    [F] = 20 = Number of Rows

    6fetch20arrayfetchingfetch

    (4). [G]

    -

    ===============================================

    update ...

    where ...

    | call | count | cpu | elapsed | disk | query | current | rows |

    |--------- |------- |----- |--------- |------ |-------- |--------- |-------- |

    | Parse | 1 | 7 | 122 | 0 | 0 | 0 | 0 |

    | Execute | 1 | 75 | 461 | 5 | [H] 297 | [I] 3 | [J] 1 |

    | Fetch | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

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

    [H] 297

    [I] 3

    [J] (undoredo)

    297

    parse

    ==============================

    select ...

    | call | count | cpu | elapsed | disk | query | current | rows |

    |--------- |------ -|--------- |--------- |----- -|------- -|-------- -|------ -|

    | Parse | [M] 2 | [N] 221 | 329 | 0 | 45 | 0 | 0 |

    | Execute | [O] 3 | [P] 9 | 17 | 0 | 0 | 0 | 0 |

    | Fetch | 3 | 6 | 8 | 0 | [L] 4 | 0 | [K] 1 |

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

    Misses in library cache during parse: 2 [Q]

    [K]

    [L] fetch 4fetchfetchcursorfetch

    [M] parse(hard parse soft parse)

    parsecpuexecutecpu([O] & [P])

    [Q] parsehard parse[Q]1

    hard parsesoft parse(

    hard parse)

    2sqlhard parseparse(excessive parsing)

    o

    - bind variables

    - shared pool

    ora-04031: unable to allocate %s bytes of shared memory (%s,%s,%s)

    - 8icursor_sharing

    parsecpu

    1.Rewrite the application so statements do not continually reparse.

    2.Reduce parsing by using the initialization parameter SESSION_CACHED_CURSORS.

    3.Use bind variables to reduce parsing.

    cursortkprofsql SQL_TRACE = falsePL/SQL child cursorscursorSQL*Pluscursor

  • **