barunsql performance tuning with oracle ash awr real world use cases public

47
1 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Upload: abdul-jabbar

Post on 01-May-2017

254 views

Category:

Documents


5 download

TRANSCRIPT

1 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and ti i f f t f ti lit d ib d f O l ’timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

All the views expressed in this presentation are the opinion of the authors and do not necessarily reflect the views of Oracle.

The queries are provided "as is", without warranty of any kind, expressed or implied.

2 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.2 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

SQL Performance Tuning with Oracle AWR & ASH

3 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Real World Use Cases

About myself

• Vlado Barun, M.Sc.– Sr Principal Performance Engineer with Oracle Cloud ServicesSr. Principal Performance Engineer with Oracle Cloud Services– OCP, OCE SQL, MCP– 15 years in the Database Arena (Oracle DB - 10 years)

4 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Objective

• Enable you to start exploring the rich repository of performance metrics in ASH & AWR independent of anyperformance metrics in ASH & AWR independent of any specific GUI and related limitations

• Provide list of resources that enable you to “hit the ground running”

5 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Agenda

• Introduction to ASH & AWR (very brief)• Review 2 real world production use cases• Review 2 real world production use cases

– step-by-step from data gathering to resolution– write ASH/AWR queries from scratch– use pre-existing free scripts– Note: check license requirements

• ResourcesResources

6 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Automatic Workload Repository (AWR)

• Collects database performance statistics– Objects (access and usage statistics)– SQL Statement statisticsSQL Statement statistics– Wait events statistics– System statistics

ASH Statistics (DBA HIST ACTIVE SESS HISTORY)– ASH Statistics (DBA_HIST_ACTIVE_SESS_HISTORY)– Time Model Statistics based on time usage for activities– Every 1 hr by default

• Stored in DBA_HIST% views• How to access?

$ORACLE HOME/rdbms/admin/awrrpt sql SQLT custom– $ORACLE_HOME/rdbms/admin/awrrpt.sql, SQLT, custom scripts,…

– OEM, SQL DeveloperOth t l

7 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

– Other tools

Active Session History (ASH) Introduction

v$active_session_history(1 d i l )

dba_hist_active_sess_history(10 second inter als)(1 second intervals) (10 second intervals)

3 ASH Samples in AWR

Browse Books

Read ReviewsFor One Book Add to Cart Checkout

TIME

21 ASH Samples

= time spent in database

SQL Trace (Microsecond level)Application Logging (custom level)

8 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

When Row Source ObjectASH - DimensionsSAMPLE_IDSAMPLE_TIME

SessionSESSION ID

SQL_PLAN_LINE_IDSQL_PLAN_OPERATION

WaitsEVENT

jCURRENT_OBJ#CURRENT_FILE#CURRENT_BLOCK#CURRENT_ROW#

A li tiSESSION_IDSESSION_SERIAL#SESSION_TYPESESSION_STATEUSER_IDQC_INSTANCE_IDQC SESSION ID

EVENTEVENT_IDEVENT#SEQ#P1TEXTP1P2TEXT

ApplicationSERVICE_HASHPROGRAMMODULEACTIONMACHINEQC_SESSION_ID

QC_SESSION_SERIAL#CLIENT_IDIN and IS columns

SQL

P2TEXTP2P3TEXTP3WAIT_CLASSWAIT_CLASS_IDWAIT TIME

MACHINE

StatisticsTM_DELTA_TIMETM DELTA CPU TIMESQL

SQL_IDIS_SQLID_CURRENTSQL_CHILD_NUMBERSQL_OPCODESQL_OPNAMETOP LEVEL SQL ID

WAIT_TIMETIME_WAITEDCURRENT_OBJ#CURRENT_FILE#CURRENT_BLOCK#CURRENT_ROW#

TM_DELTA_CPU_TIMETM_DELTA_DB_TIMEDELTA_TIMEDELTA_READ_IO_REQUESTSDELTA_WRITE_IO_REQUESTSDELTA_READ_IO_BYTES

TOP_LEVEL_SQL_IDTOP_LEVEL_SQL_OPCODESQL_EXEC_IDSQL_EXEC_STARTSQL_PLAN_HASH_VALUESQL_PLAN_OPTIONS

Blocking SessionBLOCKING_SESSION_STATUSBLOCKING_SESSIONBLOCKING_SESSION_SERIAL#

OC G S

DELTA_WRITE_IO_BYTESDELTA_INTERCONNECT_IO_BYTESPGA_ALLOCATEDTEMP_SPACE_ALLOCATED

9 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

BLOCKING_INST_IDBLOCKING_HANGCHAIN_INFO

ASH - Summary

• Samples the current state of all active session– 1 second samples

Stores various attributes (dimensions) of a session– Stores various attributes (dimensions) of a session

• Stored in – V$ACTIVE_SESSION_HISTORY_ _

• 1-second sampling rate– DBA_HIST_ACTIVE_SESS_HISTORY

- Sub-sampling to disk into AWR Snapshot- 1-in-10 samples

• How to access?- $ORACLE HOME/rdbms/admin/ashrpt.sql, ashrpti.sql, SQLT, custom$ORACLE_HOME/rdbms/admin/ashrpt.sql, ashrpti.sql, SQLT, custom

scripts,…- OEM, SQL Developer, Real Time SQL Monitoring, …- Other tools

10 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

GUI command lineor

• It is about knowing the right tool for the right situation• Understand the strengths and weaknesses of each

GUI t l t th d li k• GUI tools strengths– Easy to use– Good visualization of data

=> cmd line weaknesses

Good visualization of data– Provides concise summary of system activity– etc…

Performance data

• GUI tools weaknesses– Slow - click…wait…click…wait…

A il bilit GUI i f t t i d

Performance data exposed by GUI

=> cmd line strength

– Availability – GUI infrastructure is down– Limited exposure – subset of available data– etc

11 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

etc…

ASH dimensions growth

See 

https://sites.google.com/site/embtdbo/wait‐event‐documentation/ash‐‐‐active‐session‐history

12 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Wh t Id tif

Understand the issueWhat Identify

(app is slow)

Quantify

InitialData

collectionHow Much(takes 1m)

Timeline(during peak hours)

AWR/ASH, Trace,Apps Logs/Tables,OS/IO stats etcWhen

( g p )

Component(Web Tier, App Tier, DB , Network, Storage,

WhereAnalyze

etc.)

Flow chartHow

Additional

Root Cause(Stats not updated)

SQL/Object Stats, Execution Plans,etcWhy

AdditionalData

Collectionand

Analysis

13 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Use Case 1

What Slow ETLWhat Slow ETL

20+ hoursHow Much

Once a monthWhen

