ORACLE 培训 --SQL 性能优化 老方块内部培训班使用
Jan 11, 2016
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) 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
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
**