SlideShare a Scribd company logo
1 of 68
Download to read offline
My Experience Using SQL Plan Baselines 
Nelson Calero 
August 2014 
OTN Latin America Tour
About me 
•Database Consultant at Pythian 
•Computer Engineer 
•Oracle Certified Professional DBA 10g/11g 
•Working with Oracle tools and Linux environments since 1996 
•DBA Oracle (since 2001) & MySQL (since 2005) 
•Oracle University Instructor 
•Co-founder and President of the Oracle user Group of Uruguay 
•LAOUC Director of events 
•Blogger 
•Frequent speaker: Oracle Open World, Collaborate, OTN Tour, JIAP, MySQL/NoSQL conferences 
http://www.linkedin.com/in/ncalero @ncalerouy 
2 © 2014 Pythian Confidential
Pythianoverview 
•17 Years of data infrastructure management consulting 
•170+ Top brands 
•10000+ Systems under management 
•Over 200 DBAs in 28 countries 
•Top 5% of DBA work force, 9 Oracle ACEs, 4 Microsoft MVPs 
•Oracle, Microsoft, MySQL, Netezza, Hadoop, MongoDB, Oracle Apps, Enterprise Infrastructure 
3 © 2014 Pythian Confidential
Why SQL Plan Management? 
•Oracle has several functionalities to help troubleshoot performance of SQL 
•There is a lot of information online, official and by the community 
–https://blogs.oracle.com/optimizer/is the Optimizer Team! 
–OTN Virtual Technology summit lab –Create and evolve a Baseline: http://www.oracle.com/technetwork/articles/database/create-sql-plan- baseline-2237506.html 
Share my experience using it on production environments 
•RAC and single instance 
•Closed source applications (Black Box) 
•1000+ users, 40+ concurrent 
4 © 2014 Pythian Confidential
Today’s topics 
•What is SQL Plan Management? 
•Simple example 
–SQL matching 
–Plan matching 
–New plan generation 
–Helper scripts 
•Evolution on 11g / 12c 
•Challenges 
•Troubleshooting 
•Daily management 
–11g suggested approach 
5 © 2014 Pythian Confidential
Introduction to SQL Plan Management 
•SQL Plan Management is a new feature of Oracle 11.1 with no extra cost, available on Enterprise edition, enabled by default. 
•The Oracle Optimizer is able to use only well-known execution plans, avoiding the usage of others plans we know inferior performance (regression). 
What 
Why 
How 
6 © 2014 Pythian Confidential
Introduction to SQL Plan Management 
Changes in SQL plan execution can lead to worse execution times, and can impact system performance. It can be caused from a variety of reasons: 
–Optimizer version, statistics, and parameters 
–Structural objects changes (datatype, indexes, partitions) 
–System settings 
–System growth (skewed data, concurrency) 
–And many more. See additional reason here: http://jonathanlewis.wordpress.com/2013/12/23/plan-changes/ 
Oracle Database already has several ways to control plan execution that works at different stages in the cost based Optimizer: 
•Stored Outlines (deprecated in 11.1) 
•SQL Profiles: adds statistics to the plan evaluation phase of the Optimizer (DBMS_SQLTUNE) 
•SQL Hints: forces the optimizer to follow a specific path/action 
What 
Why 
How 
7 © 2014 Pythian Confidential
Introduction to SQL Plan Management 
•Baselines are new objects stored on SYSAUX tablespace(SMB area) 
•Each SQL statement can have many baselines 
•Only enabledand acceptedplans are used 
•Fixed plans take precedence, and no new plans are auto added 
•Stages: plan load –plan selection –plan evolution 
•New evolve advisor autotaskin 12c 
•SQL needs to run more than once to be considered 
•Baselines are global -not per schema 
Initialization parameters 
•OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES (Default: FALSE) 
•OPTIMIZER_USE_SQL_PLAN_BASELINES (Default: TRUE) 
What 
Why 
How 
8 © 2014 Pythian Confidential
Introduction to SQL Plan Management -How 
Old history 
SQL is issued 
Execution plan is generated 
SQL is executed 
Oracle Cost Based Optimizer (CBO) 
Before 11g 
9 © 2014 Pythian Confidential
Introduction to SQL Plan Management -How 
Baselines are the last step evaluated by the Oracle Optimizer: if an enabledand acceptedplan for the statement exists, it will be used, maybe discarding the already generated plan. 
SQL is issued 
Execution plan is generated 
SQL is executed 
Oracle Cost Based Optimizer (CBO) 
Since 11g 
10 © 2014 Pythian Confidential
Introduction to SQL Plan Management -How 
http://docs.oracle.com/database/121/TGSQL/tgsql_spm.htm#TGSQL626 
Oracle Cost Based Optimizer (CBO) 
Since 11g 
11 © 2014 Pythian Confidential
SPM example –setup 
SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 7 23:46:48 2014 
Copyright (c) 1982, 2011, Oracle. All rights reserved. 
Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 -64bit Production 
With the Partitioning, OLAP, Data Mining and Real Application Testing options 
SQL> create table pp(n number, c varchar2(100)); 
Table created. 
SQL> insert into pp select rownum, object_idfrom dba_objectswhere rownum< 100; 
99 rows created. 
SQL> create index pp_idxon pp(n); 
Index created. 
SQL> exec dbms_stats.gather_table_stats(user, ‘PP'); 
PL/SQL procedure successfully completed. 
12 © 2014 Pythian Confidential
SPM example –capture SQL execution 
SQL> alter session set optimizer_capture_sql_plan_baselines= TRUE; 
Session altered. 
SQL> varn number; 
SQL> exec :n := 1; 
PL/SQL procedure successfully completed. 
SQL> select * from pp where n=:n; 
N C 
------------------------------------------------------------------------ 
1 20 
SQL> / 
N C 
------------------------------------------------------------------------ 
1 20 
SQL> alter session set optimizer_capture_sql_plan_baselines= FALSE; 
Session altered. 
13 © 2014 Pythian Confidential
SPM example –SQL and baseline matching 
select signature, sql_handle, plan_name, enabled, accepted, fixed, sql_text 
from dba_sql_plan_baselines; 
SIGNATURE SQL_HANDLE PLAN_NAME ENA ACC FIX SQL_TEXT 
-------------------------------------------------------------------------------------------------- 
1245871306398155660SQL_114a395a2db6c38c SQL_PLAN_12kjtb8qvdhwc8a71e415 YES YESNO select * from pp 
select sql_id, exact_matching_signature, sql_text 
from v$sql 
where sql_textlike 'select * from pp %'; 
SQL_IDEXACT_MATCHING_SIGNATURE SQL_TEXT 
------------------------------------------------------------------- 
0a14b3yhux0401245871306398155660select * from pp where n=:n 
14 © 2014 Pythian Confidential
SPM example –SQL and baseline matching 
Our Baseline: 
select signature, plan_namefrom dba_sql_plan_baselines; 
SIGNATURE PLAN_NAME 
------------------------------------------ 
1245871306398155660 SQL_114a395a2db6c38c 
select * from pp where n=:n; 
select * from pp where n=2; 
select * from pp where n=1; 
select sql_id, exact_matching_signature, force_matching_signature, sql_text 
from v$sql 
where sql_textlike 'select * from pp %'; 
SQL_IDEXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE SQL_TEXT 
------------------------------------------------------------------------------------------- 
D387kpdvh4anb 11466572521187337874 15110712337079575277 select * from pp where n=2 
0a14b3yhux04012458713063981556601245871306398155660 select * from pp where n=:n 
86svufrd72xqg14183734311806369169 15110712337079575277select * from pp where n=1 
15 © 2014 Pythian Confidential
SPM example –plan from last run in SGA 
SQL> select * from table(dbms_xplan.display_cursor); 
SQL_ID0a14b3yhux040, child number 1 
------------------------------------- 
select * from pp where n=:n 
Plan hash value: 2547524127 
-------------------------------------------------------------------------------------- 
| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time | 
-------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT||| | 2 (100)| | 
| 1 | TABLE ACCESS BY INDEX ROWID| PP |1 | 6 | 2 (0)| 00:00:01 | 
|* 2 | INDEX RANGE SCAN| PP_IDX |1 | | 1 (0)| 00:00:01 | 
-------------------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
2 -access("N"=:N) 
Note 
-SQL plan baseline SQL_PLAN_12kjtb8qvdhwcdeb317bfused for this statement 
16 © 2014 Pythian Confidential
SPM example –hints/plan used by Baseline 
SQL> select * from table(dbms_xplan.display_sql_plan_baseline( 
plan_name=> 'SQL_PLAN_12kjtb8qvdhwcdeb317bf', format => 'OUTLINE')); 
-------------------------------------------------------------------------------- 
SQL handle: SQL_114a395a2db6c38c 
SQL text: select * from pp where n=:n 
-------------------------------------------------------------------------------- 
Plan name: SQL_PLAN_12kjtb8qvdhwcdeb317bfPlanid: 3736278975 
Enabled: YESFixed: NOAccepted: YESOrigin: AUTO-CAPTURE 
-------------------------------------------------------------------------------- 
Outline Data from SMB: 
/*+ 
BEGIN_OUTLINE_DATA 
INDEX_RS_ASC(@"SEL$1" "PP"@"SEL$1" ("PP"."N")) 
OUTLINE_LEAF(@"SEL$1") 
ALL_ROWS 
DB_VERSION('11.2.0.3') 
OPTIMIZER_FEATURES_ENABLE('11.2.0.3') 
IGNORE_OPTIM_EMBEDDED_HINTS 
END_OUTLINE_DATA 
*/ 
17 
Where is the 
Plan hash value? 
2547524127 
© 2014 Pythian Confidential
SPM example –view definition 
select text from dba_viewswhere view_name='DBA_SQL_PLAN_BASELINES'; 
SELECT /*+ dynamic_sampling(3) */ 
so.signature, 
st.sql_handle, 
... 
DECODE(BITAND(so.flags, 1), 1, 'YES', 'NO'), --enabled 
DECODE(BITAND(so.flags, 2), 2, 'YES', 'NO'), --accepted 
... 
FROM 
sqlobj$ so, 
sqlobj$auxdataad, 
sql$textst 
WHERE 
so.signature= st.signatureAND 
ad.signature= st.signatureAND 
so.signature= ad.signatureAND 
so.plan_id= ad.plan_idAND 
so.obj_type= 2 AND 
ad.obj_type= 2 
18 © 2014 Pythian Confidential
SPM example –similar now including PHV2 
SELECT /*+ dynamic_sampling(3) */ so.signature, so.name plan_name, 
DECODE(BITAND(so.flags, 1), 1, 'YES', 'NO') enabled, 
DECODE(BITAND(so.flags, 2), 2, 'YES', 'NO') accepted, 
so.plan_idphv2 
FROM 
sqlobj$ so, 
sqlobj$auxdataad, 
sql$textst 
WHERE 
so.signature= st.signatureAND 
ad.signature= st.signatureAND 
so.signature= ad.signatureAND 
so.plan_id= ad.plan_idAND 
so.obj_type= 2 AND 
ad.obj_type= 2; 
SIGNATURE PLAN_NAME ENA ACC PHV2 
------------------------------------------------------------------- 
1245871306398155660 SQL_PLAN_12kjtb8qvdhwc8a71e415 YES YES2322719765 
19 © 2014 Pythian Confidential
SPM example –SQL matching plan number 
col phv2 for 9999999999 
SELECT p.sql_id, p.plan_hash_value, p.child_number, x.phv2 
FROM v$sql_planp 
,xmltable('for $iin /other_xml/info where $i/@type eq"plan_hash_2" return $i' 
passing xmltype(p.other_xml) columns phv2 number path '/') x 
WHERE p.sql_id= '0a14b3yhux040' 
and p.other_xmlis not null; 
SQL_IDPLAN_HASH_VALUE CHILD_NUMBER PHV2 
------------------------------------------------------------ 
0a14b3yhux040 29329474960 2322719765 
Our previous result from the almost similar to DBA_SQL_PLAN_BASELINES: 
SIGNATURE PLAN_NAME ENA ACC PHV2 
------------------------------------------------------------------- 
1245871306398155660 SQL_PLAN_12kjtb8qvdhwc8a71e415 YES YES2322719765 
20 © 2014 Pythian Confidential
Introduction to SQL Plan Management -How 
•Important attributes of a baseline (DBA_SQL_PLAN_BASELINES): 
•ENABLED –this can be used if accepted 
•ACCEPTED –this can be used if enabled 
•FIXED –use this as preferred–no evolution 
•PARSING_SCHEMA_NAME 
•ADAPTIVE –new in 12c 
•Purging policy –weekly autotaskto delete unused plans. Parameters: 
•SPACE_BUDGET_PERCENT -% used -default 10 -alert.log 
•PLAN_RETENTION_WEEKS –to delete non used plans -default 53 
•DBA_SQL_MANAGEMENT_CONFIG view 
•Can be changed using DBMS_SPM.CONFIGURE 
21 © 2014 Pythian Confidential
SQL Plan Management objects 
SPM included in the SQL Management Base (SMB). 
SBM also has: 
–Statement log –SQL$ 
–Baselines plan history (12c) -SQLOBJ$PLAN 
–SQL plan baselines 
•DBA_SQL_PLAN_BASELINES view 
•DBMS_SPM package 
–SQL profiles 
•DBA_SQL_PROFILES view 
•DBMS_SQLTUNE / DBMS_AUTO_SQLTUNE package 
22 © 2014 Pythian Confidential
When to use SPM 
•Just another tool for performance management 
•Database upgrade: known plans can be captured/exported/imported 
•Third party applications: can include exported baselines to guarantee known behaviour 
What is automated by advisors? 
•SQL Tuning Advisor (Tuning pack licence!) -SYS_AUTO_SQL_TUNING_TASK 
–Create profiles (and baseline if present) if ACCEPT_SQL_PROFILES parameter is TRUE 
–Manually using DBMS_AUTO_SQLTUNE.ACCEPT_SQL_PROFILE 
•Evolve advisor on 12c -SYS_AUTO_SPM_EVOLVE_TASK(more later) 
–parameter ACCEPT_PLANS defaults TRUE 
All good things without extra effort? 
•Forces us to follow the evolution of SQLs who uses it 
–blindly trust is not a good idea 
•Needs a good understanding to explain why an existing baseline is not used 
23 © 2014 Pythian Confidential
More than just plan selection 
Plan load/capture and evolution 
Creating new Baselines manually: 
•capture plans being in use by the instance 
–OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE 
•load plans from cursor cache 
–DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE 
•load plans from SQL tuning set -Oracle Tuning Pack license 
–DBMS_SPM.LOAD_PLANS_FROM_SQLSET 
New baselines are generated automatically: 
•for statement that already have Baselines created (when new plans are parsed by the optimizer, as non accepted) –it is not capture! 
•when creating a SQL Profile on a statement that has Baseline (as accepted) 
Non accepted plans become acceptedbecause evolution or DBMS_SPM attribute change 
24 © 2014 Pythian Confidential
New plan generation 
SQL> alter index pp_idxinvisible; 
Index altered. 
SQL> select * from pp where n=:n; 
N C 
------------------------------------------------------- 
1 20 
SQL> select * from table(dbms_xplan.display_cursor); 
SQL_ID 0a14b3yhux040, child number 1 
------------------------------------- 
select * from pp where n=:n 
Plan hash value: 2932947496 
-------------------------------------------------------------------------- 
| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time| 
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |||| 2 (100)| | 
|* 1 | TABLE ACCESS FULL| PP | 1 | 6 | 2 (0)| 00:00:01 | 
-------------------------------------------------------------------------- 
25 © 2014 Pythian Confidential
New plan generation 
select sql_handle, plan_name, enabled, accepted, fixed, reproduced, sql_text 
from dba_sql_plan_baselines; 
SQL_HANDLEPLAN_NAMEENA ACC FIX REP SQL_TEXT 
-------------------------------------------------------------------------------------------- 
SQL_114a395a2db6c38c SQL_PLAN_12kjtb8qvdhwc8a71e415 YES NO NOYES select * from pp where n=:n 
SQL_114a395a2db6c38c SQL_PLAN_12kjtb8qvdhwcdeb317bfYES YESNO NOselect * from pp where n=:n 
As the existing baseline could not be reproduced, a new plan was used, and automatically added as non accepted. 
Which plan was the original? 
select * from table(dbms_xplan.display_sql_plan_baseline( 
plan_name=> 'SQL_PLAN_12kjtb8qvdhwcdeb317bf')); 
26 © 2014 Pythian Confidential
New plan generation –11g shows wrong plan 
-------------------------------------------------------------------------------- 
SQL handle: SQL_114a395a2db6c38c 
SQL text: select * from pp where n=:n 
------------------------------------------------------------------------------- 
Plan name: SQL_PLAN_12kjtb8qvdhwcdeb317bfPlan id: 3736278975 
Enabled: YESFixed: NOAccepted: YESOrigin: AUTO-CAPTURE 
-------------------------------------------------------------------------------- 
Plan hash value: 2932947496 
-------------------------------------------------------------------------- 
| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time| 
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT || 1 | 6 | 2 (0)| 00:00:01 | 
|* 1 | TABLE ACCESS FULL| PP | 1 | 6 | 2 (0)| 00:00:01 | 
-------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
1 -filter("N"=TO_NUMBER(:N)) 
27 © 2014 Pythian Confidential
New plan generation –12c shows correct plan 
-------------------------------------------------------------------------------- 
SQL handle: SQL_114a395a2db6c38c 
SQL text: select * from pp where n=:n 
------------------------------------------------------------------------------- 
Plan name: SQL_PLAN_12kjtb8qvdhwcdeb317bfPlan id: 3736278975 
Enabled: YESFixed: NOAccepted: YESOrigin: AUTO-CAPTURE 
-------------------------------------------------------------------------------- 
Plan hash value: 452276032 
------------------------------------------------------------------------------------------------------ 
| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time | 
------------------------------------------------------------------------------------------------------ 
| 0 | SELECT STATEMENT|||| 2 (100)| | 
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| PP |1 |6 | 2 (0)| 00:00:01 | 
|* 2 | INDEX RANGE SCAN| PP_IDX |1 || 1 (0)| 00:00:01 | 
------------------------------------------------------------------------------------------------------ 
… 
28 © 2014 Pythian Confidential
No misunderstandings 
Each SQL Baseline stores the original SQL execution plan? 
–11g: no, it regenerates the plan using captured data 
•SQLOBJ$AUXDATA 
•dbms_xplan.display_sql_plan_baselinecan show a plan different from the original captured 
–12c: stores the original execution plan 
•SQLOBJ$PLAN 
29 © 2014 Pythian Confidential
Scripts for creating new Baselines 
•SQLTXPLAIN (SQLT) -MOS note 215187.1 
–Tool that helps to diagnose SQL statements performing poorly 
–coe_load_sql_baseline.sql–allows to add a plan generated by a modified SQL to the original 
–Also useful when loading a plan from AWR (must go through SQL tuning set) 
30 © 2014 Pythian Confidential
Using SQLT to binda modifiedplan 
SQL_IDEXACT_MATCHING_SIGNATURE PLAN_HASH_VALUE CHILD SQL_TEXT 
--------------------------------------------------------------------------------------------------- 
fxdv1cmv8cksa687377043604823894329329474960 select /*+ FULL(pp) */ * from pp where n =:n 
0a14b3yhux0401245871306398155660452276032 0 select * from pp where n=:n 
SQL> select * from dba_sql_plan_baselines; 
no rows selected 
SQL> stacoe_load_sql_baseline0a14b3yhux040fxdv1cmv8cksa 2932947496 
… 
Plans Loaded: 1 
sys_sql_handle: "SQL_114a395a2db6c38c" 
sys_plan_name: "SQL_PLAN_12kjtb8qvdhwc8a71e415" 
SQL> select * from pp where n=:n; 
SQL_IDEXACT_MATCHING_SIGNATURE PLAN_HASH_VALUE CHILD SQL_TEXT 
--------------------------------------------------------------------------------------------------- 
fxdv1cmv8cksa687377043604823894329329474960 select /*+ FULL(pp) */ * from pp where n =:n 
0a14b3yhux0401245871306398155660452276032 0 select * from pp where n=:n 
0a14b3yhux040124587130639815566029329474961 select * from pp where n=:n 
31 © 2014 Pythian Confidential
How SQL Plan Management interact with ...? 
•Stored Outlines (desupportannounced on 11.1) 
•SQL Profiles –since 10g 
•Adaptive Cursor Sharing (ACS) –new 11g 
•Adaptive Query Optimization (12c) 
–Adaptive Plans (joins and parallel distribution methods) 
–Adaptive Statistics (at compile time and at runtime)) 
32 © 2014 Pythian Confidential
How SQL Plan Management interact with ...? 
•Stored Outlines (desupportannounced on 11.1) 
•SQL Profiles –since 10g 
•Adaptive Cursor Sharing (ACS) –new 11g 
•Adaptive Query Optimization (12c) 
–Adaptive Plans (joins and parallel distribution methods) 
–Adaptive Statistics (at compile time and at runtime)) 
Affects plan selection/creation, but SPM is the last step! 
Some bugs in the past with profiles+baselines-12980183 
ACS and SPM demo: https://blogs.oracle.com/optimizer/resource/acs-spm- figures/acs-spm-script.sql 
33 © 2014 Pythian Confidential
Management of new plans (evolution) 
Only better performing plans are accepted considering elapsed time, logical IO and CPU time 
–Plan reproducibility plays here (ACS/Binds) 
11g: manually using DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE 
12c: new Evolve Advisor configured as a daily autotask 
–SYS_AUTO_SPM_EVOLVE_TASK 
–Result report using DBMS_SPM.REPORT_AUTO_EVOLVE_TASK 
–Automatically accepts new baselines performing better 
•parameter ACCEPT_PLANS defaults TRUE 
–Manuallytoo with DBMS_SPM.CREATE_EVOLVE_TASK 
–DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE deprecated 
34 © 2014 Pythian Confidential
Plan evolution in 11g 
set long 100000 
vare clob; 
exec :e := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE( 
SQL_HANDLE=>'SQL_114a395a2db6c38c', 
COMMIT => 'NO'); 
print; 
35 © 2014 Pythian Confidential
Evolve SQL Plan Baseline Report 
------------------------------------------------------------------------------- 
Inputs: 
------- 
SQL_HANDLE = SQL_114a395a2db6c38c 
PLAN_NAME = 
TIME_LIMIT = DBMS_SPM.AUTO_LIMIT 
VERIFY = YES 
COMMIT = NO 
Plan: SQL_PLAN_12kjtb8qvdhwc8a71e415 
------------------------------------ 
Plan was verified: Time used .06 seconds. 
Plan failed performance criterion: 1.02 times better than baseline plan. 
Baseline Plan Test Plan Stats Ratio 
--------------------------------- 
Execution Status: COMPLETE COMPLETE 
Rows Processed: 1 1 
Elapsed Time(ms): .494 .101 4.89 
CPU Time(ms): .444 .111 4 
Buffer Gets: 2 2 1 
Physical Read Requests: 0 0 
Physical Write Requests: 0 0 
Physical Read Bytes: 0 0 
Physical Write Bytes: 0 0 
Executions: 1 1 
36 
-------------------------------------------- 
Report Summary 
-------------------------------------------- 
Number of plans verified: 1 
Number of plans accepted: 0 
© 2014 Pythian Confidential
Plan evolution in 11g 
Continuing with our example: 
–invisible index 
set long 100000 
vare clob; 
exec :e := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE( 
SQL_HANDLE=>'SQL_114a395a2db6c38c', 
COMMIT => 'NO'); 
print; 
---------------------------------------------------------- 
Evolve SQL Plan Baseline Report 
---------------------------------------------------------- 
Inputs: 
------- 
SQL_HANDLE = SQL_114a395a2db6c38c 
PLAN_NAME = 
TIME_LIMIT = DBMS_SPM.AUTO_LIMIT 
VERIFY = YES 
COMMIT = NO 
Plan: SQL_PLAN_12kjtb8qvdhwc8a71e415 
------------------------------------ 
Plan was not verified. 
Using cost-based plan as could not reproduce any 
accepted and enabled baseline plan. 
----------------------------------------------------------- 
Report Summary 
----------------------------------------------------------- 
Number of plans verified: 0 
Number of plans accepted: 0 
37 © 2014 Pythian Confidential
Plan evolution in 11g –results examples 
Plan: SQL_PLAN_12kjtb8qvdhwc8a71e415 
------------------------------------ 
Plan was verified: Time used 7,932 seconds. 
Plan failed performance criterion: performance equal to baseline plan. 
Plan was verified: Time used 152,247 seconds. 
Plan failed performance criterion: 1,20 times worse than baseline plan. 
Plan was verified: Time used 37,411 seconds. 
Plan failed performance criterion: 17,5 times worse than baseline plan. 
Plan was verified: Time used 314,085 seconds. 
Plan verification timed out. 
Plan was verified: Time used 32,618 seconds. 
Error encountered during plan verification (ORA-16960). 
ORA-16960: SQL Analyze no ha podidoreproducirel plan deseado. 
Plan was verified: Time used 313,330 seconds. 
Plan passed performance criterion. 
38 © 2014 Pythian Confidential
Plan evolution on 12c 
39 
11g evolution deprecated but runs 
set long 100000 
vare clob; 
exec :e := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE( 
SQL_HANDLE=>'SQL_114a395a2db6c38c', 
COMMIT => 'NO'); 
print; 
GENERAL INFORMATION SECTION 
-------------------------------------------------------- 
Task Information: 
----------------------------------------- 
Task Name : TASK_1604 
Task Owner : SYS 
Execution Name : EXEC_1681 
Execution Type : SPM EVOLVE 
Scope : COMPREHENSIVE 
Status : COMPLETED 
Started : 08/09/2014 21:07:53 
Finished : 08/09/2014 21:07:53 
Last Updated : 08/09/2014 21:07:53 
Global Time Limit : 2147483646 
Per-Plan Time Limit : UNUSED 
Number of Errors : 0 
-------------------------------------------------------- 
SUMMARY SECTION 
-------------------------------------------------------- 
Number of plans processed : 1 
Number of findings : 1 
Number of recommendations : 0 
Number of errors : 0 
-------------------------------------------------------- 
… 
© 2014 Pythian Confidential
40 © 2014 Pythian Confidential 
DETAILS SECTION 
------------------------------------------------------- 
Object ID : 2 
Test Plan Name : SQL_PLAN_12kjtb8qvdhwc8a71e415 
Base Plan Name : SQL_PLAN_12kjtb8qvdhwca9f022c1 
SQL Handle : SQL_114a395a2db6c38c 
Parsing Schema : SYS 
Test Plan Creator : SYS 
SQL Text : select * from pp where n=:n 
Bind Variables: 
----------------------------- 
1 -(NUMBER): 99 
Execution Statistics: 
----------------------------- 
Base Plan Test Plan 
-------------------------------- 
Elapsed Time (s): .000003 .000003 
CPU Time (s): 0 0 
Buffer Gets: 0 0 
Optimizer Cost: 2 2 
Disk Reads: 0 0 
Direct Writes: 0 0 
Rows Processed: 0 0 
Executions: 10 10 
FINDINGS SECTION 
-------------------------------------------------------- 
Findings (1): 
----------------------------- 
1. The plan was verified in 0.02000 seconds. It failed the benefit criterion because its verified performance was 0.66667 times worse than that of the baseline plan. 
EXPLAIN PLANS SECTION 
-------------------------------------------------------- 
Baseline Plan 
----------------------------- 
Plan Id : 2201 
Plan Hash Value : 2851087041 
--------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost | Time | 
----------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 6 | 2 | 00:00:01 | 
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED | PP | 1 | 6 | 2 | 00:00:01 | 
| * 2 | INDEX RANGE SCAN | PP_IDX | 1 | | 1 | 00:00:01 | 
----------------------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
------------------------------------------ 
* 2 -access("N"=:N) 
Test Plan 
----------------------------- 
Plan Id : 2202 
Plan Hash Value : 2322719765 
--------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost | Time | 
--------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | 1 | 6 | 2 | 00:00:01 | 
| * 1 | TABLE ACCESS FULL | PP | 1 | 6 | 2 | 00:00:01 | 
---------------------------------------------------------------------
Plan evolution on 12c -automatic 
41 
SELECT owner, description, advisor_name, created, last_modified, status, recommendation_countrc 
FROM dba_advisor_tasks 
WHERE task_name= 'SYS_AUTO_SPM_EVOLVE_TASK'; 
OWNER DESCRIPTIONADVISOR_NAMECREATED LAST_MODI STATUS RC 
---------------------------------------------------------------------------------- 
SYSAutomatic SPM Evolve Task SPM Evolve Advisor 24-MAY-13 09-AUG-14 COMPLETED 0 
SELECT count(*) FROM DBA_ADVISOR_PARAMETERS 
WHERE TASK_NAME = 'SYS_AUTO_SPM_EVOLVE_TASK'; 
COUNT(*) 
---------- 
29 
Viewing result report (same output as before): 
select dbms_spm.report_auto_evolve_taskfrom dual; 
© 2014 Pythian Confidential
Plan evolution on 12c -manually 
varr varchar2(30); 
vart varchar2(20); 
exec :t := 'EVOTASK'; 
--with no parameter will consider all non ACCEPTED baselines 
exec :r := dbms_spm.create_evolve_task(task_name=>:t, description=>:t, 
plan_name=>'SQL_PLAN_12kjtb8qvdhwc8a71e415'); 
exec :r := dbms_spm.execute_evolve_task(:t, 'run1', 'first evolve run'); 
SELECT advisor_name, created, last_modified, status, how_created, recommendation_countrc 
FROM dba_advisor_tasks 
WHERE task_name= :t; 
ADVISOR_NAMECREATED LAST_MODI STATUS HOW_CREATEDRC 
------------------------------------------------------------------------------------- 
SPM Evolve Advisor 09-AUG-14 09-AUG-14COMPLETED CMD0 
vare clob; 
exec :e := dbms_spm.report_evolve_task(:t); 
col e for 150 
print eSame report as before 
42 © 2014 Pythian Confidential
Plan evolution on 12c -manually 
Recommendation section: provides command to execute 
Findings (1): 
----------------------------- 
1. None of the accepted plans were reproducible. 
Recommendation: 
----------------------------- 
Consider accepting the plan. Execute 
dbms_spm.accept_sql_plan_baseline(task_name=> 'EVOTASK', object_id=> 2, task_owner=> 'SYS'); 
43 © 2014 Pythian Confidential
Implementing automatic evolution on 11g 
44 
declare 
cursor c_nuevos_baselinesis 
select sql_handle, PLAN_NAME, (select count(1) from DBA_SQL_PLAN_BASELINES b2 
where b.sql_handle=b2.sql_handle and b2.accepted='YES') aceptados 
from DBA_SQL_PLAN_BASELINES b 
where enabled='YES' and accepted='NO' and created > trunc(sysdate)-7 
order by sql_handle, PLAN_NAME, created; 
begin 
dbms_output.put_line('varr long;'); 
dbms_output.put_line('set long 100000'); 
dbms_output.put_line('spool evolve-results-'||to_char(sysdate,'yyyymmdd')||'.txt'); 
for r_blin c_nuevos_baselinesloop 
dbms_output.put_line('##################'); 
if r_bl.aceptados> 0 then 
dbms_output.put_line('exec :r:=dbms_spm.evolve_sql_plan_baseline(sql_handle=> '''||r_bl.sql_handle|| 
''', plan_name=>'''||r_bl.plan_name||''', commit => ''NO'');'); 
dbms_output.put_line('print;'); 
end if; 
dbms_output.put_line('select * from table(dbms_xplan.display_sql_plan_baseline('|| 
'sql_handle=>'''||r_bl.sql_handle||''', plan_name=>'''||r_bl.plan_name||'''));'); 
end loop; 
dbms_output.put_line('spool off'); 
end; 
/ 
© 2014 Pythian Confidential
Implementing automatic evolution on 11g 
45 
Sample run: 
set serverouputon 
spool toevolve.sql 
@autoevo11g 
spool off 
@toevolve 
--to evolve.sqlgenerated: 
varr long; 
set long 100000 
spool evolve-results-20140810.txt 
################## 
exec :r:=dbms_spm.evolve_sql_plan_baseline(sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwcdeb317bf', commit => 'NO'); 
print; 
select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwcdeb317bf')); 
spool off 
PL/SQL procedure successfully completed. 
Usually the result is a long report. This case is the same as seen today 
© 2014 Pythian Confidential
Challenges? 
•SQL without using bind variables 
-Different statements (signature/sql_id), different baselines 
-Change app code. Last resource CURSOR_SHARING=FORCE 
•SQL with too many bind variables 
-Maybe cannot reproduce plan –needs a trace to confirm 
-Maybe errors when evolving new ones –(Bug 19326647 on 11.2.0.3) 
•SQL already using hints 
-Test original with alter session set _optimizer_ignore_hints 
•SQL already using SQL Profiles 
-Test original with alter session set sqltune_category=‘NNN'; 
46 © 2014 Pythian Confidential
Challenges 
Why my SQL has baselines and none is being used? 
1)SPM disabled by parameter 
2)Stored outline created –use it and ignore baselines 
3)Similar objects on different schemas 
4)Baseline cannot be reproduced 
5)Bugs 
47 © 2014 Pythian Confidential
Challenge -similar objects on different schemas 
Common on database consolidation scenarios 
•Baselines are global for the database (not per schema) 
•Same table names, different schemas, same SQL 
–Look at object definition/indexes on each schema 
Column PARSING_SCHEMA_NAME in DBA_SQL_PLAN_BASELINEShelps 
–CREATOR and ORIGIN can lead too 
48 © 2014 Pythian Confidential
Challenge -baseline cannot be reproduced 
•Object changes: if tables used by SQL baseline changes, it can stop being used 
–Remember 11g does not stores captured plans when investigating 
•Same PLAN_HASH_VALUE2? 
–minor bugs played here 
•Trace to the rescue: 
–It can be reproduced? => session level 
•10053 / spm_tracing/ SQL_Plan_Management 
–Statement level to capture global activity --new connections only 
•alter system set events 'trace[rdbms.SQL_Optimizer.*][sql: 0a14b3yhux040]’ 
–If using connection pools 
•dbms_sqldiag.dump_trace(…p_component=>'Compiler‘) 
49 © 2014 Pythian Confidential
Troubleshooting SPM –trace alternatives 
Global statement trace for already existing and new connections: 
dbms_sqldiag.dump_trace(p_sql_id=>'0a14b3yhux040', p_child_number=>0, 
p_component=>'Compiler', p_file_id=>'trace_0a14b3yhux040'); 
SPM Trace at session level: 
ALTER SESSION SET EVENTS'trace[RDBMS.SQL_Plan_Management.*]'; 
Internal SPM trace generation (more detailed): 
EXEC dbms_spm.configure('spm_tracing',1); 
--validate current settings: 
SELECT * FROM sys.smb$configWHERE parameter_name='SPM_TRACING'; 
Classic optimizer trace, which includes SPM standard trace: 
ALTER SESSION SET EVENTS 'trace[sql_optimizer.*]'; 
--same but for in older Oracle versions 
ALTER SESSION SET EVENTS='10053 trace name context forever, level 1'; 
50 © 2014 Pythian Confidential
Troubleshooting SPM –trace results 
When a Plan Baselineis found and used: 
SPM: statement found in SMB 
SPM: cost-based plan found in the plan baseline, planId= 3736278975 
SPM: cost-based plan successfully matched, planId= 3736278975 
When no matching Plan Baseline found, adding new one as non-accepted: 
SPM: statement found in SMB 
SPM: setup to add new plan to existing plan baseline, sig = 1245871306398155660, planId= 2322719765 
SPM: planId'sof plan baseline are: 3736278975 
SPM: using qksanto reproduce, cost and select accepted plan, sig = 1245871306398155660 
SPM: failed to reproduce the planusing the following info: 
SPM: generated non-matching plan: 
SPM: couldn't reproduce any enabled+acceptedplan so using the cost-based plan, planId= 2322719765 
SPM: add new plan: sig = 1245871306398155660, planId= 2322719765 
SPM: new plan added to existing plan baseline, sig = 1245871306398155660, planId= 2322719765 
SPM: REPRODUCED status changed to NO: sig = 1245871306398155660, planName= SQL_PLAN_12kjtb8qvdhwcdeb317bf 
51 © 2014 Pythian Confidential
Usage decision 
•optimizer_capture_sql_plan_baselines= TRUE 
OR 
•created when needed by each SQL? 
No silver bullet, choose the better one for your environment 
Use case: 
•some queries from a specific program would benefit from parameter=value 
–instead of changing the parameter and avoid this functionality to be used on other cases which would be beneficial, SQL baselines are created just for those programs 
–It is more manual work to have a functionality available for the other users 
52 © 2014 Pythian Confidential
Daily management overhead 
Evaluate autotasksrecommendations: 
•Trusting automatic creation of SQL Profiles/Baselines? 
•SQL Tuning Advisor (SQLTA) / SPM Evolve Advisor (12c) 
•Several views and reports to explore their results using SQL 
–dba_advisor_tasks/ dba_advisor_rationale 
•IF SQLTA recommends a SQL profile for a SQL that has no baselines 
–create the new SQL profile 
–move it to a SQL baseline 
–Disable SQL profile 
•On 11g: evaluate daily new baselines evolving them 
–How to deal with heavy activity and lots of new plans? AWR helps 
53 © 2014 Pythian Confidential
Daily management example approach 
54 
•Better performing evolved plans should be testing with a variety of binds on test environment before accepting them 
•Disable evaluated and confirmed non good plans 
exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', 
attribute_name=>'enabled', attribute_value=>'NO'); 
select count(*), count(distinct sql_handle) sqls, accepted, enabled 
from dba_sql_plan_baselines 
group by accepted, enabled; 
COUNT(*) SQLS ACC ENA 
--------------------- 
13792 13788 YES YESare in use by optimizer 
20 16 YES NO 
5588 3063 NO YES 
210 25 NO NO 
© 2014 Pythian Confidential
Daily management example approach 
55 
•Better performing evolved plans should be testing with a variety of binds on test environment before accepting them 
•Disable evaluated and confirmed non good plans 
exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', 
attribute_name=>'enabled', attribute_value=>'NO'); 
select count(*), count(distinct sql_handle) sqls, accepted, enabled 
from dba_sql_plan_baselines 
group by accepted, enabled; 
COUNT(*) SQLS ACC ENA 
--------------------- 
13792 13788 YES YESare in use by optimizer 
20 16 YES NO used but manually disabled because of problems found 
5588 3063 NO YES 
210 25 NO NO 
© 2014 Pythian Confidential
Daily management example approach 
56 
•Better performing evolved plans should be testing with a variety of binds on test environment before accepting them 
•Disable evaluated and confirmed non good plans 
exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', 
attribute_name=>'enabled', attribute_value=>'NO'); 
select count(*), count(distinct sql_handle) sqls, accepted, enabled 
from dba_sql_plan_baselines 
group by accepted, enabled; 
COUNT(*) SQLS ACC ENA 
--------------------- 
13792 13788 YES YESare in use by optimizer 
20 16 YES NO used but manually disabled because of problems found 
5588 3063 NO YESnew plans that needs evaluation 
210 25 NO NO 
© 2014 Pythian Confidential
Daily management example approach 
57 
•Better performing evolved plans should be testing with a variety of binds on test environment before accepting them 
•Disable evaluated and confirmed non good plans 
exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', 
attribute_name=>'enabled', attribute_value=>'NO'); 
select count(*), count(distinct sql_handle) sqls, accepted, enabled 
from dba_sql_plan_baselines 
group by accepted, enabled; 
COUNT(*) SQLS ACC ENA 
--------------------- 
13792 13788 YES YESare in use by optimizer 
20 16 YES NO used but manually disabled because of problems found 
5588 3063 NO YESnew plans that needs evaluation 
210 25 NO NOalready evaluated new plans nod performing good 
© 2014 Pythian Confidential
Daily management example approach 
58 
•Better performing evolved plans should be testing with a variety of binds on test environment before accepting them 
•Disable evaluated and confirmed non good plans 
exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', 
attribute_name=>'enabled', attribute_value=>'NO'); 
select count(*), count(distinct sql_handle) sqls, accepted, enabled 
from dba_sql_plan_baselines 
group by accepted, enabled; 
COUNT(*) SQLS ACC ENA 
--------------------- 
13792 13788 YES YESare in use by optimizer 
20 16 YES NO used but manually disabled because of problems found 
5588 3063 NO YESnew plans that needs evaluation 
210 25 NO NOalready evaluated new plans nod performing good 
Will you read a report with 5588 evolutions? Need an improved approach 
© 2014 Pythian Confidential
Choosing what to evolve on 11g using stats 
59 
Which statements are now running in more than 5s and have non accepted baselines? 
select * from ( 
select s.inst_id, s.sql_id 
,min(s.first_load_time) min_load_time 
,sum(s.executions) eje 
,round(sum(s.elapsed_time)/1000000/greatest(sum(s.executions),1),2) avg_sec 
,round(sum(s.disk_reads)/greatest(sum(s.executions),1),2) avg_reads 
,round(sum(s.buffer_gets)/greatest(sum(s.executions),1),2) avg_gets 
,dense_rank() over (order by sum(s.elapsed_time)/greatest(sum(s.executions),1) desc) rank 
from gv$sqls, DBA_SQL_PLAN_BASELINES b 
where s.FORCE_MATCHING_SIGNATURE=b.signature 
and b.enabled='YES' and b.accepted='YES' 
and exists (select 1 from DBA_SQL_PLAN_BASELINES b2 
where b.sql_handle=b2.sql_handle and b2.enabled='YES' and b2.accepted='NO') 
group by s.inst_id, s.sql_id 
having sum(s.elapsed_time)/greatest(sum(s.executions),1)/1000000 > 5) 
where rank < 50 
order by rank desc; 
© 2014 Pythian Confidential
Choosing what to evolve on 11g using stats 
60 
Output example: 
INST_ID SQL_ID MIN_LOAD_TIME EJE AVG_SEC AVG_READS AVG_GETS RANK 
-------------------------------------------------------------------------------------------- 
1 4baj8ju7nqpvt 2014-06-22/24:30:20 2 4,34 4872 23787 15 
2 7n8hbzpruj4nu 2014-06-22/07:03:04 327 4,42 2007,47 74787,87 14 
2 t0jxh8b7b4at2 2014-20-22/04:02:48 2 4,44 223 2427 13 
3 7n8hbzpruj4nu 2014-06-22/07:47:28 569 7,28 2342,87 78480,22 12 
1 t22bnbazvj87x 2014-06-22/20:03:42 38 8,23 2348,8 3444,2 11 
3 t2qx4bv4y383b 2014-06-22/23:38:32 28 8,38 4207,32 47883,72 10 
2 arpa78rrkhp80 2014-06-22/08:27:28 240 8,42 2242,8 4747,24 9 
2 t7qntjn4aaj8k 2014-06-22/22:48:27 22 8,47 2787,33 4780,83 8 
2 04h4pq4tpn238 2014-06-22/08:32:08 32 8,78 2207,83 20427,44 7 
3 bqtx4q2jas08u 2014-06-22/02:43:22 34 20,33 2737,28 3444,2 6 
3 t2qx4bv4y383b 2014-06-22/22:24:02 22 20,88 4780,4 47282,78 5 
2 7qbkbt7h00wtw 2014-06-22/07:30:37 404 23,42 2228,87 73488,07 4 
2 0s2b777vta78b 2014-06-22/07:28:02 283 24,8 2377,83 273342,87 3 
1 7qbkbt7h00wtw 2014-06-08/04:04:27 647 27,43 2788,34 80848,38 2 
2 2rnttntn3xb4r 2014-06-22/23:48:28 22 32,77 7273,77 42244,87 1 
15 rows selected. 
Needs another join to show baseline plan_name. That idea next with AWR 
© 2014 Pythian Confidential
Choosing what to evolve on 11g using AWR 
61 
Non accepted baselines of statements with executions times max/min variations of 5 times 
•AWR has historical data, needs Diagnostic Pack license 
Output example: 
SQL_HANDLE SQL_ID MAXE MINE PLANS #accept PLAN_NAME CREATED ACC FIX 
-------------------------------------------------------------------------------------------------------------- 
SQL_x1c4f31970638583 y283zg7xww7am 4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk11258e3b6f 08/07/14 14:41:23 NO NO 
4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk116e35c426 06/07/14 11:48:34 NO NO 
4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk118d733646 21/07/14 14:06:03 NO NO 
4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk11900895ab 21/07/14 17:04:24 NO NO 
SQL_d8ee9cd8489c1506 d70w2c9n04bky 11,02 ,7 5 2 SQL_PLAN_djvnwv149s50p0de525df 17/06/14 17:50:45 NO NO 
SQL_50563b1a5e7c3515 cdxqhv810sguq 142,12 4,51 12 4 SQL_PLAN_62t9v39g7sdj6e14b0faa 17/06/14 09:37:12 NO NO 
SQL_a69a285b67c3ab33 7jr0hhnrg5qpd 5,12 ,54 4 0 SQL_PLAN_5sw7au49da15rb55d4723 18/06/14 14:09:54 NO NO 
5,12 ,54 4 0 SQL_PLAN_5sw7au49da15r1224e506 06/06/14 13:21:12 NO NO 
5,12 ,54 4 0 SQL_PLAN_5sw7au49da15r92eca281 12/06/14 11:50:16 NO NO 
© 2014 Pythian Confidential
Choosing what to evolve on 11g using AWR 
62 
with sqlhas ( 
select FORCE_MATCHING_SIGNATURE, sql_id, count(1) plans, max(elap_xeje) maxe, min(elap_xeje) mine 
from (select h.FORCE_MATCHING_SIGNATURE, sql_id, plan_hash_valueplan_hv 
,round(sum(h.elapsed_time_delta)/sum(h.executions_delta)/1000000,2) elap_xeje 
from DBA_HIST_SQLSTAT h 
where snap_id>=(select min(snap_id) from dba_hist_snapshotwhere begin_interval_time>=trunc(sysdate)-30) 
and dbid=(select dbidfrom v$database) and instance_numberin (1,2,3) 
and h.executions_delta> 0 
and h.FORCE_MATCHING_SIGNATUREin ( 
select b.signaturefrom DBA_SQL_PLAN_BASELINES b 
where b.enabled='YES' and b.accepted='NO') 
group by FORCE_MATCHING_SIGNATURE, sql_id, plan_hash_value) 
group by FORCE_MATCHING_SIGNATURE, sql_id 
having max(elap_xeje)/(case min(elap_xeje) when 0 then 1 else min(elap_xeje) end) > 5) 
select sql_handle, signature, sqlh.sql_id, sqlh.maxe, sqlh.mine, sqlh.plans, 
(select count(1) from DBA_SQL_PLAN_BASELINES b2 
where b.sql_handle=b2.sql_handle and b2.accepted='YES' and b2.enabled='YES') "#accept" 
,PLAN_NAME, created, accepted, fixed 
from DBA_SQL_PLAN_BASELINES b, sqlh 
where b.enabled='YES' and b.accepted='NO' and b.created> trunc(sysdate)-30 
and b.signature= sqlh.FORCE_MATCHING_SIGNATURE 
order by sql_handle, sql_id, maxe; 
© 2014 Pythian Confidential
Example of bug found –11.2.0.2 
SQL_ID c2408ff99yj8u, child number 0 
------------------------------------- 
SELECT DATA, COUNT(*) FROM BIG_TABLE WHERE (((((((((DATA LIKE :1 ) OR (DATA LIKE :2 )) OR 
(DATA LIKE :3 )) OR (DATA LIKE :4 )) OR (DATA LIKE :5 )) OR (DATA LIKE :6 )) OR (DATA LIKE :7 )) OR 
(DATA LIKE :8 )) AND (STATE IN (:9 , :10 , :11 , :12 , :13 , :14 , :15 , :16 , :17 , :18 , :19 , :20 , :21 , :22 , :23 , :24 , :25 , :26 , :27 , :28 , :29 , :30 , :31 , :32 ))) GROUP BY DATA 
Plan hash value: 1854823252 
---------------------------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
---------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | | | 7504 (100)| | 
| 1 | HASH GROUP BY | | 16 | 1536 | | | 
| 2 | CONCATENATION | | | | | | 
|* 3 | INDEX RANGE SCAN| BIG_TABLE_CIDN | 1668 | 156K| 938 (1)| 00:00:12 | 
.. 
|* 10 | INDEX RANGE SCAN| BIG_TABLE_CIDN | 1165 | 109K| 938 (1)| 00:00:12 | 
---------------------------------------------------------------------------------------------- 
... 
Note 
-SQL plan baseline SQL_PLAN_8vdc1f1da6d7sa0mtur14used for this statement 
63 © 2014 Pythian Confidential
Example of bug found –11.2.0.2 
--Plan baselines for this statement: 
col created for a25 
select PLAN_NAME, ENABLED, accepted, fixed, created, executions, optimizer_cost 
from DBA_SQL_PLAN_BASELINES 
where sql_handle='SQL_114a395a2db6c38c' and enabled='YES' 
order by created; 
PLAN_NAME ENA ACC FIX CREATED EXECUTIONS OPTIMIZER_COST 
---------------------------------------------------------------------------------------- 
SQL_PLAN_8vdc1f1da6d7sa0mtur14YES YESNO 05/08/14 16:11:26,000000 1 7504 
SQL_PLAN_0sa1muctuur8ve7e49070 YES NO NO05/08/14 17:29:45,000000 0 2039 
2 rows selected. 
--Want to evaluate the new plan found, not accepted yet 
64 © 2014 Pythian Confidential
Example of bug found –11.2.0.2 
--evolving the new plan: 
varr clob; 
set long 10000 
exec :r := dbms_spm.evolve_sql_plan_baseline(sql_handle=> 'SQL_114a395a2db6c38c',  
plan_name=>'SQL_PLAN_0sa1muctuur8ve7e49070', commit => 'NO'); 
print; 
------------------------------------------------------------------------------- 
Evolve SQL Plan Baseline Report 
------------------------------------------------------------------------------- 
Inputs: 
------- 
SQL_HANDLE = SQL_114a395a2db6c38c 
PLAN_NAME = SQL_PLAN_0sa1muctuur8ve7e49070 
TIME_LIMIT = DBMS_SPM.AUTO_LIMIT 
VERIFY = YES 
COMMIT = NO 
Plan: SQL_PLAN_0sa1muctuur8ve7e49070 
------------------------------------ 
Plan was verified: Time used ,507 seconds. 
Error encountered during plan verification (ORA-1008). 
ORA-01008: no todaslasvariables hansidoenlazadas 
Bug 14007103 discarded 
Bug 19326647 opened 
65 © 2014 Pythian Confidential
Summary review 
•SPM enabled by default, but not capture 
•No extra license, available only on Enterprise edition 
•Baseline need to be acceptedAND enabled to be used 
•SQL needs to run more than once to be considered 
•Baselines are global -not per schema 
•Evolve advisor (autotask) in 12c, manual evolution in 11g. 
•Don’t trust evolution results, test it! 
•SQL Trace when in doubt (statement level!) 
•Needs a good understanding to troubleshoot 
66 © 2014 Pythian Confidential
Questions? 
67 
calero@pythian.com 
@ncalerouy 
http://www.linkedin.com/in/ncalero 
© 2014 Pythian Confidential
References 
•SPM in Oracle 11g (Nov 2010): http://www.oracle.com/technetwork/database/bi- datawarehousing/twp-sql-plan-management-11gr2-133099.pdf 
•SPM in Oracle 12c (Jun 2013): http://www.oracle.com/technetwork/database/bi- datawarehousing/twp-sql-plan-mgmt-12c-1963237.pdf 
•Oracle 12c Tuning Guide -Managing SQL Plan Baselines: http://docs.oracle.com/database/121/TGSQL/tgsql_spm.htm#TGSQL94621 
•Oracle 12c Tuning Guide -Query Optimizer: http://docs.oracle.com/database/121/TGSQL/tgsql_optcncpt.htm#TGSQL192 
•Oracle 11c Tuning Guide -Query Optimizer: http://docs.oracle.com/cd/B28359_01/server.111/b28274/optimops.htm 
•Oracle Optimizer development team Blog: https://blogs.oracle.com/optimizer 
68 © 2014 Pythian Confidential

More Related Content

What's hot

Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsOracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsZohar Elkayam
 
Oracle RAC 19c: Best Practices and Secret Internals
Oracle RAC 19c: Best Practices and Secret InternalsOracle RAC 19c: Best Practices and Secret Internals
Oracle RAC 19c: Best Practices and Secret InternalsAnil Nair
 
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentalsDB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentalsJohn Beresniewicz
 
Understanding oracle rac internals part 2 - slides
Understanding oracle rac internals   part 2 - slidesUnderstanding oracle rac internals   part 2 - slides
Understanding oracle rac internals part 2 - slidesMohamed Farouk
 
Oracle Database Performance Tuning Basics
Oracle Database Performance Tuning BasicsOracle Database Performance Tuning Basics
Oracle Database Performance Tuning Basicsnitin anjankar
 
Oracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aasOracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aasKyle Hailey
 
Exploring Oracle Multitenant in Oracle Database 12c
Exploring Oracle Multitenant in Oracle Database 12cExploring Oracle Multitenant in Oracle Database 12c
Exploring Oracle Multitenant in Oracle Database 12cZohar Elkayam
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsOracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsEnkitec
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuningSimon Huang
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuningGuy Harrison
 
Nabil Nawaz Oracle Oracle 12c Data Guard Deep Dive Presentation
Nabil Nawaz Oracle Oracle 12c Data Guard Deep Dive PresentationNabil Nawaz Oracle Oracle 12c Data Guard Deep Dive Presentation
Nabil Nawaz Oracle Oracle 12c Data Guard Deep Dive PresentationNabil Nawaz
 
Understanding oracle rac internals part 1 - slides
Understanding oracle rac internals   part 1 - slidesUnderstanding oracle rac internals   part 1 - slides
Understanding oracle rac internals part 1 - slidesMohamed Farouk
 
Adapting and adopting spm v04
Adapting and adopting spm v04Adapting and adopting spm v04
Adapting and adopting spm v04Carlos Sierra
 
Tanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder
 
Oracle Database performance tuning using oratop
Oracle Database performance tuning using oratopOracle Database performance tuning using oratop
Oracle Database performance tuning using oratopSandesh Rao
 
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdfOracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdfSrirakshaSrinivasan2
 
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...Sandesh Rao
 
Awr + 12c performance tuning
Awr + 12c performance tuningAwr + 12c performance tuning
Awr + 12c performance tuningAiougVizagChapter
 

What's hot (20)

AWR and ASH Deep Dive
AWR and ASH Deep DiveAWR and ASH Deep Dive
AWR and ASH Deep Dive
 
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAsOracle Database Performance Tuning Advanced Features and Best Practices for DBAs
Oracle Database Performance Tuning Advanced Features and Best Practices for DBAs
 
Oracle RAC 19c: Best Practices and Secret Internals
Oracle RAC 19c: Best Practices and Secret InternalsOracle RAC 19c: Best Practices and Secret Internals
Oracle RAC 19c: Best Practices and Secret Internals
 
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentalsDB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
DB Time, Average Active Sessions, and ASH Math - Oracle performance fundamentals
 
Understanding oracle rac internals part 2 - slides
Understanding oracle rac internals   part 2 - slidesUnderstanding oracle rac internals   part 2 - slides
Understanding oracle rac internals part 2 - slides
 
Oracle Database Performance Tuning Basics
Oracle Database Performance Tuning BasicsOracle Database Performance Tuning Basics
Oracle Database Performance Tuning Basics
 
Ash and awr deep dive hotsos
Ash and awr deep dive hotsosAsh and awr deep dive hotsos
Ash and awr deep dive hotsos
 
Oracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aasOracle 10g Performance: chapter 02 aas
Oracle 10g Performance: chapter 02 aas
 
Exploring Oracle Multitenant in Oracle Database 12c
Exploring Oracle Multitenant in Oracle Database 12cExploring Oracle Multitenant in Oracle Database 12c
Exploring Oracle Multitenant in Oracle Database 12c
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsOracle Performance Tuning Fundamentals
Oracle Performance Tuning Fundamentals
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuning
 
Oracle sql high performance tuning
Oracle sql high performance tuningOracle sql high performance tuning
Oracle sql high performance tuning
 
Nabil Nawaz Oracle Oracle 12c Data Guard Deep Dive Presentation
Nabil Nawaz Oracle Oracle 12c Data Guard Deep Dive PresentationNabil Nawaz Oracle Oracle 12c Data Guard Deep Dive Presentation
Nabil Nawaz Oracle Oracle 12c Data Guard Deep Dive Presentation
 
Understanding oracle rac internals part 1 - slides
Understanding oracle rac internals   part 1 - slidesUnderstanding oracle rac internals   part 1 - slides
Understanding oracle rac internals part 1 - slides
 
Adapting and adopting spm v04
Adapting and adopting spm v04Adapting and adopting spm v04
Adapting and adopting spm v04
 
Tanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata MigrationsTanel Poder - Performance stories from Exadata Migrations
Tanel Poder - Performance stories from Exadata Migrations
 
Oracle Database performance tuning using oratop
Oracle Database performance tuning using oratopOracle Database performance tuning using oratop
Oracle Database performance tuning using oratop
 
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdfOracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
Oracle_Multitenant_19c_-_All_About_Pluggable_D.pdf
 
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
 
Awr + 12c performance tuning
Awr + 12c performance tuningAwr + 12c performance tuning
Awr + 12c performance tuning
 

Viewers also liked

Using SQL Plan Management (SPM) to balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to balance Plan Flexibility and Plan StabilityUsing SQL Plan Management (SPM) to balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to balance Plan Flexibility and Plan StabilityCarlos Sierra
 
Oracle11g sql plan management
Oracle11g sql plan managementOracle11g sql plan management
Oracle11g sql plan managementalezeng
 
Nueva Mentalidad Gerencial
Nueva Mentalidad Gerencial Nueva Mentalidad Gerencial
Nueva Mentalidad Gerencial Daniela Sevilla
 
UYOUG 2010 - RMAN sin misterios
UYOUG 2010 - RMAN sin misteriosUYOUG 2010 - RMAN sin misterios
UYOUG 2010 - RMAN sin misteriosNelson Calero
 
Oracle SPM 12c. IOUG #C15LV
Oracle SPM 12c. IOUG #C15LVOracle SPM 12c. IOUG #C15LV
Oracle SPM 12c. IOUG #C15LVAlfredo Krieg
 
You most probably dont need rman catalog database white paper
You most probably dont need rman catalog database white paperYou most probably dont need rman catalog database white paper
You most probably dont need rman catalog database white paperYury Velikanov
 
Ash architecture and advanced usage rmoug2014
Ash architecture and advanced usage rmoug2014Ash architecture and advanced usage rmoug2014
Ash architecture and advanced usage rmoug2014John Beresniewicz
 
Sql interview question part 9
Sql interview question part 9Sql interview question part 9
Sql interview question part 9kaashiv1
 
Sql interview question part 8
Sql interview question part 8Sql interview question part 8
Sql interview question part 8kaashiv1
 
Sql interview questions
Sql interview questionsSql interview questions
Sql interview questionsnagesh Rao
 
FlashSystems 2016 update
FlashSystems 2016 updateFlashSystems 2016 update
FlashSystems 2016 updateJoe Krotz
 
Oracle SQL Interview Questions for Freshers
Oracle SQL Interview Questions for FreshersOracle SQL Interview Questions for Freshers
Oracle SQL Interview Questions for FreshersDTecH It Education
 
SQL practice questions set - 2
SQL practice questions set - 2SQL practice questions set - 2
SQL practice questions set - 2Mohd Tousif
 
Oracle 11G SCAN: Concepts and Implementation Experience Sharing
Oracle 11G SCAN: Concepts and Implementation Experience SharingOracle 11G SCAN: Concepts and Implementation Experience Sharing
Oracle 11G SCAN: Concepts and Implementation Experience SharingYury Velikanov
 
Oracle SQL tuning with SQL Plan Management
Oracle SQL tuning with SQL Plan ManagementOracle SQL tuning with SQL Plan Management
Oracle SQL tuning with SQL Plan ManagementBjoern Rost
 
Sql queries questions and answers
Sql queries questions and answersSql queries questions and answers
Sql queries questions and answersMichael Belete
 
3 ways to reduce Oracle license costs
3 ways to reduce Oracle license costs3 ways to reduce Oracle license costs
3 ways to reduce Oracle license costsWilliam Macleod
 
Awr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsAwr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsJohn Beresniewicz
 
You most probably dont need an RMAN catalog database
You most probably dont need an RMAN catalog databaseYou most probably dont need an RMAN catalog database
You most probably dont need an RMAN catalog databaseYury Velikanov
 

Viewers also liked (20)

Using SQL Plan Management (SPM) to balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to balance Plan Flexibility and Plan StabilityUsing SQL Plan Management (SPM) to balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to balance Plan Flexibility and Plan Stability
 
Oracle11g sql plan management
Oracle11g sql plan managementOracle11g sql plan management
Oracle11g sql plan management
 
Nueva Mentalidad Gerencial
Nueva Mentalidad Gerencial Nueva Mentalidad Gerencial
Nueva Mentalidad Gerencial
 
UYOUG 2010 - RMAN sin misterios
UYOUG 2010 - RMAN sin misteriosUYOUG 2010 - RMAN sin misterios
UYOUG 2010 - RMAN sin misterios
 
Oracle SPM 12c. IOUG #C15LV
Oracle SPM 12c. IOUG #C15LVOracle SPM 12c. IOUG #C15LV
Oracle SPM 12c. IOUG #C15LV
 
You most probably dont need rman catalog database white paper
You most probably dont need rman catalog database white paperYou most probably dont need rman catalog database white paper
You most probably dont need rman catalog database white paper
 
Ash architecture and advanced usage rmoug2014
Ash architecture and advanced usage rmoug2014Ash architecture and advanced usage rmoug2014
Ash architecture and advanced usage rmoug2014
 
Oracle 12 Upgrade
Oracle 12 UpgradeOracle 12 Upgrade
Oracle 12 Upgrade
 
Sql interview question part 9
Sql interview question part 9Sql interview question part 9
Sql interview question part 9
 
Sql interview question part 8
Sql interview question part 8Sql interview question part 8
Sql interview question part 8
 
Sql interview questions
Sql interview questionsSql interview questions
Sql interview questions
 
FlashSystems 2016 update
FlashSystems 2016 updateFlashSystems 2016 update
FlashSystems 2016 update
 
Oracle SQL Interview Questions for Freshers
Oracle SQL Interview Questions for FreshersOracle SQL Interview Questions for Freshers
Oracle SQL Interview Questions for Freshers
 
SQL practice questions set - 2
SQL practice questions set - 2SQL practice questions set - 2
SQL practice questions set - 2
 
Oracle 11G SCAN: Concepts and Implementation Experience Sharing
Oracle 11G SCAN: Concepts and Implementation Experience SharingOracle 11G SCAN: Concepts and Implementation Experience Sharing
Oracle 11G SCAN: Concepts and Implementation Experience Sharing
 
Oracle SQL tuning with SQL Plan Management
Oracle SQL tuning with SQL Plan ManagementOracle SQL tuning with SQL Plan Management
Oracle SQL tuning with SQL Plan Management
 
Sql queries questions and answers
Sql queries questions and answersSql queries questions and answers
Sql queries questions and answers
 
3 ways to reduce Oracle license costs
3 ways to reduce Oracle license costs3 ways to reduce Oracle license costs
3 ways to reduce Oracle license costs
 
Awr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reportsAwr1page - Sanity checking time instrumentation in AWR reports
Awr1page - Sanity checking time instrumentation in AWR reports
 
You most probably dont need an RMAN catalog database
You most probably dont need an RMAN catalog databaseYou most probably dont need an RMAN catalog database
You most probably dont need an RMAN catalog database
 

Similar to My Experience Using Oracle SQL Plan Baselines 11g/12c

Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...
Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...
Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...Nelson Calero
 
OUG Harmony 2012 - Using SQL Plan Baselines for Performance Testing
OUG Harmony 2012 -  Using SQL Plan Baselines for Performance TestingOUG Harmony 2012 -  Using SQL Plan Baselines for Performance Testing
OUG Harmony 2012 - Using SQL Plan Baselines for Performance TestingMaris Elsins
 
Embarcadero In Search of Plan Stability Part 1 Webinar Slides
Embarcadero In Search of Plan Stability Part 1 Webinar SlidesEmbarcadero In Search of Plan Stability Part 1 Webinar Slides
Embarcadero In Search of Plan Stability Part 1 Webinar SlidesEmbarcadero Technologies
 
D73549GC10_06.pptx
D73549GC10_06.pptxD73549GC10_06.pptx
D73549GC10_06.pptxVLQuyNhn
 
Sql and PL/SQL Best Practices I
Sql and PL/SQL Best Practices ISql and PL/SQL Best Practices I
Sql and PL/SQL Best Practices ICarlos Oliveira
 
LVOUG meetup #2 - Forcing SQL Execution Plan Instability
LVOUG meetup #2 - Forcing SQL Execution Plan InstabilityLVOUG meetup #2 - Forcing SQL Execution Plan Instability
LVOUG meetup #2 - Forcing SQL Execution Plan InstabilityMaris Elsins
 
Performance Stability, Tips and Tricks and Underscores
Performance Stability, Tips and Tricks and UnderscoresPerformance Stability, Tips and Tricks and Underscores
Performance Stability, Tips and Tricks and UnderscoresJitendra Singh
 
LVOUG meetup #4 - Case Study 10g to 11g
LVOUG meetup #4 - Case Study 10g to 11gLVOUG meetup #4 - Case Study 10g to 11g
LVOUG meetup #4 - Case Study 10g to 11gMaris Elsins
 
Optimizing applications and database performance
Optimizing applications and database performanceOptimizing applications and database performance
Optimizing applications and database performanceInam Bukhary
 
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ OracleUnderstanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ OracleGuatemala User Group
 
Adaptive Query Optimization
Adaptive Query OptimizationAdaptive Query Optimization
Adaptive Query OptimizationAnju Garg
 
Performance Management in Oracle 12c
Performance Management in Oracle 12cPerformance Management in Oracle 12c
Performance Management in Oracle 12cAlfredo Krieg
 
Exploring plsql new features best practices september 2013
Exploring plsql new features best practices   september 2013Exploring plsql new features best practices   september 2013
Exploring plsql new features best practices september 2013Andrejs Vorobjovs
 
NoCOUG_201411_Patel_Managing_a_Large_OLTP_Database
NoCOUG_201411_Patel_Managing_a_Large_OLTP_DatabaseNoCOUG_201411_Patel_Managing_a_Large_OLTP_Database
NoCOUG_201411_Patel_Managing_a_Large_OLTP_DatabaseParesh Patel
 
MySQL Performance Schema : fossasia
MySQL Performance Schema : fossasiaMySQL Performance Schema : fossasia
MySQL Performance Schema : fossasiaMayank Prasad
 
Barun_Practical_and_Efficient_SQL_Performance_Tuning
Barun_Practical_and_Efficient_SQL_Performance_TuningBarun_Practical_and_Efficient_SQL_Performance_Tuning
Barun_Practical_and_Efficient_SQL_Performance_TuningVlado Barun
 
Top 10 tips for Oracle performance
Top 10 tips for Oracle performanceTop 10 tips for Oracle performance
Top 10 tips for Oracle performanceGuy Harrison
 

Similar to My Experience Using Oracle SQL Plan Baselines 11g/12c (20)

Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...
Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...
Evolution of Performance Management: Oracle 12c adaptive optimizations - ukou...
 
OUG Harmony 2012 - Using SQL Plan Baselines for Performance Testing
OUG Harmony 2012 -  Using SQL Plan Baselines for Performance TestingOUG Harmony 2012 -  Using SQL Plan Baselines for Performance Testing
OUG Harmony 2012 - Using SQL Plan Baselines for Performance Testing
 
Embarcadero In Search of Plan Stability Part 1 Webinar Slides
Embarcadero In Search of Plan Stability Part 1 Webinar SlidesEmbarcadero In Search of Plan Stability Part 1 Webinar Slides
Embarcadero In Search of Plan Stability Part 1 Webinar Slides
 
D73549GC10_06.pptx
D73549GC10_06.pptxD73549GC10_06.pptx
D73549GC10_06.pptx
 
Sql and PL/SQL Best Practices I
Sql and PL/SQL Best Practices ISql and PL/SQL Best Practices I
Sql and PL/SQL Best Practices I
 
LVOUG meetup #2 - Forcing SQL Execution Plan Instability
LVOUG meetup #2 - Forcing SQL Execution Plan InstabilityLVOUG meetup #2 - Forcing SQL Execution Plan Instability
LVOUG meetup #2 - Forcing SQL Execution Plan Instability
 
Performance Stability, Tips and Tricks and Underscores
Performance Stability, Tips and Tricks and UnderscoresPerformance Stability, Tips and Tricks and Underscores
Performance Stability, Tips and Tricks and Underscores
 
LVOUG meetup #4 - Case Study 10g to 11g
LVOUG meetup #4 - Case Study 10g to 11gLVOUG meetup #4 - Case Study 10g to 11g
LVOUG meetup #4 - Case Study 10g to 11g
 
Optimizing applications and database performance
Optimizing applications and database performanceOptimizing applications and database performance
Optimizing applications and database performance
 
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ OracleUnderstanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
 
Adaptive Query Optimization
Adaptive Query OptimizationAdaptive Query Optimization
Adaptive Query Optimization
 
Performance Management in Oracle 12c
Performance Management in Oracle 12cPerformance Management in Oracle 12c
Performance Management in Oracle 12c
 
Exploring plsql new features best practices september 2013
Exploring plsql new features best practices   september 2013Exploring plsql new features best practices   september 2013
Exploring plsql new features best practices september 2013
 
11gR2 Upgrade.pdf
11gR2 Upgrade.pdf11gR2 Upgrade.pdf
11gR2 Upgrade.pdf
 
11gR2 Upgrade.pdf
11gR2 Upgrade.pdf11gR2 Upgrade.pdf
11gR2 Upgrade.pdf
 
Free oracle performance tools
Free oracle performance toolsFree oracle performance tools
Free oracle performance tools
 
NoCOUG_201411_Patel_Managing_a_Large_OLTP_Database
NoCOUG_201411_Patel_Managing_a_Large_OLTP_DatabaseNoCOUG_201411_Patel_Managing_a_Large_OLTP_Database
NoCOUG_201411_Patel_Managing_a_Large_OLTP_Database
 
MySQL Performance Schema : fossasia
MySQL Performance Schema : fossasiaMySQL Performance Schema : fossasia
MySQL Performance Schema : fossasia
 
Barun_Practical_and_Efficient_SQL_Performance_Tuning
Barun_Practical_and_Efficient_SQL_Performance_TuningBarun_Practical_and_Efficient_SQL_Performance_Tuning
Barun_Practical_and_Efficient_SQL_Performance_Tuning
 
Top 10 tips for Oracle performance
Top 10 tips for Oracle performanceTop 10 tips for Oracle performance
Top 10 tips for Oracle performance
 

More from Nelson Calero

Database automation guide - Oracle Community Tour LATAM 2023
Database automation guide - Oracle Community Tour LATAM 2023Database automation guide - Oracle Community Tour LATAM 2023
Database automation guide - Oracle Community Tour LATAM 2023Nelson Calero
 
Terraform Tips and Tricks - LAOUC 2022
Terraform Tips and Tricks - LAOUC 2022Terraform Tips and Tricks - LAOUC 2022
Terraform Tips and Tricks - LAOUC 2022Nelson Calero
 
Oracle on kubernetes 101 - Dec/2021
Oracle on kubernetes 101 - Dec/2021Oracle on kubernetes 101 - Dec/2021
Oracle on kubernetes 101 - Dec/2021Nelson Calero
 
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...Nelson Calero
 
Oracle Exadata Cloud Services guide from practical experience - OOW19
Oracle Exadata Cloud Services guide from practical experience - OOW19Oracle Exadata Cloud Services guide from practical experience - OOW19
Oracle Exadata Cloud Services guide from practical experience - OOW19Nelson Calero
 
Automate your oracle cloud infrastructure operations v2.0 - OOW19
Automate your oracle cloud infrastructure operations v2.0 - OOW19Automate your oracle cloud infrastructure operations v2.0 - OOW19
Automate your oracle cloud infrastructure operations v2.0 - OOW19Nelson Calero
 
Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0Nelson Calero
 
SSL certificates in the Oracle Database without surprises
SSL certificates in the Oracle Database without surprisesSSL certificates in the Oracle Database without surprises
SSL certificates in the Oracle Database without surprisesNelson Calero
 
Practical guide to Oracle Virtual environments
Practical guide to Oracle Virtual environmentsPractical guide to Oracle Virtual environments
Practical guide to Oracle Virtual environmentsNelson Calero
 
Automate your Oracle Cloud Infrastructure operation
Automate your Oracle Cloud Infrastructure operationAutomate your Oracle Cloud Infrastructure operation
Automate your Oracle Cloud Infrastructure operationNelson Calero
 
Welcome to databases in the Cloud
Welcome to databases in the CloudWelcome to databases in the Cloud
Welcome to databases in the CloudNelson Calero
 
Redefining tables online without surprises
Redefining tables online without surprisesRedefining tables online without surprises
Redefining tables online without surprisesNelson Calero
 
Protect Sensitive Data: Implementing Fine-Grained Access Control in Oracle
Protect Sensitive Data: Implementing Fine-Grained Access Control in OracleProtect Sensitive Data: Implementing Fine-Grained Access Control in Oracle
Protect Sensitive Data: Implementing Fine-Grained Access Control in OracleNelson Calero
 
Oracle Exadata Maintenance tasks 101 - OTN Tour 2015
Oracle Exadata Maintenance tasks 101 - OTN Tour 2015Oracle Exadata Maintenance tasks 101 - OTN Tour 2015
Oracle Exadata Maintenance tasks 101 - OTN Tour 2015Nelson Calero
 
Oracle RAC sin sorpresas - v2014
Oracle RAC sin sorpresas - v2014Oracle RAC sin sorpresas - v2014
Oracle RAC sin sorpresas - v2014Nelson Calero
 
Alta disponibilidad con Pacemaker
Alta disponibilidad con PacemakerAlta disponibilidad con Pacemaker
Alta disponibilidad con PacemakerNelson Calero
 
AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL
AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQLAROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL
AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQLNelson Calero
 
MariaDB y FOSS en infraestructura de salud y estándares
MariaDB y FOSS en infraestructura de salud y estándaresMariaDB y FOSS en infraestructura de salud y estándares
MariaDB y FOSS en infraestructura de salud y estándaresNelson Calero
 
UYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New featuresUYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New featuresNelson Calero
 
Collaborate 2012 - Administering MySQL for Oracle DBAs
Collaborate 2012 - Administering MySQL for Oracle DBAsCollaborate 2012 - Administering MySQL for Oracle DBAs
Collaborate 2012 - Administering MySQL for Oracle DBAsNelson Calero
 

More from Nelson Calero (20)

Database automation guide - Oracle Community Tour LATAM 2023
Database automation guide - Oracle Community Tour LATAM 2023Database automation guide - Oracle Community Tour LATAM 2023
Database automation guide - Oracle Community Tour LATAM 2023
 
Terraform Tips and Tricks - LAOUC 2022
Terraform Tips and Tricks - LAOUC 2022Terraform Tips and Tricks - LAOUC 2022
Terraform Tips and Tricks - LAOUC 2022
 
Oracle on kubernetes 101 - Dec/2021
Oracle on kubernetes 101 - Dec/2021Oracle on kubernetes 101 - Dec/2021
Oracle on kubernetes 101 - Dec/2021
 
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
Automate Oracle database patches and upgrades using Fleet Provisioning and Pa...
 
Oracle Exadata Cloud Services guide from practical experience - OOW19
Oracle Exadata Cloud Services guide from practical experience - OOW19Oracle Exadata Cloud Services guide from practical experience - OOW19
Oracle Exadata Cloud Services guide from practical experience - OOW19
 
Automate your oracle cloud infrastructure operations v2.0 - OOW19
Automate your oracle cloud infrastructure operations v2.0 - OOW19Automate your oracle cloud infrastructure operations v2.0 - OOW19
Automate your oracle cloud infrastructure operations v2.0 - OOW19
 
Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0Automate the operation of your Oracle Cloud infrastructure v2.0
Automate the operation of your Oracle Cloud infrastructure v2.0
 
SSL certificates in the Oracle Database without surprises
SSL certificates in the Oracle Database without surprisesSSL certificates in the Oracle Database without surprises
SSL certificates in the Oracle Database without surprises
 
Practical guide to Oracle Virtual environments
Practical guide to Oracle Virtual environmentsPractical guide to Oracle Virtual environments
Practical guide to Oracle Virtual environments
 
Automate your Oracle Cloud Infrastructure operation
Automate your Oracle Cloud Infrastructure operationAutomate your Oracle Cloud Infrastructure operation
Automate your Oracle Cloud Infrastructure operation
 
Welcome to databases in the Cloud
Welcome to databases in the CloudWelcome to databases in the Cloud
Welcome to databases in the Cloud
 
Redefining tables online without surprises
Redefining tables online without surprisesRedefining tables online without surprises
Redefining tables online without surprises
 
Protect Sensitive Data: Implementing Fine-Grained Access Control in Oracle
Protect Sensitive Data: Implementing Fine-Grained Access Control in OracleProtect Sensitive Data: Implementing Fine-Grained Access Control in Oracle
Protect Sensitive Data: Implementing Fine-Grained Access Control in Oracle
 
Oracle Exadata Maintenance tasks 101 - OTN Tour 2015
Oracle Exadata Maintenance tasks 101 - OTN Tour 2015Oracle Exadata Maintenance tasks 101 - OTN Tour 2015
Oracle Exadata Maintenance tasks 101 - OTN Tour 2015
 
Oracle RAC sin sorpresas - v2014
Oracle RAC sin sorpresas - v2014Oracle RAC sin sorpresas - v2014
Oracle RAC sin sorpresas - v2014
 
Alta disponibilidad con Pacemaker
Alta disponibilidad con PacemakerAlta disponibilidad con Pacemaker
Alta disponibilidad con Pacemaker
 
AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL
AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQLAROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL
AROUG BIDAY 2013 - Automatizar procesos de ETL con PL/SQL
 
MariaDB y FOSS en infraestructura de salud y estándares
MariaDB y FOSS en infraestructura de salud y estándaresMariaDB y FOSS en infraestructura de salud y estándares
MariaDB y FOSS en infraestructura de salud y estándares
 
UYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New featuresUYOUG 2012 - Oracle RAC 11gR2 - New features
UYOUG 2012 - Oracle RAC 11gR2 - New features
 
Collaborate 2012 - Administering MySQL for Oracle DBAs
Collaborate 2012 - Administering MySQL for Oracle DBAsCollaborate 2012 - Administering MySQL for Oracle DBAs
Collaborate 2012 - Administering MySQL for Oracle DBAs
 

Recently uploaded

UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Websitedgelyza
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopBachir Benyammi
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaborationbruanjhuli
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IES VE
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAshyamraj55
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationIES VE
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding TeamAdam Moalla
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1DianaGray10
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDELiveplex
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxMatsuo Lab
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdfPedro Manuel
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 

Recently uploaded (20)

UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 
COMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a WebsiteCOMPUTER 10 Lesson 8 - Building a Website
COMPUTER 10 Lesson 8 - Building a Website
 
NIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 WorkshopNIST Cybersecurity Framework (CSF) 2.0 Workshop
NIST Cybersecurity Framework (CSF) 2.0 Workshop
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
 
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
IESVE Software for Florida Code Compliance Using ASHRAE 90.1-2019
 
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPAAnypoint Code Builder , Google Pub sub connector and MuleSoft RPA
Anypoint Code Builder , Google Pub sub connector and MuleSoft RPA
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve DecarbonizationUsing IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
Using IESVE for Loads, Sizing and Heat Pump Modeling to Achieve Decarbonization
 
201610817 - edge part1
201610817 - edge part1201610817 - edge part1
201610817 - edge part1
 
9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team9 Steps For Building Winning Founding Team
9 Steps For Building Winning Founding Team
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1UiPath Platform: The Backend Engine Powering Your Automation - Session 1
UiPath Platform: The Backend Engine Powering Your Automation - Session 1
 
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDEADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
ADOPTING WEB 3 FOR YOUR BUSINESS: A STEP-BY-STEP GUIDE
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Introduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptxIntroduction to Matsuo Laboratory (ENG).pptx
Introduction to Matsuo Laboratory (ENG).pptx
 
Nanopower In Semiconductor Industry.pdf
Nanopower  In Semiconductor Industry.pdfNanopower  In Semiconductor Industry.pdf
Nanopower In Semiconductor Industry.pdf
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 

My Experience Using Oracle SQL Plan Baselines 11g/12c

  • 1. My Experience Using SQL Plan Baselines Nelson Calero August 2014 OTN Latin America Tour
  • 2. About me •Database Consultant at Pythian •Computer Engineer •Oracle Certified Professional DBA 10g/11g •Working with Oracle tools and Linux environments since 1996 •DBA Oracle (since 2001) & MySQL (since 2005) •Oracle University Instructor •Co-founder and President of the Oracle user Group of Uruguay •LAOUC Director of events •Blogger •Frequent speaker: Oracle Open World, Collaborate, OTN Tour, JIAP, MySQL/NoSQL conferences http://www.linkedin.com/in/ncalero @ncalerouy 2 © 2014 Pythian Confidential
  • 3. Pythianoverview •17 Years of data infrastructure management consulting •170+ Top brands •10000+ Systems under management •Over 200 DBAs in 28 countries •Top 5% of DBA work force, 9 Oracle ACEs, 4 Microsoft MVPs •Oracle, Microsoft, MySQL, Netezza, Hadoop, MongoDB, Oracle Apps, Enterprise Infrastructure 3 © 2014 Pythian Confidential
  • 4. Why SQL Plan Management? •Oracle has several functionalities to help troubleshoot performance of SQL •There is a lot of information online, official and by the community –https://blogs.oracle.com/optimizer/is the Optimizer Team! –OTN Virtual Technology summit lab –Create and evolve a Baseline: http://www.oracle.com/technetwork/articles/database/create-sql-plan- baseline-2237506.html Share my experience using it on production environments •RAC and single instance •Closed source applications (Black Box) •1000+ users, 40+ concurrent 4 © 2014 Pythian Confidential
  • 5. Today’s topics •What is SQL Plan Management? •Simple example –SQL matching –Plan matching –New plan generation –Helper scripts •Evolution on 11g / 12c •Challenges •Troubleshooting •Daily management –11g suggested approach 5 © 2014 Pythian Confidential
  • 6. Introduction to SQL Plan Management •SQL Plan Management is a new feature of Oracle 11.1 with no extra cost, available on Enterprise edition, enabled by default. •The Oracle Optimizer is able to use only well-known execution plans, avoiding the usage of others plans we know inferior performance (regression). What Why How 6 © 2014 Pythian Confidential
  • 7. Introduction to SQL Plan Management Changes in SQL plan execution can lead to worse execution times, and can impact system performance. It can be caused from a variety of reasons: –Optimizer version, statistics, and parameters –Structural objects changes (datatype, indexes, partitions) –System settings –System growth (skewed data, concurrency) –And many more. See additional reason here: http://jonathanlewis.wordpress.com/2013/12/23/plan-changes/ Oracle Database already has several ways to control plan execution that works at different stages in the cost based Optimizer: •Stored Outlines (deprecated in 11.1) •SQL Profiles: adds statistics to the plan evaluation phase of the Optimizer (DBMS_SQLTUNE) •SQL Hints: forces the optimizer to follow a specific path/action What Why How 7 © 2014 Pythian Confidential
  • 8. Introduction to SQL Plan Management •Baselines are new objects stored on SYSAUX tablespace(SMB area) •Each SQL statement can have many baselines •Only enabledand acceptedplans are used •Fixed plans take precedence, and no new plans are auto added •Stages: plan load –plan selection –plan evolution •New evolve advisor autotaskin 12c •SQL needs to run more than once to be considered •Baselines are global -not per schema Initialization parameters •OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES (Default: FALSE) •OPTIMIZER_USE_SQL_PLAN_BASELINES (Default: TRUE) What Why How 8 © 2014 Pythian Confidential
  • 9. Introduction to SQL Plan Management -How Old history SQL is issued Execution plan is generated SQL is executed Oracle Cost Based Optimizer (CBO) Before 11g 9 © 2014 Pythian Confidential
  • 10. Introduction to SQL Plan Management -How Baselines are the last step evaluated by the Oracle Optimizer: if an enabledand acceptedplan for the statement exists, it will be used, maybe discarding the already generated plan. SQL is issued Execution plan is generated SQL is executed Oracle Cost Based Optimizer (CBO) Since 11g 10 © 2014 Pythian Confidential
  • 11. Introduction to SQL Plan Management -How http://docs.oracle.com/database/121/TGSQL/tgsql_spm.htm#TGSQL626 Oracle Cost Based Optimizer (CBO) Since 11g 11 © 2014 Pythian Confidential
  • 12. SPM example –setup SQL*Plus: Release 11.2.0.3.0 Production on Thu Aug 7 23:46:48 2014 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 -64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> create table pp(n number, c varchar2(100)); Table created. SQL> insert into pp select rownum, object_idfrom dba_objectswhere rownum< 100; 99 rows created. SQL> create index pp_idxon pp(n); Index created. SQL> exec dbms_stats.gather_table_stats(user, ‘PP'); PL/SQL procedure successfully completed. 12 © 2014 Pythian Confidential
  • 13. SPM example –capture SQL execution SQL> alter session set optimizer_capture_sql_plan_baselines= TRUE; Session altered. SQL> varn number; SQL> exec :n := 1; PL/SQL procedure successfully completed. SQL> select * from pp where n=:n; N C ------------------------------------------------------------------------ 1 20 SQL> / N C ------------------------------------------------------------------------ 1 20 SQL> alter session set optimizer_capture_sql_plan_baselines= FALSE; Session altered. 13 © 2014 Pythian Confidential
  • 14. SPM example –SQL and baseline matching select signature, sql_handle, plan_name, enabled, accepted, fixed, sql_text from dba_sql_plan_baselines; SIGNATURE SQL_HANDLE PLAN_NAME ENA ACC FIX SQL_TEXT -------------------------------------------------------------------------------------------------- 1245871306398155660SQL_114a395a2db6c38c SQL_PLAN_12kjtb8qvdhwc8a71e415 YES YESNO select * from pp select sql_id, exact_matching_signature, sql_text from v$sql where sql_textlike 'select * from pp %'; SQL_IDEXACT_MATCHING_SIGNATURE SQL_TEXT ------------------------------------------------------------------- 0a14b3yhux0401245871306398155660select * from pp where n=:n 14 © 2014 Pythian Confidential
  • 15. SPM example –SQL and baseline matching Our Baseline: select signature, plan_namefrom dba_sql_plan_baselines; SIGNATURE PLAN_NAME ------------------------------------------ 1245871306398155660 SQL_114a395a2db6c38c select * from pp where n=:n; select * from pp where n=2; select * from pp where n=1; select sql_id, exact_matching_signature, force_matching_signature, sql_text from v$sql where sql_textlike 'select * from pp %'; SQL_IDEXACT_MATCHING_SIGNATURE FORCE_MATCHING_SIGNATURE SQL_TEXT ------------------------------------------------------------------------------------------- D387kpdvh4anb 11466572521187337874 15110712337079575277 select * from pp where n=2 0a14b3yhux04012458713063981556601245871306398155660 select * from pp where n=:n 86svufrd72xqg14183734311806369169 15110712337079575277select * from pp where n=1 15 © 2014 Pythian Confidential
  • 16. SPM example –plan from last run in SGA SQL> select * from table(dbms_xplan.display_cursor); SQL_ID0a14b3yhux040, child number 1 ------------------------------------- select * from pp where n=:n Plan hash value: 2547524127 -------------------------------------------------------------------------------------- | Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT||| | 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| PP |1 | 6 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN| PP_IDX |1 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 -access("N"=:N) Note -SQL plan baseline SQL_PLAN_12kjtb8qvdhwcdeb317bfused for this statement 16 © 2014 Pythian Confidential
  • 17. SPM example –hints/plan used by Baseline SQL> select * from table(dbms_xplan.display_sql_plan_baseline( plan_name=> 'SQL_PLAN_12kjtb8qvdhwcdeb317bf', format => 'OUTLINE')); -------------------------------------------------------------------------------- SQL handle: SQL_114a395a2db6c38c SQL text: select * from pp where n=:n -------------------------------------------------------------------------------- Plan name: SQL_PLAN_12kjtb8qvdhwcdeb317bfPlanid: 3736278975 Enabled: YESFixed: NOAccepted: YESOrigin: AUTO-CAPTURE -------------------------------------------------------------------------------- Outline Data from SMB: /*+ BEGIN_OUTLINE_DATA INDEX_RS_ASC(@"SEL$1" "PP"@"SEL$1" ("PP"."N")) OUTLINE_LEAF(@"SEL$1") ALL_ROWS DB_VERSION('11.2.0.3') OPTIMIZER_FEATURES_ENABLE('11.2.0.3') IGNORE_OPTIM_EMBEDDED_HINTS END_OUTLINE_DATA */ 17 Where is the Plan hash value? 2547524127 © 2014 Pythian Confidential
  • 18. SPM example –view definition select text from dba_viewswhere view_name='DBA_SQL_PLAN_BASELINES'; SELECT /*+ dynamic_sampling(3) */ so.signature, st.sql_handle, ... DECODE(BITAND(so.flags, 1), 1, 'YES', 'NO'), --enabled DECODE(BITAND(so.flags, 2), 2, 'YES', 'NO'), --accepted ... FROM sqlobj$ so, sqlobj$auxdataad, sql$textst WHERE so.signature= st.signatureAND ad.signature= st.signatureAND so.signature= ad.signatureAND so.plan_id= ad.plan_idAND so.obj_type= 2 AND ad.obj_type= 2 18 © 2014 Pythian Confidential
  • 19. SPM example –similar now including PHV2 SELECT /*+ dynamic_sampling(3) */ so.signature, so.name plan_name, DECODE(BITAND(so.flags, 1), 1, 'YES', 'NO') enabled, DECODE(BITAND(so.flags, 2), 2, 'YES', 'NO') accepted, so.plan_idphv2 FROM sqlobj$ so, sqlobj$auxdataad, sql$textst WHERE so.signature= st.signatureAND ad.signature= st.signatureAND so.signature= ad.signatureAND so.plan_id= ad.plan_idAND so.obj_type= 2 AND ad.obj_type= 2; SIGNATURE PLAN_NAME ENA ACC PHV2 ------------------------------------------------------------------- 1245871306398155660 SQL_PLAN_12kjtb8qvdhwc8a71e415 YES YES2322719765 19 © 2014 Pythian Confidential
  • 20. SPM example –SQL matching plan number col phv2 for 9999999999 SELECT p.sql_id, p.plan_hash_value, p.child_number, x.phv2 FROM v$sql_planp ,xmltable('for $iin /other_xml/info where $i/@type eq"plan_hash_2" return $i' passing xmltype(p.other_xml) columns phv2 number path '/') x WHERE p.sql_id= '0a14b3yhux040' and p.other_xmlis not null; SQL_IDPLAN_HASH_VALUE CHILD_NUMBER PHV2 ------------------------------------------------------------ 0a14b3yhux040 29329474960 2322719765 Our previous result from the almost similar to DBA_SQL_PLAN_BASELINES: SIGNATURE PLAN_NAME ENA ACC PHV2 ------------------------------------------------------------------- 1245871306398155660 SQL_PLAN_12kjtb8qvdhwc8a71e415 YES YES2322719765 20 © 2014 Pythian Confidential
  • 21. Introduction to SQL Plan Management -How •Important attributes of a baseline (DBA_SQL_PLAN_BASELINES): •ENABLED –this can be used if accepted •ACCEPTED –this can be used if enabled •FIXED –use this as preferred–no evolution •PARSING_SCHEMA_NAME •ADAPTIVE –new in 12c •Purging policy –weekly autotaskto delete unused plans. Parameters: •SPACE_BUDGET_PERCENT -% used -default 10 -alert.log •PLAN_RETENTION_WEEKS –to delete non used plans -default 53 •DBA_SQL_MANAGEMENT_CONFIG view •Can be changed using DBMS_SPM.CONFIGURE 21 © 2014 Pythian Confidential
  • 22. SQL Plan Management objects SPM included in the SQL Management Base (SMB). SBM also has: –Statement log –SQL$ –Baselines plan history (12c) -SQLOBJ$PLAN –SQL plan baselines •DBA_SQL_PLAN_BASELINES view •DBMS_SPM package –SQL profiles •DBA_SQL_PROFILES view •DBMS_SQLTUNE / DBMS_AUTO_SQLTUNE package 22 © 2014 Pythian Confidential
  • 23. When to use SPM •Just another tool for performance management •Database upgrade: known plans can be captured/exported/imported •Third party applications: can include exported baselines to guarantee known behaviour What is automated by advisors? •SQL Tuning Advisor (Tuning pack licence!) -SYS_AUTO_SQL_TUNING_TASK –Create profiles (and baseline if present) if ACCEPT_SQL_PROFILES parameter is TRUE –Manually using DBMS_AUTO_SQLTUNE.ACCEPT_SQL_PROFILE •Evolve advisor on 12c -SYS_AUTO_SPM_EVOLVE_TASK(more later) –parameter ACCEPT_PLANS defaults TRUE All good things without extra effort? •Forces us to follow the evolution of SQLs who uses it –blindly trust is not a good idea •Needs a good understanding to explain why an existing baseline is not used 23 © 2014 Pythian Confidential
  • 24. More than just plan selection Plan load/capture and evolution Creating new Baselines manually: •capture plans being in use by the instance –OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE •load plans from cursor cache –DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE •load plans from SQL tuning set -Oracle Tuning Pack license –DBMS_SPM.LOAD_PLANS_FROM_SQLSET New baselines are generated automatically: •for statement that already have Baselines created (when new plans are parsed by the optimizer, as non accepted) –it is not capture! •when creating a SQL Profile on a statement that has Baseline (as accepted) Non accepted plans become acceptedbecause evolution or DBMS_SPM attribute change 24 © 2014 Pythian Confidential
  • 25. New plan generation SQL> alter index pp_idxinvisible; Index altered. SQL> select * from pp where n=:n; N C ------------------------------------------------------- 1 20 SQL> select * from table(dbms_xplan.display_cursor); SQL_ID 0a14b3yhux040, child number 1 ------------------------------------- select * from pp where n=:n Plan hash value: 2932947496 -------------------------------------------------------------------------- | Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time| -------------------------------------------------------------------------- | 0 | SELECT STATEMENT |||| 2 (100)| | |* 1 | TABLE ACCESS FULL| PP | 1 | 6 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- 25 © 2014 Pythian Confidential
  • 26. New plan generation select sql_handle, plan_name, enabled, accepted, fixed, reproduced, sql_text from dba_sql_plan_baselines; SQL_HANDLEPLAN_NAMEENA ACC FIX REP SQL_TEXT -------------------------------------------------------------------------------------------- SQL_114a395a2db6c38c SQL_PLAN_12kjtb8qvdhwc8a71e415 YES NO NOYES select * from pp where n=:n SQL_114a395a2db6c38c SQL_PLAN_12kjtb8qvdhwcdeb317bfYES YESNO NOselect * from pp where n=:n As the existing baseline could not be reproduced, a new plan was used, and automatically added as non accepted. Which plan was the original? select * from table(dbms_xplan.display_sql_plan_baseline( plan_name=> 'SQL_PLAN_12kjtb8qvdhwcdeb317bf')); 26 © 2014 Pythian Confidential
  • 27. New plan generation –11g shows wrong plan -------------------------------------------------------------------------------- SQL handle: SQL_114a395a2db6c38c SQL text: select * from pp where n=:n ------------------------------------------------------------------------------- Plan name: SQL_PLAN_12kjtb8qvdhwcdeb317bfPlan id: 3736278975 Enabled: YESFixed: NOAccepted: YESOrigin: AUTO-CAPTURE -------------------------------------------------------------------------------- Plan hash value: 2932947496 -------------------------------------------------------------------------- | Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time| -------------------------------------------------------------------------- | 0 | SELECT STATEMENT || 1 | 6 | 2 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| PP | 1 | 6 | 2 (0)| 00:00:01 | -------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 -filter("N"=TO_NUMBER(:N)) 27 © 2014 Pythian Confidential
  • 28. New plan generation –12c shows correct plan -------------------------------------------------------------------------------- SQL handle: SQL_114a395a2db6c38c SQL text: select * from pp where n=:n ------------------------------------------------------------------------------- Plan name: SQL_PLAN_12kjtb8qvdhwcdeb317bfPlan id: 3736278975 Enabled: YESFixed: NOAccepted: YESOrigin: AUTO-CAPTURE -------------------------------------------------------------------------------- Plan hash value: 452276032 ------------------------------------------------------------------------------------------------------ | Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT|||| 2 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED| PP |1 |6 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN| PP_IDX |1 || 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------ … 28 © 2014 Pythian Confidential
  • 29. No misunderstandings Each SQL Baseline stores the original SQL execution plan? –11g: no, it regenerates the plan using captured data •SQLOBJ$AUXDATA •dbms_xplan.display_sql_plan_baselinecan show a plan different from the original captured –12c: stores the original execution plan •SQLOBJ$PLAN 29 © 2014 Pythian Confidential
  • 30. Scripts for creating new Baselines •SQLTXPLAIN (SQLT) -MOS note 215187.1 –Tool that helps to diagnose SQL statements performing poorly –coe_load_sql_baseline.sql–allows to add a plan generated by a modified SQL to the original –Also useful when loading a plan from AWR (must go through SQL tuning set) 30 © 2014 Pythian Confidential
  • 31. Using SQLT to binda modifiedplan SQL_IDEXACT_MATCHING_SIGNATURE PLAN_HASH_VALUE CHILD SQL_TEXT --------------------------------------------------------------------------------------------------- fxdv1cmv8cksa687377043604823894329329474960 select /*+ FULL(pp) */ * from pp where n =:n 0a14b3yhux0401245871306398155660452276032 0 select * from pp where n=:n SQL> select * from dba_sql_plan_baselines; no rows selected SQL> stacoe_load_sql_baseline0a14b3yhux040fxdv1cmv8cksa 2932947496 … Plans Loaded: 1 sys_sql_handle: "SQL_114a395a2db6c38c" sys_plan_name: "SQL_PLAN_12kjtb8qvdhwc8a71e415" SQL> select * from pp where n=:n; SQL_IDEXACT_MATCHING_SIGNATURE PLAN_HASH_VALUE CHILD SQL_TEXT --------------------------------------------------------------------------------------------------- fxdv1cmv8cksa687377043604823894329329474960 select /*+ FULL(pp) */ * from pp where n =:n 0a14b3yhux0401245871306398155660452276032 0 select * from pp where n=:n 0a14b3yhux040124587130639815566029329474961 select * from pp where n=:n 31 © 2014 Pythian Confidential
  • 32. How SQL Plan Management interact with ...? •Stored Outlines (desupportannounced on 11.1) •SQL Profiles –since 10g •Adaptive Cursor Sharing (ACS) –new 11g •Adaptive Query Optimization (12c) –Adaptive Plans (joins and parallel distribution methods) –Adaptive Statistics (at compile time and at runtime)) 32 © 2014 Pythian Confidential
  • 33. How SQL Plan Management interact with ...? •Stored Outlines (desupportannounced on 11.1) •SQL Profiles –since 10g •Adaptive Cursor Sharing (ACS) –new 11g •Adaptive Query Optimization (12c) –Adaptive Plans (joins and parallel distribution methods) –Adaptive Statistics (at compile time and at runtime)) Affects plan selection/creation, but SPM is the last step! Some bugs in the past with profiles+baselines-12980183 ACS and SPM demo: https://blogs.oracle.com/optimizer/resource/acs-spm- figures/acs-spm-script.sql 33 © 2014 Pythian Confidential
  • 34. Management of new plans (evolution) Only better performing plans are accepted considering elapsed time, logical IO and CPU time –Plan reproducibility plays here (ACS/Binds) 11g: manually using DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE 12c: new Evolve Advisor configured as a daily autotask –SYS_AUTO_SPM_EVOLVE_TASK –Result report using DBMS_SPM.REPORT_AUTO_EVOLVE_TASK –Automatically accepts new baselines performing better •parameter ACCEPT_PLANS defaults TRUE –Manuallytoo with DBMS_SPM.CREATE_EVOLVE_TASK –DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE deprecated 34 © 2014 Pythian Confidential
  • 35. Plan evolution in 11g set long 100000 vare clob; exec :e := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE( SQL_HANDLE=>'SQL_114a395a2db6c38c', COMMIT => 'NO'); print; 35 © 2014 Pythian Confidential
  • 36. Evolve SQL Plan Baseline Report ------------------------------------------------------------------------------- Inputs: ------- SQL_HANDLE = SQL_114a395a2db6c38c PLAN_NAME = TIME_LIMIT = DBMS_SPM.AUTO_LIMIT VERIFY = YES COMMIT = NO Plan: SQL_PLAN_12kjtb8qvdhwc8a71e415 ------------------------------------ Plan was verified: Time used .06 seconds. Plan failed performance criterion: 1.02 times better than baseline plan. Baseline Plan Test Plan Stats Ratio --------------------------------- Execution Status: COMPLETE COMPLETE Rows Processed: 1 1 Elapsed Time(ms): .494 .101 4.89 CPU Time(ms): .444 .111 4 Buffer Gets: 2 2 1 Physical Read Requests: 0 0 Physical Write Requests: 0 0 Physical Read Bytes: 0 0 Physical Write Bytes: 0 0 Executions: 1 1 36 -------------------------------------------- Report Summary -------------------------------------------- Number of plans verified: 1 Number of plans accepted: 0 © 2014 Pythian Confidential
  • 37. Plan evolution in 11g Continuing with our example: –invisible index set long 100000 vare clob; exec :e := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE( SQL_HANDLE=>'SQL_114a395a2db6c38c', COMMIT => 'NO'); print; ---------------------------------------------------------- Evolve SQL Plan Baseline Report ---------------------------------------------------------- Inputs: ------- SQL_HANDLE = SQL_114a395a2db6c38c PLAN_NAME = TIME_LIMIT = DBMS_SPM.AUTO_LIMIT VERIFY = YES COMMIT = NO Plan: SQL_PLAN_12kjtb8qvdhwc8a71e415 ------------------------------------ Plan was not verified. Using cost-based plan as could not reproduce any accepted and enabled baseline plan. ----------------------------------------------------------- Report Summary ----------------------------------------------------------- Number of plans verified: 0 Number of plans accepted: 0 37 © 2014 Pythian Confidential
  • 38. Plan evolution in 11g –results examples Plan: SQL_PLAN_12kjtb8qvdhwc8a71e415 ------------------------------------ Plan was verified: Time used 7,932 seconds. Plan failed performance criterion: performance equal to baseline plan. Plan was verified: Time used 152,247 seconds. Plan failed performance criterion: 1,20 times worse than baseline plan. Plan was verified: Time used 37,411 seconds. Plan failed performance criterion: 17,5 times worse than baseline plan. Plan was verified: Time used 314,085 seconds. Plan verification timed out. Plan was verified: Time used 32,618 seconds. Error encountered during plan verification (ORA-16960). ORA-16960: SQL Analyze no ha podidoreproducirel plan deseado. Plan was verified: Time used 313,330 seconds. Plan passed performance criterion. 38 © 2014 Pythian Confidential
  • 39. Plan evolution on 12c 39 11g evolution deprecated but runs set long 100000 vare clob; exec :e := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE( SQL_HANDLE=>'SQL_114a395a2db6c38c', COMMIT => 'NO'); print; GENERAL INFORMATION SECTION -------------------------------------------------------- Task Information: ----------------------------------------- Task Name : TASK_1604 Task Owner : SYS Execution Name : EXEC_1681 Execution Type : SPM EVOLVE Scope : COMPREHENSIVE Status : COMPLETED Started : 08/09/2014 21:07:53 Finished : 08/09/2014 21:07:53 Last Updated : 08/09/2014 21:07:53 Global Time Limit : 2147483646 Per-Plan Time Limit : UNUSED Number of Errors : 0 -------------------------------------------------------- SUMMARY SECTION -------------------------------------------------------- Number of plans processed : 1 Number of findings : 1 Number of recommendations : 0 Number of errors : 0 -------------------------------------------------------- … © 2014 Pythian Confidential
  • 40. 40 © 2014 Pythian Confidential DETAILS SECTION ------------------------------------------------------- Object ID : 2 Test Plan Name : SQL_PLAN_12kjtb8qvdhwc8a71e415 Base Plan Name : SQL_PLAN_12kjtb8qvdhwca9f022c1 SQL Handle : SQL_114a395a2db6c38c Parsing Schema : SYS Test Plan Creator : SYS SQL Text : select * from pp where n=:n Bind Variables: ----------------------------- 1 -(NUMBER): 99 Execution Statistics: ----------------------------- Base Plan Test Plan -------------------------------- Elapsed Time (s): .000003 .000003 CPU Time (s): 0 0 Buffer Gets: 0 0 Optimizer Cost: 2 2 Disk Reads: 0 0 Direct Writes: 0 0 Rows Processed: 0 0 Executions: 10 10 FINDINGS SECTION -------------------------------------------------------- Findings (1): ----------------------------- 1. The plan was verified in 0.02000 seconds. It failed the benefit criterion because its verified performance was 0.66667 times worse than that of the baseline plan. EXPLAIN PLANS SECTION -------------------------------------------------------- Baseline Plan ----------------------------- Plan Id : 2201 Plan Hash Value : 2851087041 --------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | Time | ----------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 6 | 2 | 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID BATCHED | PP | 1 | 6 | 2 | 00:00:01 | | * 2 | INDEX RANGE SCAN | PP_IDX | 1 | | 1 | 00:00:01 | ----------------------------------------------------------------------------------------- Predicate Information (identified by operation id): ------------------------------------------ * 2 -access("N"=:N) Test Plan ----------------------------- Plan Id : 2202 Plan Hash Value : 2322719765 --------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost | Time | --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 6 | 2 | 00:00:01 | | * 1 | TABLE ACCESS FULL | PP | 1 | 6 | 2 | 00:00:01 | ---------------------------------------------------------------------
  • 41. Plan evolution on 12c -automatic 41 SELECT owner, description, advisor_name, created, last_modified, status, recommendation_countrc FROM dba_advisor_tasks WHERE task_name= 'SYS_AUTO_SPM_EVOLVE_TASK'; OWNER DESCRIPTIONADVISOR_NAMECREATED LAST_MODI STATUS RC ---------------------------------------------------------------------------------- SYSAutomatic SPM Evolve Task SPM Evolve Advisor 24-MAY-13 09-AUG-14 COMPLETED 0 SELECT count(*) FROM DBA_ADVISOR_PARAMETERS WHERE TASK_NAME = 'SYS_AUTO_SPM_EVOLVE_TASK'; COUNT(*) ---------- 29 Viewing result report (same output as before): select dbms_spm.report_auto_evolve_taskfrom dual; © 2014 Pythian Confidential
  • 42. Plan evolution on 12c -manually varr varchar2(30); vart varchar2(20); exec :t := 'EVOTASK'; --with no parameter will consider all non ACCEPTED baselines exec :r := dbms_spm.create_evolve_task(task_name=>:t, description=>:t, plan_name=>'SQL_PLAN_12kjtb8qvdhwc8a71e415'); exec :r := dbms_spm.execute_evolve_task(:t, 'run1', 'first evolve run'); SELECT advisor_name, created, last_modified, status, how_created, recommendation_countrc FROM dba_advisor_tasks WHERE task_name= :t; ADVISOR_NAMECREATED LAST_MODI STATUS HOW_CREATEDRC ------------------------------------------------------------------------------------- SPM Evolve Advisor 09-AUG-14 09-AUG-14COMPLETED CMD0 vare clob; exec :e := dbms_spm.report_evolve_task(:t); col e for 150 print eSame report as before 42 © 2014 Pythian Confidential
  • 43. Plan evolution on 12c -manually Recommendation section: provides command to execute Findings (1): ----------------------------- 1. None of the accepted plans were reproducible. Recommendation: ----------------------------- Consider accepting the plan. Execute dbms_spm.accept_sql_plan_baseline(task_name=> 'EVOTASK', object_id=> 2, task_owner=> 'SYS'); 43 © 2014 Pythian Confidential
  • 44. Implementing automatic evolution on 11g 44 declare cursor c_nuevos_baselinesis select sql_handle, PLAN_NAME, (select count(1) from DBA_SQL_PLAN_BASELINES b2 where b.sql_handle=b2.sql_handle and b2.accepted='YES') aceptados from DBA_SQL_PLAN_BASELINES b where enabled='YES' and accepted='NO' and created > trunc(sysdate)-7 order by sql_handle, PLAN_NAME, created; begin dbms_output.put_line('varr long;'); dbms_output.put_line('set long 100000'); dbms_output.put_line('spool evolve-results-'||to_char(sysdate,'yyyymmdd')||'.txt'); for r_blin c_nuevos_baselinesloop dbms_output.put_line('##################'); if r_bl.aceptados> 0 then dbms_output.put_line('exec :r:=dbms_spm.evolve_sql_plan_baseline(sql_handle=> '''||r_bl.sql_handle|| ''', plan_name=>'''||r_bl.plan_name||''', commit => ''NO'');'); dbms_output.put_line('print;'); end if; dbms_output.put_line('select * from table(dbms_xplan.display_sql_plan_baseline('|| 'sql_handle=>'''||r_bl.sql_handle||''', plan_name=>'''||r_bl.plan_name||'''));'); end loop; dbms_output.put_line('spool off'); end; / © 2014 Pythian Confidential
  • 45. Implementing automatic evolution on 11g 45 Sample run: set serverouputon spool toevolve.sql @autoevo11g spool off @toevolve --to evolve.sqlgenerated: varr long; set long 100000 spool evolve-results-20140810.txt ################## exec :r:=dbms_spm.evolve_sql_plan_baseline(sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwcdeb317bf', commit => 'NO'); print; select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwcdeb317bf')); spool off PL/SQL procedure successfully completed. Usually the result is a long report. This case is the same as seen today © 2014 Pythian Confidential
  • 46. Challenges? •SQL without using bind variables -Different statements (signature/sql_id), different baselines -Change app code. Last resource CURSOR_SHARING=FORCE •SQL with too many bind variables -Maybe cannot reproduce plan –needs a trace to confirm -Maybe errors when evolving new ones –(Bug 19326647 on 11.2.0.3) •SQL already using hints -Test original with alter session set _optimizer_ignore_hints •SQL already using SQL Profiles -Test original with alter session set sqltune_category=‘NNN'; 46 © 2014 Pythian Confidential
  • 47. Challenges Why my SQL has baselines and none is being used? 1)SPM disabled by parameter 2)Stored outline created –use it and ignore baselines 3)Similar objects on different schemas 4)Baseline cannot be reproduced 5)Bugs 47 © 2014 Pythian Confidential
  • 48. Challenge -similar objects on different schemas Common on database consolidation scenarios •Baselines are global for the database (not per schema) •Same table names, different schemas, same SQL –Look at object definition/indexes on each schema Column PARSING_SCHEMA_NAME in DBA_SQL_PLAN_BASELINEShelps –CREATOR and ORIGIN can lead too 48 © 2014 Pythian Confidential
  • 49. Challenge -baseline cannot be reproduced •Object changes: if tables used by SQL baseline changes, it can stop being used –Remember 11g does not stores captured plans when investigating •Same PLAN_HASH_VALUE2? –minor bugs played here •Trace to the rescue: –It can be reproduced? => session level •10053 / spm_tracing/ SQL_Plan_Management –Statement level to capture global activity --new connections only •alter system set events 'trace[rdbms.SQL_Optimizer.*][sql: 0a14b3yhux040]’ –If using connection pools •dbms_sqldiag.dump_trace(…p_component=>'Compiler‘) 49 © 2014 Pythian Confidential
  • 50. Troubleshooting SPM –trace alternatives Global statement trace for already existing and new connections: dbms_sqldiag.dump_trace(p_sql_id=>'0a14b3yhux040', p_child_number=>0, p_component=>'Compiler', p_file_id=>'trace_0a14b3yhux040'); SPM Trace at session level: ALTER SESSION SET EVENTS'trace[RDBMS.SQL_Plan_Management.*]'; Internal SPM trace generation (more detailed): EXEC dbms_spm.configure('spm_tracing',1); --validate current settings: SELECT * FROM sys.smb$configWHERE parameter_name='SPM_TRACING'; Classic optimizer trace, which includes SPM standard trace: ALTER SESSION SET EVENTS 'trace[sql_optimizer.*]'; --same but for in older Oracle versions ALTER SESSION SET EVENTS='10053 trace name context forever, level 1'; 50 © 2014 Pythian Confidential
  • 51. Troubleshooting SPM –trace results When a Plan Baselineis found and used: SPM: statement found in SMB SPM: cost-based plan found in the plan baseline, planId= 3736278975 SPM: cost-based plan successfully matched, planId= 3736278975 When no matching Plan Baseline found, adding new one as non-accepted: SPM: statement found in SMB SPM: setup to add new plan to existing plan baseline, sig = 1245871306398155660, planId= 2322719765 SPM: planId'sof plan baseline are: 3736278975 SPM: using qksanto reproduce, cost and select accepted plan, sig = 1245871306398155660 SPM: failed to reproduce the planusing the following info: SPM: generated non-matching plan: SPM: couldn't reproduce any enabled+acceptedplan so using the cost-based plan, planId= 2322719765 SPM: add new plan: sig = 1245871306398155660, planId= 2322719765 SPM: new plan added to existing plan baseline, sig = 1245871306398155660, planId= 2322719765 SPM: REPRODUCED status changed to NO: sig = 1245871306398155660, planName= SQL_PLAN_12kjtb8qvdhwcdeb317bf 51 © 2014 Pythian Confidential
  • 52. Usage decision •optimizer_capture_sql_plan_baselines= TRUE OR •created when needed by each SQL? No silver bullet, choose the better one for your environment Use case: •some queries from a specific program would benefit from parameter=value –instead of changing the parameter and avoid this functionality to be used on other cases which would be beneficial, SQL baselines are created just for those programs –It is more manual work to have a functionality available for the other users 52 © 2014 Pythian Confidential
  • 53. Daily management overhead Evaluate autotasksrecommendations: •Trusting automatic creation of SQL Profiles/Baselines? •SQL Tuning Advisor (SQLTA) / SPM Evolve Advisor (12c) •Several views and reports to explore their results using SQL –dba_advisor_tasks/ dba_advisor_rationale •IF SQLTA recommends a SQL profile for a SQL that has no baselines –create the new SQL profile –move it to a SQL baseline –Disable SQL profile •On 11g: evaluate daily new baselines evolving them –How to deal with heavy activity and lots of new plans? AWR helps 53 © 2014 Pythian Confidential
  • 54. Daily management example approach 54 •Better performing evolved plans should be testing with a variety of binds on test environment before accepting them •Disable evaluated and confirmed non good plans exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', attribute_name=>'enabled', attribute_value=>'NO'); select count(*), count(distinct sql_handle) sqls, accepted, enabled from dba_sql_plan_baselines group by accepted, enabled; COUNT(*) SQLS ACC ENA --------------------- 13792 13788 YES YESare in use by optimizer 20 16 YES NO 5588 3063 NO YES 210 25 NO NO © 2014 Pythian Confidential
  • 55. Daily management example approach 55 •Better performing evolved plans should be testing with a variety of binds on test environment before accepting them •Disable evaluated and confirmed non good plans exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', attribute_name=>'enabled', attribute_value=>'NO'); select count(*), count(distinct sql_handle) sqls, accepted, enabled from dba_sql_plan_baselines group by accepted, enabled; COUNT(*) SQLS ACC ENA --------------------- 13792 13788 YES YESare in use by optimizer 20 16 YES NO used but manually disabled because of problems found 5588 3063 NO YES 210 25 NO NO © 2014 Pythian Confidential
  • 56. Daily management example approach 56 •Better performing evolved plans should be testing with a variety of binds on test environment before accepting them •Disable evaluated and confirmed non good plans exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', attribute_name=>'enabled', attribute_value=>'NO'); select count(*), count(distinct sql_handle) sqls, accepted, enabled from dba_sql_plan_baselines group by accepted, enabled; COUNT(*) SQLS ACC ENA --------------------- 13792 13788 YES YESare in use by optimizer 20 16 YES NO used but manually disabled because of problems found 5588 3063 NO YESnew plans that needs evaluation 210 25 NO NO © 2014 Pythian Confidential
  • 57. Daily management example approach 57 •Better performing evolved plans should be testing with a variety of binds on test environment before accepting them •Disable evaluated and confirmed non good plans exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', attribute_name=>'enabled', attribute_value=>'NO'); select count(*), count(distinct sql_handle) sqls, accepted, enabled from dba_sql_plan_baselines group by accepted, enabled; COUNT(*) SQLS ACC ENA --------------------- 13792 13788 YES YESare in use by optimizer 20 16 YES NO used but manually disabled because of problems found 5588 3063 NO YESnew plans that needs evaluation 210 25 NO NOalready evaluated new plans nod performing good © 2014 Pythian Confidential
  • 58. Daily management example approach 58 •Better performing evolved plans should be testing with a variety of binds on test environment before accepting them •Disable evaluated and confirmed non good plans exec :r :=DBMS_SPM.ALTER_SQL_PLAN_BASELINE (sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_12kjtb8qvdhwca9f022c1', attribute_name=>'enabled', attribute_value=>'NO'); select count(*), count(distinct sql_handle) sqls, accepted, enabled from dba_sql_plan_baselines group by accepted, enabled; COUNT(*) SQLS ACC ENA --------------------- 13792 13788 YES YESare in use by optimizer 20 16 YES NO used but manually disabled because of problems found 5588 3063 NO YESnew plans that needs evaluation 210 25 NO NOalready evaluated new plans nod performing good Will you read a report with 5588 evolutions? Need an improved approach © 2014 Pythian Confidential
  • 59. Choosing what to evolve on 11g using stats 59 Which statements are now running in more than 5s and have non accepted baselines? select * from ( select s.inst_id, s.sql_id ,min(s.first_load_time) min_load_time ,sum(s.executions) eje ,round(sum(s.elapsed_time)/1000000/greatest(sum(s.executions),1),2) avg_sec ,round(sum(s.disk_reads)/greatest(sum(s.executions),1),2) avg_reads ,round(sum(s.buffer_gets)/greatest(sum(s.executions),1),2) avg_gets ,dense_rank() over (order by sum(s.elapsed_time)/greatest(sum(s.executions),1) desc) rank from gv$sqls, DBA_SQL_PLAN_BASELINES b where s.FORCE_MATCHING_SIGNATURE=b.signature and b.enabled='YES' and b.accepted='YES' and exists (select 1 from DBA_SQL_PLAN_BASELINES b2 where b.sql_handle=b2.sql_handle and b2.enabled='YES' and b2.accepted='NO') group by s.inst_id, s.sql_id having sum(s.elapsed_time)/greatest(sum(s.executions),1)/1000000 > 5) where rank < 50 order by rank desc; © 2014 Pythian Confidential
  • 60. Choosing what to evolve on 11g using stats 60 Output example: INST_ID SQL_ID MIN_LOAD_TIME EJE AVG_SEC AVG_READS AVG_GETS RANK -------------------------------------------------------------------------------------------- 1 4baj8ju7nqpvt 2014-06-22/24:30:20 2 4,34 4872 23787 15 2 7n8hbzpruj4nu 2014-06-22/07:03:04 327 4,42 2007,47 74787,87 14 2 t0jxh8b7b4at2 2014-20-22/04:02:48 2 4,44 223 2427 13 3 7n8hbzpruj4nu 2014-06-22/07:47:28 569 7,28 2342,87 78480,22 12 1 t22bnbazvj87x 2014-06-22/20:03:42 38 8,23 2348,8 3444,2 11 3 t2qx4bv4y383b 2014-06-22/23:38:32 28 8,38 4207,32 47883,72 10 2 arpa78rrkhp80 2014-06-22/08:27:28 240 8,42 2242,8 4747,24 9 2 t7qntjn4aaj8k 2014-06-22/22:48:27 22 8,47 2787,33 4780,83 8 2 04h4pq4tpn238 2014-06-22/08:32:08 32 8,78 2207,83 20427,44 7 3 bqtx4q2jas08u 2014-06-22/02:43:22 34 20,33 2737,28 3444,2 6 3 t2qx4bv4y383b 2014-06-22/22:24:02 22 20,88 4780,4 47282,78 5 2 7qbkbt7h00wtw 2014-06-22/07:30:37 404 23,42 2228,87 73488,07 4 2 0s2b777vta78b 2014-06-22/07:28:02 283 24,8 2377,83 273342,87 3 1 7qbkbt7h00wtw 2014-06-08/04:04:27 647 27,43 2788,34 80848,38 2 2 2rnttntn3xb4r 2014-06-22/23:48:28 22 32,77 7273,77 42244,87 1 15 rows selected. Needs another join to show baseline plan_name. That idea next with AWR © 2014 Pythian Confidential
  • 61. Choosing what to evolve on 11g using AWR 61 Non accepted baselines of statements with executions times max/min variations of 5 times •AWR has historical data, needs Diagnostic Pack license Output example: SQL_HANDLE SQL_ID MAXE MINE PLANS #accept PLAN_NAME CREATED ACC FIX -------------------------------------------------------------------------------------------------------------- SQL_x1c4f31970638583 y283zg7xww7am 4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk11258e3b6f 08/07/14 14:41:23 NO NO 4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk116e35c426 06/07/14 11:48:34 NO NO 4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk118d733646 21/07/14 14:06:03 NO NO 4,23 ,31 7 1 SQL_PLAN_s7554kd1hzk11900895ab 21/07/14 17:04:24 NO NO SQL_d8ee9cd8489c1506 d70w2c9n04bky 11,02 ,7 5 2 SQL_PLAN_djvnwv149s50p0de525df 17/06/14 17:50:45 NO NO SQL_50563b1a5e7c3515 cdxqhv810sguq 142,12 4,51 12 4 SQL_PLAN_62t9v39g7sdj6e14b0faa 17/06/14 09:37:12 NO NO SQL_a69a285b67c3ab33 7jr0hhnrg5qpd 5,12 ,54 4 0 SQL_PLAN_5sw7au49da15rb55d4723 18/06/14 14:09:54 NO NO 5,12 ,54 4 0 SQL_PLAN_5sw7au49da15r1224e506 06/06/14 13:21:12 NO NO 5,12 ,54 4 0 SQL_PLAN_5sw7au49da15r92eca281 12/06/14 11:50:16 NO NO © 2014 Pythian Confidential
  • 62. Choosing what to evolve on 11g using AWR 62 with sqlhas ( select FORCE_MATCHING_SIGNATURE, sql_id, count(1) plans, max(elap_xeje) maxe, min(elap_xeje) mine from (select h.FORCE_MATCHING_SIGNATURE, sql_id, plan_hash_valueplan_hv ,round(sum(h.elapsed_time_delta)/sum(h.executions_delta)/1000000,2) elap_xeje from DBA_HIST_SQLSTAT h where snap_id>=(select min(snap_id) from dba_hist_snapshotwhere begin_interval_time>=trunc(sysdate)-30) and dbid=(select dbidfrom v$database) and instance_numberin (1,2,3) and h.executions_delta> 0 and h.FORCE_MATCHING_SIGNATUREin ( select b.signaturefrom DBA_SQL_PLAN_BASELINES b where b.enabled='YES' and b.accepted='NO') group by FORCE_MATCHING_SIGNATURE, sql_id, plan_hash_value) group by FORCE_MATCHING_SIGNATURE, sql_id having max(elap_xeje)/(case min(elap_xeje) when 0 then 1 else min(elap_xeje) end) > 5) select sql_handle, signature, sqlh.sql_id, sqlh.maxe, sqlh.mine, sqlh.plans, (select count(1) from DBA_SQL_PLAN_BASELINES b2 where b.sql_handle=b2.sql_handle and b2.accepted='YES' and b2.enabled='YES') "#accept" ,PLAN_NAME, created, accepted, fixed from DBA_SQL_PLAN_BASELINES b, sqlh where b.enabled='YES' and b.accepted='NO' and b.created> trunc(sysdate)-30 and b.signature= sqlh.FORCE_MATCHING_SIGNATURE order by sql_handle, sql_id, maxe; © 2014 Pythian Confidential
  • 63. Example of bug found –11.2.0.2 SQL_ID c2408ff99yj8u, child number 0 ------------------------------------- SELECT DATA, COUNT(*) FROM BIG_TABLE WHERE (((((((((DATA LIKE :1 ) OR (DATA LIKE :2 )) OR (DATA LIKE :3 )) OR (DATA LIKE :4 )) OR (DATA LIKE :5 )) OR (DATA LIKE :6 )) OR (DATA LIKE :7 )) OR (DATA LIKE :8 )) AND (STATE IN (:9 , :10 , :11 , :12 , :13 , :14 , :15 , :16 , :17 , :18 , :19 , :20 , :21 , :22 , :23 , :24 , :25 , :26 , :27 , :28 , :29 , :30 , :31 , :32 ))) GROUP BY DATA Plan hash value: 1854823252 ---------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 7504 (100)| | | 1 | HASH GROUP BY | | 16 | 1536 | | | | 2 | CONCATENATION | | | | | | |* 3 | INDEX RANGE SCAN| BIG_TABLE_CIDN | 1668 | 156K| 938 (1)| 00:00:12 | .. |* 10 | INDEX RANGE SCAN| BIG_TABLE_CIDN | 1165 | 109K| 938 (1)| 00:00:12 | ---------------------------------------------------------------------------------------------- ... Note -SQL plan baseline SQL_PLAN_8vdc1f1da6d7sa0mtur14used for this statement 63 © 2014 Pythian Confidential
  • 64. Example of bug found –11.2.0.2 --Plan baselines for this statement: col created for a25 select PLAN_NAME, ENABLED, accepted, fixed, created, executions, optimizer_cost from DBA_SQL_PLAN_BASELINES where sql_handle='SQL_114a395a2db6c38c' and enabled='YES' order by created; PLAN_NAME ENA ACC FIX CREATED EXECUTIONS OPTIMIZER_COST ---------------------------------------------------------------------------------------- SQL_PLAN_8vdc1f1da6d7sa0mtur14YES YESNO 05/08/14 16:11:26,000000 1 7504 SQL_PLAN_0sa1muctuur8ve7e49070 YES NO NO05/08/14 17:29:45,000000 0 2039 2 rows selected. --Want to evaluate the new plan found, not accepted yet 64 © 2014 Pythian Confidential
  • 65. Example of bug found –11.2.0.2 --evolving the new plan: varr clob; set long 10000 exec :r := dbms_spm.evolve_sql_plan_baseline(sql_handle=> 'SQL_114a395a2db6c38c', plan_name=>'SQL_PLAN_0sa1muctuur8ve7e49070', commit => 'NO'); print; ------------------------------------------------------------------------------- Evolve SQL Plan Baseline Report ------------------------------------------------------------------------------- Inputs: ------- SQL_HANDLE = SQL_114a395a2db6c38c PLAN_NAME = SQL_PLAN_0sa1muctuur8ve7e49070 TIME_LIMIT = DBMS_SPM.AUTO_LIMIT VERIFY = YES COMMIT = NO Plan: SQL_PLAN_0sa1muctuur8ve7e49070 ------------------------------------ Plan was verified: Time used ,507 seconds. Error encountered during plan verification (ORA-1008). ORA-01008: no todaslasvariables hansidoenlazadas Bug 14007103 discarded Bug 19326647 opened 65 © 2014 Pythian Confidential
  • 66. Summary review •SPM enabled by default, but not capture •No extra license, available only on Enterprise edition •Baseline need to be acceptedAND enabled to be used •SQL needs to run more than once to be considered •Baselines are global -not per schema •Evolve advisor (autotask) in 12c, manual evolution in 11g. •Don’t trust evolution results, test it! •SQL Trace when in doubt (statement level!) •Needs a good understanding to troubleshoot 66 © 2014 Pythian Confidential
  • 67. Questions? 67 calero@pythian.com @ncalerouy http://www.linkedin.com/in/ncalero © 2014 Pythian Confidential
  • 68. References •SPM in Oracle 11g (Nov 2010): http://www.oracle.com/technetwork/database/bi- datawarehousing/twp-sql-plan-management-11gr2-133099.pdf •SPM in Oracle 12c (Jun 2013): http://www.oracle.com/technetwork/database/bi- datawarehousing/twp-sql-plan-mgmt-12c-1963237.pdf •Oracle 12c Tuning Guide -Managing SQL Plan Baselines: http://docs.oracle.com/database/121/TGSQL/tgsql_spm.htm#TGSQL94621 •Oracle 12c Tuning Guide -Query Optimizer: http://docs.oracle.com/database/121/TGSQL/tgsql_optcncpt.htm#TGSQL192 •Oracle 11c Tuning Guide -Query Optimizer: http://docs.oracle.com/cd/B28359_01/server.111/b28274/optimops.htm •Oracle Optimizer development team Blog: https://blogs.oracle.com/optimizer 68 © 2014 Pythian Confidential