Informatica + DBWhere

How Extract, Transform, Load

14 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Find slow SQL (ASH)

SQL> SELECT sql_id2 , COUNT(*) as sample_count3 FROM v$active_session_history_ _4 WHERE sample_time BETWEEN TO_DATE('2011-06-29 07:57', 'yyyy-mm-dd hh24:mi')5 AND TO_DATE('2011-06-30 04:30', 'yyyy-mm-dd hh24:mi')6 AND user_id = 617 AND program like 'pmdtm@%'8 GROUP BY sql id8 GROUP BY sql_id9 ORDER BY 2 DESC

10 ;

no rows selected

SQL> SELECT min(sample_time)2 FROM v$active_session_history3 ;

MIN(SAMPLE_TIME)----------------------------------------2011-07-01 19:14:48

1 row selected.

15 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Find slow SQL (ASH in AWR)SELECT sql_id

, COUNT(*) as sample_countFROM dba_hist_active_sess_historyv$active_session_history

WHERE sample time BETWEEN TO DATE('2011-06-29 07:57' 'yyyy-mm-dd hh24:mi')JOIN dba_hist_snapshot USING (dbid, instance_number, snap_id)WHERE sample_time BETWEEN TO_DATE( 2011-06-29 07:57 , yyyy-mm-dd hh24:mi )AND TO_DATE('2011-06-30 04:30', 'yyyy-mm-dd hh24:mi')

AND user_id = 61AND program like 'pmdtm@%‘

GROUP BY sql id

_ _ _ _

AND begin interval time BETWEEN TO DATE('2011-06-29 07:00' 'yyyy-mm-dd hh24:mi')GROUP BY sql_idORDER BY 2 DESC

;

AND begin_interval_time BETWEEN TO_DATE( 2011 06 29 07:00 , yyyy mm dd hh24:mi )AND TO_DATE('2011-06-30 05:00', 'yyyy-mm-dd hh24:mi')

SQL_ID SAMPLE_COUNT_ _------------- ------------dkwucgaxxhm2z 7362grksgbxxuacaf 6041…24 rows selected

16 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

24 rows selected.

Find slow SQL (ASH in AWR) - readableSQL>SELECT sql id sql typeSQL>SELECT sql_id, sql_type

2 , round(sample_cnt_sql/sample_cnt_total*100) as sample_pct3 , round(sample_cnt_sql /6/60,1) hours4 FROM(SELECT DISTINCT sql_id5 , aa.name AS sql_type6 , COUNT(*) over (PARTITION BY sql_id) AS sample_cnt_sql7 , COUNT(*) over () AS sample_cnt_total8 FROM dba_hist_active_sess_history ash9 JOIN dba_hist_snapshot s USING (dbid, INSTANCE_NUMBER, snap_id)

10 JOIN audit actions aa on (ash.sql opcode = aa.action)10 JOIN audit_actions aa on (ash.sql_opcode aa.action)11 WHERE begin_interval_time BETWEEN

… snip …18 ORDER BY 3 desc)19 WHERE rownum <= 3;

SQL_ID SQL_TYPE SAMPLE_PCT HOURS------------- -------- ---------- -----dkwucgaxxhm2z SELECT 25 20.4grksgbxxuacaf SELECT 21 16 8grksgbxxuacaf SELECT 21 16.8gh6w2fm3avn3j SELECT 12 10.1

3 rows selected.

17 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

When Row Source ObjectActive Session History (ASH) - DimensionsSAMPLE_IDSAMPLE_TIME

SessionSESSION ID

SQL_PLAN_LINE_IDSQL_PLAN_OPERATION

WaitsEVENT

jCURRENT_OBJ#CURRENT_FILE#CURRENT_BLOCK#CURRENT_ROW#

A li tiSESSION_IDSESSION_SERIAL#SESSION_TYPESESSION_STATEUSER_IDQC_INSTANCE_IDQC SESSION ID

EVENTEVENT_IDEVENT#SEQ#P1TEXTP1P2TEXT

ApplicationSERVICE_HASHPROGRAMMODULEACTIONMACHINEQC_SESSION_ID

QC_SESSION_SERIAL#CLIENT_IDIN and IS columns

SQL

P2TEXTP2P3TEXTP3WAIT_CLASSWAIT_CLASS_IDWAIT TIME

MACHINE

StatisticsTM_DELTA_TIMETM DELTA CPU TIMESQL

SQL_IDIS_SQLID_CURRENTSQL_CHILD_NUMBERSQL_OPCODESQL_OPNAMETOP LEVEL SQL ID

WAIT_TIMETIME_WAITEDCURRENT_OBJ#CURRENT_FILE#CURRENT_BLOCK#CURRENT_ROW#

TM_DELTA_CPU_TIMETM_DELTA_DB_TIMEDELTA_TIMEDELTA_READ_IO_REQUESTSDELTA_WRITE_IO_REQUESTSDELTA_READ_IO_BYTES

TOP_LEVEL_SQL_IDTOP_LEVEL_SQL_OPCODESQL_EXEC_IDSQL_EXEC_STARTSQL_PLAN_HASH_VALUESQL_PLAN_OPTIONS

Blocking SessionBLOCKING_SESSION_STATUSBLOCKING_SESSIONBLOCKING_SESSION_SERIAL#

OC G S

DELTA_WRITE_IO_BYTESDELTA_INTERCONNECT_IO_BYTESPGA_ALLOCATEDTEMP_SPACE_ALLOCATED

18 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

BLOCKING_INST_IDBLOCKING_HANGCHAIN_INFO

AWR SQL statsSQL> SELECT PLAN HASH VALUESQL> SELECT PLAN_HASH_VALUE,

2 , sum(EXECUTIONS_DELTA) as executions3 , sum(ROWS_PROCESSED_DELTA) as rows_processed4 , sum(ELAPSED_TIME_DELTA) as elapsed_time5 , sum(CPU_TIME_DELTA) as cpu_time, sum(IOWAIT_DELTA) as iowait_time6 , sum(DIRECT_WRITES_DELTA) as direct_writes7 , sum(BUFFER_GETS_DELTA) as LIO, sum(DISK_READS_DELTA) as PIO8 FROM dba_hist_sqlstat9 WHERE snap_id between 132042 and 132124

10 AND sql id = 'dkwucgaxxhm2z'10 AND sql_id dkwucgaxxhm2z11 GROUP BY sql_id, PLAN_HASH_VALUE, OPTIMIZER_ENV_HASH_VALUE;

Plan IOHash Rows Elapsed CPU WAIT Direct

Value EXECUTIONS Processed Time TIME TIME Writes LIO PIOValue EXECUTIONS Processed Time TIME TIME Writes LIO PIO---------- ---------- ---------- ---------- ---------- ----------- -------- -------- -------1700726234 1 5997889 7.3806E+10 903837577 73047955458 219418 36152215 6427679

1 row selected.

19 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

AWR SQL stats - readableSQL> SELECT PLAN HASH VALUE executionsSQL> SELECT PLAN_HASH_VALUE, executions

2 , round(elapsed_time /1000000/60/60,1) as elapsed_hours3 , rows_processed4 , round(cpu_time /elapsed_time * 100) as cpu_time_pct5 round(iowait time /elapsed time * 100) as iowait pct5 , round(iowait_time /elapsed_time 100) as iowait_pct6 , LIO, PIO, direct_writes7 , round(iowait_time /PIO/1000,1) as mili_sec_PIO8 FROM(SELECT PLAN_HASH_VALUE9 , sum(EXECUTIONS DELTA) as executions9 , sum(EXECUTIONS_DELTA) as executions

10 , sum(ROWS_PROCESSED_DELTA) as rows_processed11 , sum(ELAPSED_TIME_DELTA) as elapsed_time12 , sum(CPU_TIME_DELTA) as cpu_time, sum(IOWAIT_DELTA) as iowait_time13 , sum(DIRECT_WRITES_DELTA) as direct_writes14 , sum(BUFFER_GETS_DELTA) as LIO, sum(DISK_READS_DELTA) as PIO15 FROM dba_hist_sqlstat16 WHERE snap_id between 132042 and 13212417 AND sql_id = 'dkwucgaxxhm2z'18 GROUP BY sql id, PLAN HASH VALUE);q _ , _ _ );

Plan CPU IO MilisecHash Elapsed Rows TIME WAIT Direct /

Value EXECUTIONS Hours Processed PCT PCT LIO PIO Writes Pio---------- ---------- -------- ---------- ---- ----- ---------- ---------- -------- -------

20 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

1700726234 1 20.5 5,997,889 1 99 36,152,215 6,427,679 219,418 11.4

AWR SQL planSQL>select * from table(dbms xplan display awr('dkwucgaxxhm2z' 1700726234 nullSQL>select * from table(dbms_xplan.display_awr( dkwucgaxxhm2z , 1700726234, null, 'ALL LAST'));

----------------------------------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |----------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | | 9553K(100)| || 1 | NESTED LOOPS OUTER | | 8011K| 46G| | 9553K (1)| 31:50:39 || 2 | NESTED LOOPS OUTER | | 8011K| 45G| | 7148K (1)| 23 49 40 || 2 | NESTED LOOPS OUTER | | 8011K| 45G| | 7148K (1)| 23:49:40 || 3 | NESTED LOOPS OUTER | | 8011K| 45G| | 4743K (1)| 15:48:44 || 4 | NESTED LOOPS OUTER | | 8011K| 45G| | 3941K (1)| 13:08:24 || 5 | NESTED LOOPS OUTER | | 8011K| 44G| | 3140K (1)| 10:28:03 || 6 | HASH JOIN RIGHT OUTER | | 8011K| 44G| | 2338K (1)| 07:47:43 || 7 | VIEW | index$_join$_009 | 6633 | 285K| | 39 (3)| 00:00:01 || 8 | HASH JOIN | | | | | | || 9 | HASH JOIN | | | | | | || 10 | INDEX FAST FULL SCAN | S_SRC_M10 | 6633 | 285K| | 10 (0)| 00:00:01 || 11 | INDEX FAST FULL SCAN | S SRC M12 | 6633 | 285K| | 10 (0)| 00:00:01 || 11 | INDEX FAST FULL SCAN | S_SRC_M12 | 6633 | 285K| | 10 (0)| 00:00:01 || 12 | INDEX FAST FULL SCAN | S_SRC_P1 | 6633 | 285K| | 8 (0)| 00:00:01 || 13 | HASH JOIN RIGHT OUTER | | 8011K| 44G| 228M| 2338K (1)| 07:47:42 || 14 | TABLE ACCESS FULL | S_ORG_EXT_LSX | 7488K| 142M| | 38163 (2)| 00:07:38 || 15 | HASH JOIN RIGHT OUTER | | 8011K| 43G| | 51545 (1)| 00:10:19 || 16 | TABLE ACCESS FULL | S_INDUST_LANG | 4023 | 113K| | 199 (0)| 00:00:03 || 17 | HASH JOIN RIGHT OUTER | | 8011K| 43G| | 51289 (1)| 00:10:16 || 18 | TABLE ACCESS FULL | S_ORG_PRTNR | 324 | 43740 | | 8 (0)| 00:00:01 || 19 | NESTED LOOPS OUTER | | 8011K| 42G| | 51224 (1)| 00:10:15 || 20 | VIEW | | 8011K| 42G| | 51169 (1)| 00:10:15 || 20 | VIEW | | 8011K| 42G| | 51169 (1)| 00:10:15 || 21 | NESTED LOOPS | | | | | | || 22 | NESTED LOOPS | | 8011K| 8091M| | 51169 (1)| 00:10:15 || 23 | INDEX FULL SCAN | SO_ANA_BU_U2 | 19 | 285 | | 1 (0)| 00:00:01 || 24 | INDEX RANGE SCAN | S_ORG_EXT_M91 | 74493 | | | 35 (3)| 00:00:01 || 25 | TABLE ACCESS BY INDEX ROWID| S_ORG_EXT | 421K| 419M| | 2693 (1)| 00:00:33 || 26 | TABLE ACCESS BY INDEX ROWID | S_OU_PRTNR_TYPE | 1 | 94 | | 1 (0)| 00:00:01 || 27 | INDEX UNIQUE SCAN | S_OU_PRTNR_TYPE_P1 | 1 | | | 1 (0)| 00:00:01 || 28 | TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 || 29 | INDEX UNIQUE SCAN | S ORG EXT P1 | 1 | | | 1 (0)| 00:00:01 |_ _ _| 30 | TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 || 31 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 || 32 | TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 || 33 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 || 34 | TABLE ACCESS BY INDEX ROWID | S_ADDR_PER | 1 | 59 | | 1 (0)| 00:00:01 || 35 | INDEX UNIQUE SCAN | S_ADDR_PER_P1 | 1 | | | 1 (0)| 00:00:01 || 36 | TABLE ACCESS BY INDEX ROWID | S_ADDR_PER | 1 | 59 | | 1 (0)| 00:00:01 || 37 | INDEX UNIQUE SCAN | S_ADDR_PER_P1 | 1 | | | 1 (0)| 00:00:01 |----------------------------------------------------------------------------------------------------------------------

21 Copyright © 2011, Oracle and/or its affiliates. All rights reserved.

Find slow SQL (ASH in AWR)LECT sql id sql typeLECT sql_id, sql_type

, round(sample_cnt_sql/sample_cnt_total*100) as sample_pct, round(sample_cnt_sql /6/60,1) hours

FROM(SELECT DISTINCT sql_id, aa.name AS sql_type, COUNT(*) over (PARTITION BY sql_id) AS sample_cnt_sql, COUNT(*) over () AS sample_cnt_total

FROM dba_hist_active_sess_history ashJOIN dba_hist_snapshot s USING (dbid, INSTANCE_NUMBER, snap_id)JOIN audit actions aa on (ash.sql opcode = aa.action)JOIN audit_actions aa on (ash.sql_opcode aa.action)

WHERE begin_interval_time BETWEEN …

ORDER BY 3 desc)WHERE rownum <= 3;

SQL_TYPE SAMPLE_PCT HOURS------- -------- ---------- -----axxhm2z SELECT 25 20.4xxuacaf SELECT 21 16 8xxuacaf SELECT 21 16.8m3avn3j SELECT 12 10.1

selected.

ASH rowsource data (plan line id)LECT sql_id, sql_plan_line_id

, round(sample_cnt_plan_line/sample_cnt_total*100) AS sql_plan_line_pct, round(sample_cnt_plan_line/6) minutes

OM(SELECT DISTINCT sql id sql plan line idSELECT DISTINCT sql_id, sql_plan_line_id

, COUNT(*) over (PARTITION BY sql_plan_line_id) AS sample_cnt_plan_line , COUNT(*) over () AS sample_cnt_total

FROM dba_hist_active_sess_history ashJOIN dba_hist_snapshot s USING (dbid, INSTANCE_NUMBER, snap_id)

WHERE sql_id = 'dkwucgaxxhm2z‘ and begin_interval_time BETWEEN…

SQL_PLAN_LINE_ID SQL_PLAN_LINE_PCT MINUTES------- ---------------- ----------------- ----------axxhm2z 34 48 593axxhm2z 35 27 331axxhm2z 25 17 213

ASH rowsource (plan line id + event)ECT sql_id, sql_plan_line_id, event_ _ _ _round(sample_cnt_plan_line_event/sample_cnt_total*100) as plan_line_event_pctround(sample_cnt_plan_line_event/6) minutesOM (SELECT DISTINCT sql_id, sql_plan_line_id, nvl(event, 'CPU') as eventUNT(*) over (PARTITION BY sql plan line id event)AS sample cnt plan line eventUNT(*) over (PARTITION BY sql_plan_line_id,event)AS sample_cnt_plan_line_eventUNT(*) over () AS sample_cnt_total

FROM dba_hist_active_sess_history ashJOIN dba_hist_snapshot s USING (dbid, INSTANCE_NUMBER, snap_id)

WHERE sql_id = 'dkwucgaxxhm2z' and begin_interval_time BETWEEN ……

SQL_PLAN_LINE_ID EVENT PLAN_LINE_EVENT_PCT MINUTES----- ---------------- ------------------------- ------------------- ----------xhm2z 34 db file sequential read 48 591xhm2z 35 db file sequential read 27 328xhm2z 25 db file sequential read 17 212

selected.

ASH rowsource (10g) (object + event)ECT sql id object name eventECT sql_id, object_name, event , round(sample_cnt_object_event/sample_cnt_total*100) as object_event_pct , round(sample_cnt_object_event/6) minutes

M(SELECT DISTINCT sql_id, object_name, eventcount(*) over (partition by object_name,event) as sample_cnt_object_eventcount(*) over () as sample_cnt_total

ROM ( SELECT sql_id, nvl(event,'CPU') as event, case

when wait_class_id in (3871361733,1740759767,427450380,3875070507) then object name else 'N/A‘ end as object namethen object_name else N/A end as object_name

FROM dba_hist_active_sess_history ash…

OBJECT_NAME EVENT OBJECT_EVENT_PCT MINUTES----- -------------------- ------------------------- ---------------- ----------xhm2z S_ADDR_PER db file sequential read 52 634xhm2z S_ADDR_PER_P1 db file sequential read 28 347xhm2z S_ORG_EXT db file sequential read 16 195

AWR SQL plan-----------------------------------------------------------------------------------------------------------ration | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |-----------------------------------------------------------------------------------------------------------ECT STATEMENT | | | | | 9553K(100)| |STED LOOPS OUTER | | 8011K| 46G| | 9553K (1)| 31:50:39 |ESTED LOOPS OUTER | | 8011K| 45G| | 7148K (1)| 23:49:40 |NESTED LOOPS OUTER | | 8011K| 45G| | 4743K (1)| 15:48:44 |NESTED LOOPS OUTER | | 8011K| 45G| | 3941K (1)| 13:08:24 | NESTED LOOPS OUTER | | 8011K| 44G| | 3140K (1)| 10:28:03 || | | | | ( )| | HASH JOIN RIGHT OUTER | | 8011K| 44G| | 2338K (1)| 07:47:43 | VIEW | index$_join$_009 | 6633 | 285K| | 39 (3)| 00:00:01 | HASH JOIN | | | | | | | HASH JOIN | | | | | | | INDEX FAST FULL SCAN | S_SRC_M10 | 6633 | 285K| | 10 (0)| 00:00:01 | INDEX FAST FULL SCAN | S_SRC_M12 | 6633 | 285K| | 10 (0)| 00:00:01 | INDEX FAST FULL SCAN | S_SRC_P1 | 6633 | 285K| | 8 (0)| 00:00:01 | HASH JOIN RIGHT OUTER | | 8011K| 44G| 228M| 2338K (1)| 07:47:42 |

• IO is 99% of elapsed time• 75% of time in nested loop

(2,34,35)

• IO is 99% of elapsed time• 75% of time in nested loop

(2,34,35) TABLE ACCESS FULL | S_ORG_EXT_LSX | 7488K| 142M| | 38163 (2)| 00:07:38 | HASH JOIN RIGHT OUTER | | 8011K| 43G| | 51545 (1)| 00:10:19 | TABLE ACCESS FULL | S_INDUST_LANG | 4023 | 113K| | 199 (0)| 00:00:03 | HASH JOIN RIGHT OUTER | | 8011K| 43G| | 51289 (1)| 00:10:16 | TABLE ACCESS FULL | S_ORG_PRTNR | 324 | 43740 | | 8 (0)| 00:00:01 | NESTED LOOPS OUTER | | 8011K| 42G| | 51224 (1)| 00:10:15 | VIEW | | 8011K| 42G| | 51169 (1)| 00:10:15 | NESTED LOOPS | | | | | | |

( , , )• Query is processing a large

data set• Nested loop is not an efficient

method for joining large data

( , , )• Query is processing a large

data set• Nested loop is not an efficient

method for joining large data NESTED LOOPS | | 8011K| 8091M| | 51169 (1)| 00:10:15 | INDEX FULL SCAN | SO_ANA_BU_U2 | 19 | 285 | | 1 (0)| 00:00:01 | INDEX RANGE SCAN | S_ORG_EXT_M91 | 74493 | | | 35 (3)| 00:00:01 | TABLE ACCESS BY INDEX ROWID| S_ORG_EXT | 421K| 419M| | 2693 (1)| 00:00:33 | TABLE ACCESS BY INDEX ROWID | S_OU_PRTNR_TYPE | 1 | 94 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_OU_PRTNR_TYPE_P1 | 1 | | | 1 (0)| 00:00:01 | TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 |

method for joining large data sets

• Why does the CBO choose this inefficient plan ?!

– Bad stats?

method for joining large data sets

• Why does the CBO choose this inefficient plan ?!

– Bad stats?_ _ _ TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 |TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 |TABLE ACCESS BY INDEX ROWID | S_ADDR_PER | 1 | 59 | | 1 (0)| 00:00:01 |INDEX UNIQUE SCAN | S_ADDR_PER_P1 | 1 | | | 1 (0)| 00:00:01 |ABLE ACCESS BY INDEX ROWID | S_ADDR_PER | 1 | 59 | | 1 (0)| 00:00:01 |INDEX UNIQUE SCAN | S_ADDR_PER_P1 | 1 | | | 1 (0)| 00:00:01 |

– Incorrect optimizer settings?– Or something else?– Incorrect optimizer settings?– Or something else?

_ _ _-----------------------------------------------------------------------------------------------------------

AWR SQL statsELECT PLAN HASH VALUE executionsELECT PLAN_HASH_VALUE, executions

, round(elapsed_time /1000000/60/60,1) as elapsed_hours, rows_processed, round(cpu_time /elapsed_time * 100) as cpu_time_pctround(iowait time /elapsed time * 100) as iowait pct, round(iowait_time /elapsed_time 100) as iowait_pct

, LIO, PIO, direct_writes, round(iowait_time /PIO/1000,1) as mili_sec_PIO

FROM(SELECT PLAN_HASH_VALUE, sum(EXECUTIONS DELTA) as executions, sum(EXECUTIONS_DELTA) as executions, sum(ROWS_PROCESSED_DELTA) as rows_processed, sum(ELAPSED_TIME_DELTA) as elapsed_time, sum(CPU_TIME_DELTA) as cpu_time, sum(IOWAIT_DELTA) as iowait_time, sum(DIRECT_WRITES_DELTA) as direct_writes, sum(BUFFER_GETS_DELTA) as LIO, sum(DISK_READS_DELTA) as PIO

FROM dba_hist_sqlstatWHERE snap_id between 132042 and 132124

AND sql_id = 'dkwucgaxxhm2z'GROUP BY sql id, PLAN HASH VALUE);q _ , _ _ );

an CPU IO Milisecsh Elapsed Rows TIME WAIT Direct /ue EXECUTIONS Hours Processed PCT PCT LIO PIO Writes Pio-- ---------- -------- ---------- ----- ---- ---------- ---------- -------- -------34 1 20.5 5,997,889 1 99 36,152,215 6,427,679 219,418 11.4

AWR SQL Optimizer Env valuesect * from table(dbms xplan display awr('dkwucgaxxhm2z' 1700726234 nullect * from table(dbms_xplan.display_awr( dkwucgaxxhm2z , 1700726234, null, LAST +OUTLINE'));

------------------------------------------------------------------------------------------------------Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |------------------------------------------------------------------------------------------------------SELECT STATEMENT | | | | | 9553K(100)| |SELECT STATEMENT | | | | | 9553K(100)| |NESTED LOOPS OUTER | | 8011K| 46G| | 9553K (1)| 31:50:39 |

DataData------

EGIN_OUTLINE_DATAGNORE_OPTIM_EMBEDDED_HINTS_ _ _PTIMIZER_FEATURES_ENABLE('11.1.0.7')B_VERSION('11.1.0.7')PT_PARAM('_b_tree_bitmap_plans' 'false')PT_PARAM('_optim_peek_user_binds' 'false')PT PARAM('optimizer index cost adj' 10)PT_PARAM( optimizer_index_cost_adj 10)LL_ROWSUTLINE_LEAF(@"SEL$335DD26A")ERGE(@"SEL$3")

AWR SQL plan-------------------------------------------------------------------------------------------------------------peration | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |-------------------------------------------------------------------------------------------------------------ELECT STATEMENT | | | | | 9553K(100)| |NESTED LOOPS OUTER | | 8011K| 46G| | 9553K (1)| 31:50:39 |NESTED LOOPS OUTER | | 8011K| 45G| | 7148K (1)| 23:49:40 | NESTED LOOPS OUTER | | 8011K| 45G| | 4743K (1)| 15:48:44 | NESTED LOOPS OUTER | | 8011K| 45G| | 3941K (1)| 13:08:24 | NESTED LOOPS OUTER | | 8011K| 44G| | 3140K (1)| 10:28:03 || | | | | ( )| | HASH JOIN RIGHT OUTER | | 8011K| 44G| | 2338K (1)| 07:47:43 | VIEW | index$_join$_009 | 6633 | 285K| | 39 (3)| 00:00:01 | HASH JOIN | | | | | | | HASH JOIN | | | | | | | INDEX FAST FULL SCAN | S_SRC_M10 | 6633 | 285K| | 10 (0)| 00:00:01 | INDEX FAST FULL SCAN | S_SRC_M12 | 6633 | 285K| | 10 (0)| 00:00:01 | INDEX FAST FULL SCAN | S_SRC_P1 | 6633 | 285K| | 8 (0)| 00:00:01 | HASH JOIN RIGHT OUTER | | 8011K| 44G| 228M| 2338K (1)| 07:47:42 | TABLE ACCESS FULL | S_ORG_EXT_LSX | 7488K| 142M| | 38163 (2)| 00:07:38 | HASH JOIN RIGHT OUTER | | 8011K| 43G| | 51545 (1)| 00:10:19 | TABLE ACCESS FULL | S_INDUST_LANG | 4023 | 113K| | 199 (0)| 00:00:03 | HASH JOIN RIGHT OUTER | | 8011K| 43G| | 51289 (1)| 00:10:16 | TABLE ACCESS FULL | S_ORG_PRTNR | 324 | 43740 | | 8 (0)| 00:00:01 | NESTED LOOPS OUTER | | 8011K| 42G| | 51224 (1)| 00:10:15 | VIEW | | 8011K| 42G| | 51169 (1)| 00:10:15 | NESTED LOOPS | | | | | | |

DirectWrites DirectWrites

NESTED LOOPS | | 8011K| 8091M| | 51169 (1)| 00:10:15 | INDEX FULL SCAN | SO_ANA_BU_U2 | 19 | 285 | | 1 (0)| 00:00:01 | INDEX RANGE SCAN | S_ORG_EXT_M91 | 74493 | | | 35 (3)| 00:00:01 | TABLE ACCESS BY INDEX ROWID| S_ORG_EXT | 421K| 419M| | 2693 (1)| 00:00:33 | TABLE ACCESS BY INDEX ROWID | S_OU_PRTNR_TYPE | 1 | 94 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_OU_PRTNR_TYPE_P1 | 1 | | | 1 (0)| 00:00:01 | TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 |

--------219,418

workarea_size_policy=manualhash area size=2147483647

--------219,418

workarea_size_policy=manualhash area size=2147483647_ _ _

TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 | TABLE ACCESS BY INDEX ROWID | S_ORG_EXT | 1 | 42 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ORG_EXT_P1 | 1 | | | 1 (0)| 00:00:01 | TABLE ACCESS BY INDEX ROWID | S_ADDR_PER | 1 | 59 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ADDR_PER_P1 | 1 | | | 1 (0)| 00:00:01 |TABLE ACCESS BY INDEX ROWID | S_ADDR_PER | 1 | 59 | | 1 (0)| 00:00:01 | INDEX UNIQUE SCAN | S_ADDR_PER_P1 | 1 | | | 1 (0)| 00:00:01 |

hash_area_size=2147483647hash_area_size=2147483647

_ _ _-------------------------------------------------------------------------------------------------------------

New SQL Planrom table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));

------------------------------------------------------------------------------------------------------------------------------------------------------------ion | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| A-Rows | A-Time | Buffers | Reads | OMem | 1Mem | Used-Mem |------------------------------------------------------------------------------------------------------------------------------------------------------------STATEMENT | | 1 | | | 674K(100)| 0 |00:11:40.62 | 16M| 3031K| | | |

JOIN RIGHT OUTER | | 1 | 17M| 98G| 674K (2)| 5352K|01:20:42.29 | 16M| 3031K| 1143K| 1143K| 74M (0)| | index$_join$_010 | 1 | 6633 | 285K| 383 (1)| 6707 |00:00:01.93 | 749 | 725 | | | |

H JOIN | | 1 | | | | 6707 |00:00:01.93 | 749 | 725 | 1143K| 1143K| 73M (0)|SH JOIN | | 1 | | | | 6707 |00:00:01.07 | 680 | 659 | 1117K| 1117K| 73M (0)|NDEX FAST FULL SCAN | S SRC M10 | 1 | 6633 | 285K| 103 (0)| 6707 |00:00:00 08 | 338 | 328 | | | |NDEX FAST FULL SCAN | S_SRC_M10 | 1 | 6633 | 285K| 103 (0)| 6707 |00:00:00.08 | 338 | 328 | | | |NDEX FAST FULL SCAN | S_SRC_M12 | 1 | 6633 | 285K| 100 (0)| 6707 |00:00:00.17 | 342 | 331 | | | |DEX FAST FULL SCAN | S_SRC_P1 | 1 | 6633 | 285K| 76 (0)| 6707 |00:00:00.04 | 69 | 66 | | | |JOIN RIGHT OUTER | | 1 | 7460K| 41G| 674K (2)| 5352K|01:20:08.10 | 16M| 3030K| 1208M| 33M| 1455M (0)|

LE ACCESS FULL | S_ADDR_PER | 1 | 13M| 744M| 107K (2)| 14M|00:01:53.38 | 392K| 392K| | | |H JOIN RIGHT OUTER | | 1 | 7460K| 41G| 566K (2)| 5352K|01:17:16.78 | 16M| 2638K| 1208M| 33M| 1455M (0)|BLE ACCESS FULL | S_ADDR_PER | 1 | 13M| 744M| 107K (2)| 14M|00:02:21.69 | 392K| 392K| | | |SH JOIN RIGHT OUTER | | 1 | 7460K| 41G| 458K (2)| 5352K|01:14:39.07 | 15M| 2246K| 285M| 10M| 459M (0)|ABLE ACCESS FULL | S_ORG_EXT_LSX | 1 | 7488K| 142M| 38163 (2)| 6777K|00:01:55.31 | 173K| 138K| | | |ASH JOIN RIGHT OUTER | | 1 | 7460K| 40G| 420K (2)| 5352K|01:12:09.86 | 15M| 2107K| 445M| 18M| 606M (0)|| | | | | ( )| | : : | | | | | ( )|INDEX FAST FULL SCAN | S_ORG_EXT_W3 | 1 | 7068K| 276M| 26545 (1)| 6887K|00:04:56.19 | 154K| 102K| | | |HASH JOIN RIGHT OUTER | | 1 | 7460K| 40G| 393K (2)| 5352K|01:07:28.03 | 15M| 2005K| 445M| 18M| 606M (0)|INDEX FAST FULL SCAN | S_ORG_EXT_W3 | 1 | 7068K| 276M| 26545 (1)| 6887K|00:00:48.23 | 102K| 19057 | | | |HASH JOIN RIGHT OUTER | | 1 | 7460K| 40G| 367K (2)| 5352K|01:05:45.34 | 15M| 1986K| 445M| 18M| 606M (0)| INDEX FAST FULL SCAN | S_ORG_EXT_W3 | 1 | 7068K| 276M| 26545 (1)| 6887K|00:00:00.01 | 102K| 0 | | | | HASH JOIN RIGHT OUTER | | 1 | 7460K| 40G| 340K (2)| 5352K|01:05:35.55 | 15M| 1986K| 915K| 915K| 74M (0)| TABLE ACCESS FULL | S_INDUST_LANG | 1 | 4023 | 113K| 199 (0)| 4023 |00:00:00.04 | 713 | 709 | | | | HASH JOIN RIGHT OUTER | | 1 | 7460K| 39G| 340K (2)| 5352K|01:05:23.59 | 15M| 1985K| 899K| 899K| 74M (0)| TABLE ACCESS FULL | S_ORG_PRTNR | 1 | 324 | 43740 | 8 (0)| 319 |00:00:00.02 | 23 | 21 | | | |_ _ HASH JOIN RIGHT OUTER | | 1 | 7460K| 38G| 340K (2)| 5352K|01:05:23.46 | 15M| 1985K| 1593K| 1593K| 64M (0)| VIEW | index$_join$_014 | 1 | 1 | 94 | 1 (100)| 0 |00:00:00.06 | 3 | 2 | | | | HASH JOIN | | 1 | | | | 0 |00:00:00.06 | 3 | 2 | 1269K| 1269K| 64M (0)| INDEX FAST FULL SCAN| S_OU_PRTNR_TYPE_P1 | 1 | 1 | 94 | 0 (0)| 0 |00:00:00.02 | 3 | 2 | | | | INDEX FAST FULL SCAN| S_OU_PRTNR_TYPE_U1 | 0 | 1 | 94 | 0 (0)| 0 |00:00:00.01 | 0 | 0 | | | | VIEW | | 1 | 7460K| 38G| 340K (2)| 5352K|01:05:12.63 | 15M| 1985K| | | | HASH JOIN | | 1 | 7460K| 7527M| 340K (2)| 5352K|01:05:12.59 | 15M| 1985K| 1078K| 1078K| 72M (0)| INDEX FULL SCAN | SO_ANA_BU_U2 | 1 | 19 | 285 | 1 (0)| 19 |00:00:00.02 | 1 | 1 | | | | TABLE ACCESS FULL | S_ORG_EXT | 1 | 7068K| 7030M| 339K (2)| 6887K|01:05:18.93 | 15M| 1985K| | | |

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

Evaluating the changes

CPU IO Milisecsh Elapsed Rows TIME WAIT Direct /ue EXECUTIONS Hours Processed PCT PCT LIO PIO Writes PIO-- ---------- ---------- ---------- ---- ---- ----------- ---------- -------- ----------34 1 20.5 5,997,889 1 99 36,152,215 6,427,679 219,418 11.4

CPU IO Milisecsh Elapsed Rows TIME WAIT Direct /ue EXECUTIONS Hours Processed PCT PCT LIO PIO Writes PIO-- ---------- ---------- ---------- ---- ---- ----------- ---------- -------- ----------41 1 1.3 5,352,381 5 96 13,134,981 2,651,076 0 2

educed elapsed  time by 94%, Logical IO by 63% and Physical IO by 59% 

ut increased IOPS by 6x => ensure that disk subsystem can handle it !!!

Use Case 2 – Find sql & stats

SQL for the time period

D SQL_TYPE SAMPLE_PCT HOURS-------- ---------- ---------- ----------0c9tdj80 INSERT 11 3.9gt7ytnm9 SELECT 9 3.2wkk6x5b5 INSERT 7 2.6

for SQL dvaxm0c9tdj80Plan CPU IO milisecHash Elapsed Rows time WAIT Direct /

Value executions Minutes processed PCT PCT LIO PIO Writes PIO--- ---------- ---------- -------- ---------- ---- ---- ----------- ---------- -------- ---------29 4061473922 1 118 9,289 1 99 449,940 406,585 0 17-30 4061473922 1 236 6,754 0 100 408,245 406,481 0 35, , ,-01 4061473922 1 89 352 1 99 406,564 406,349 0 13-02 4061473922 1 145 7,383 1 99 410,586 406,358 0 21-03 4061473922 1 220 13,944 1 100 413,684 406,027 0 32

Use Case 2 – SQL detailsLLan

lect * from table(dbms_xplan.display_awr('dvaxm0c9tdj80', 4061473922, null, LAST’));

------------------------------------------------------------------------- Operation | Name | Rows | Bytes | Cost (%CPU)| Time |------------------------------------------------------------------------- INSERT STATEMENT | | | | 24155 (100)| |

INDEX FULL SCAN | S PARTY W1 | 911K| 17M| 24155 (1)| 00 04 50 | INDEX FULL SCAN | S_PARTY_W1 | 911K| 17M| 24155 (1)| 00:04:50 |-------------------------------------------------------------------------

TextText

T /*+APPEND*/ INTO S_ETL_I_IMG_70 (ROW_ID, MODIFICATION_NUM, OPERATION, LAST_UPD)

T ROW_ID, 1, 'I', LAST_UPD S_PARTY S_PARTY.LAST_UPD > :1;

Use Case 2 – SQL rowsource

SQL_PLAN_LINE_ID EVENT PLAN_LINE_EVENT_PCT MINUTES------- ---------------- ------------------------- ------------------- ----------c9tdj80 2 db file sequential read 100 235c9tdj80 2 CPU 0 1

or SQL dvaxm0c9tdj80

Plan CPU IO milisecHash Elapsed Rows time WAIT Direct /

Value executions Minutes processed PCT PCT LIO PIO Writes PIO--- ---------- ---------- -------- ---------- ---- ---- ----------- ---------- -------- ---------29 4061473922 1 118 9,289 1 99 449,940 406,585 0 17-30 4061473922 1 236 6,754 0 100 408,245 406,481 0 35-01 4061473922 1 89 352 1 99 406,564 406,349 0 13-02 4061473922 1 145 7,383 1 99 410,586 406,358 0 21-03 4061473922 1 220 13,944 1 100 413,684 406,027 0 32

Use Case 2 – Index Structure@i S PARTY@i S_PARTY

Unq? Part? Index name STATUS Column name DATA_TYPE- ---- ------ ----------- -------- -------------- ---------L NO NO S PARTY F1 VALID PAR PARTY ID VARCHAR2L NO NO S_PARTY_F1 VALID PAR_PARTY_ID VARCHAR2

S_PARTY_M1 VALID ROOT_PARTY_FLG CHARp …NO NO S_PARTY_W1 VALID LAST_UPD DATE

VALID ROW ID VARCHAR2

t IO is 99% of elapsed time

U i f t i d b t

VALID ROW_ID VARCHAR2ut based on modified version of Tim Gorman’s script at w.evdbt.com/tool.htm

ext

T /*+APPEND*/ INTO S_ETL_I_IMG_70 (ROW_ID, MODIFICATION_NUM, OPERATION, LAST_UPD)

T ROW ID, 1, 'I', LAST UPD

Using perfect index, but wrong access method

Why does the CBO choose this inefficient  plan ?!

B d t t ?_ _

S_PARTY S_PARTY.LAST_UPD > :1;

FULL SCAN | S_PARTY_W1

Bad stats? Incorrect optimizer settings? Or something else?

Use Case 2 – Bad stats?lect * from table(dbms xplan display awr('dvaxm0c9tdj80' 4061473922 nulllect * from table(dbms_xplan.display_awr('dvaxm0c9tdj80', 4061473922, null, LAST’));

------------------------------------------------------------------------- Operation | Name | Rows | Bytes | Cost (%CPU)| Time |------------------------------------------------------------------------- INSERT STATEMENT | | | | 24155 (100)| | INDEX FULL SCAN | S_PARTY_W1 | 911K| 17M| 24155 (1)| 00:04:50 |-------------------------------------------------------------------------

Use Case 2 – Replicate take 1plain plan forNSERT /*+APPEND*/ INTO S ETL I IMG 70NSERT /*+APPEND*/ INTO S_ETL_I_IMG_70

(ROW_ID, MODIFICATION_NUM, OPERATION, LAST_UPD)ELECT ROW_ID, 1, 'I', LAST_UPDROM S_PARTYHERE S_PARTY.LAST_UPD > :x;

ned.

lect * from table(dbms_xplan.display(null, null, 'ALLSTATS LAST'));p …--------------------------------------------------------------------------------------------------------------| Operation | Name | E-Rows |-------------------------------------------------------| INSERT STATEMENT | | 913K|| LOAD TABLE CONVENTIONAL | S_ETL_I_IMG_70 | || INDEX RANGE SCAN | S_PARTY_W1 | 913K|-------------------------------------------------------cate Information (identified by operation id):----------------------------------------------- access("S PARTY"."LAST UPD">:X)access( S_PARTY . LAST_UPD >:X)

Statistics HistoryWRI$_OPTSTAT_TAB_HISTORYWRI$_OPTSTAT_IND_HISTORYEtc.

Use Case 2 – bind data typelect distinct name was captured last capturedlect distinct name, was_captured, last_capturedsys.anydata.gettypename(value_anydata) as data_typesys.anydata.accesstimestamp(value_anydata) as data_valuerom DBA_HIST_SQLBIND where sql_id = 'dvaxm0c9tdj80’ order by last_captured;

wascaptured LAST_CAPTURED DATA_TYPE DATA_VALUE-------- ------------------------- -------------------- --------------------YES 2011-06-29 17:51:44 SYS.TIMESTAMP 2011-06-28 08:12:58YES 2011-06-30 18:16:03 SYS TIMESTAMP 2011-06-29 17:01:20YES 2011 06 30 18:16:03 SYS.TIMESTAMP 2011 06 29 17:01:20YES 2011-07-01 03:21:51 SYS.TIMESTAMP 2011-06-30 17:01:11YES 2011-07-02 17:59:52 SYS.TIMESTAMP 2011-07-01 03:03:19YES 2011-07-03 17:59:08 SYS.TIMESTAMP 2011-07-02 17:01:38

Unq? Part? Index name STATUS Column name DATA_TYPE- ---- ------ ----------- -------- -------------- ---------L NO NO S PARTY F1 VALID PAR PARTY ID VARCHAR2L NO NO S_PARTY_F1 VALID PAR_PARTY_ID VARCHAR2

S_PARTY_M1 VALID ROOT_PARTY_FLG CHARp …NO NO S_PARTY_W1 VALID LAST_UPD DATE

VALID ROW_ID VARCHAR2

Use Case 2 – Replicate (2nd try)eclareeclare x timestamp;

begin INSERT /*+APPEND*/ INTO S_ETL_I_IMG_70

(ROW ID MODIFICATION NUM OPERATION LAST UPD) (ROW_ID, MODIFICATION_NUM, OPERATION, LAST_UPD) SELECT ROW_ID, 1, 'I', LAST_UPD FROM S_PARTY WHERE S_PARTY.LAST_UPD > :x;

end;end;/

-------------------------------------------------------d | Operation | Name | E-Rows |d | Operation | Name | E Rows |-------------------------------------------------------0 | INSERT STATEMENT | | |1 | LOAD TABLE CONVENTIONAL | | |2 | INDEX FULL SCAN | S PARTY W1 | 913K|2 | INDEX FULL SCAN | S_PARTY_W1 | 913K|-------------------------------------------------------dicate Information (identified by operation id):------------------------------------------------2 - filter(INTERNAL FUNCTION("S PARTY"."LAST UPD")>:B1)2 filter(INTERNAL_FUNCTION( S_PARTY . LAST_UPD )>:B1)

Use Case 2: Visualizing the improvementp o e e t

IMG Process Duration

2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

ETL Day

Free script collections

• Tanel Poder• tech.e2sn.com/oracle-scripts-and-tools

• Kerry Osborne -• kerryosborne.oracle-guy.com/papers/my_favorite_scripts_2010.zip

• Tim Gorman• Tim Gorman• evdbt.com/tools.htm

• Adrian Billington• oracle-developer.net/utilities.php

• Jonathan Lewis• jonathanlewis wordpress com/2009/12/18/simple scripts/• jonathanlewis.wordpress.com/2009/12/18/simple-scripts/

SQL Tuning Forms Tuning

ResourcesSQL Tuning

– Trace files– SQLT output (MOS Doc: 215187.1)– Trace Analyzer (MOS Doc :

Forms Tuning– Forms Tracing (MOS Doc : 373548.1)– Generic MOS Doc : 438652.1

Trace Analyzer (MOS Doc : 224270.1)

– AWR Report (MOS Doc : 748642.1)– AWR SQL Report (awrsqrpt.sql)

SQ

Reports Tracing– MOS Doc: 111311.1

– 11g Real-Time SQL Monitoring – SQL Tuning Advisor

PL/SQL Tuning

Database Tuning– AWR Report (MOS Doc : 748642.1)– ADDM report (MOS Doc : 250655.1)

PL/SQL Tuning– Product logs– PL/SQL Profiler (MOS Doc :

808005.1)

– Active Session History (ASH) Report – LTOM output (MOS Doc : 352363.1)

OS

Middletier Tuning– JVM Logs

OS– OSWatcher (MOS Doc : 301137.1)

– Third Party Tools

To learn even more

• Performance Fundamentals for Oracle Database 10g and 11g by Graham Wood and John Beresniewicz (http://www.oracle.com/technetwork/database/focus-areas/manageability/db-perf-tuning-ow08-131582.pdf)

• ASH website by Kyle Hailey (https://sites.google.com/site/embtdbo/wait-event-documentation/ash---active-session-history)

• Expert Oracle Database Architecture: Oracle Database 9i 10g• Expert Oracle Database Architecture: Oracle Database 9i, 10g, and 11g Programming Techniques and Solutions by Thomas Kyte

• Troubleshooting Oracle Performance by Christian Antognini

• Blogs• Blogs– Tanel Poder, Kerry Osborne, Jonathan Lewis, Cary Millsap, Greg

Rahn, Randolf Geist, etc.

Summary

• Ask questions• Understand the database internals• Understand the database internals • Use multiple tools depending on the situation• Combine the best of both (i e PerfSheet from TanelCombine the best of both (i.e. PerfSheet from Tanel

Poder)

Q&AQ&A