Synopsis.
Oracle Database 11gR1 introduces SQL Plan Management, a new set of tools that
allows an Oracle DBA to capture and preserve the most efficient execution plans
for any SQL statement, thus limiting the impact of refreshed optimizer
statistics, changes to existing applications, and even upgraded database
versions. This article the first in this series provides a primer to SQL
Plan Management principles and offers a simple demonstration of its performance
tuning capabilities.
The previous
article series explored the capabilities of Oracle Database 11gs new SQL Performance Analyzer (SPA) tool set to
capture and analyze performance statistics for SQL statements and thus more
accurately predict the impact of environmental changes upon those statements
performance before the
environment has been changed. However, while this is a valuable addition to any
Oracle DBAs tool belt, any experienced DBA will tell you that this is only
half the battle.
A
much more insidious problem crops up when a valid (and excellent!) execution
plan for a SQL statement gets invalidated and the statement is reparsed, but
the resulting new execution plan is actually much worse than the original plan.
This can happen for several reasons:
-
Its not uncommon for a cursor to get aged out of the Library Cache eventually.
Because this necessitates a hard parse of its SQL statement, there is always a
chance that the cursor may end up using a less efficient execution plan.
-
A cursor may also be invalidated when optimizer
statistics are recalculated on that cursors dependent objects, or when even
one of that cursors dependent object(s) is modified.
-
There are other, less common causes of changes to a
SQL statements plan stability: a change in optimizer versions, initialization
parameter modifications, and even (after Oracle 10g) the creation of a new SQL
Profile for the statement.
SQL Plan Management: A Brief History Lesson
One
of the biggest challenges any DBA faces is the ability to identify not only
which SQL statements are performing poorly, but also capturing the best
execution plans for SQL statements and making those plans available to all statements
that could benefit from them. The evolution of these solutions makes for an
interesting history lesson.
Phase 1: Stored Outlines. Oracle 8i
provided a mechanism to capture a SQL statements execution plan and save it
into a stored outline. A stored outline is essentially a SQL statement that a
DBA or developer has optimized sometimes using tuning tools, and many times
using just simple trial and error and then stored within the OUTLN schema.
When a SQL statement is executed and that statements execution plan matches
that of the stored outline, Oracle uses the SQL statement within the stored
outline instead. Stored outlines can also be staged for eventual execution
within categories, or limited to only those sessions that have a matching
category.
This
provides what Oracle 8i terms plan stability,
and while it can be useful, it does have some drawbacks, the most serious one
being that stored outline plans over time become outdated because of changes to
data distributions or optimizer statistics. Then the stored outline has the
tendency to force a statement to actually use a plan thats considerably less
efficient than if a new plan was derived by simply reparsing the statement and
obtaining a better execution plan.
Phase 2: SQL Profiles. Oracle Database 10g
addressed the shortcomings of stored outlines with a new method called SQL Profiles. The DBA uses either the SQL
Tuning Advisor or SQL Access Advisor to identify SQL statements that can
benefit from better performance. These statements can be stored within a SQL
Tuning Set, an AWR snapshot, or even within the current library cache. Once
identified as tuning candidates, these Advisors analyze the captured statements
for better performance opportunities, and then generate special extensions to the
statements execution plans called SQL Profiles that rewrite the SQL statements
to obtain the best possible performance during execution.
Like
a stored outline, a SQL profile provides the ability to use a better execution
plan if one is available. SQL profiles can also be staged for execution just
like stored outlines, or limit execution of a SQL Profile to only particular
sessions. But the most significant improvement over stored outlines is twofold:
(a) the ability for limited self-tuning to insure a SQL Profile was providing
the best possible execution plan; and (b) the ability to detect when a SQL
Profile was no longer efficient (and thus have ADDM suggest that a new SQL
Profile needs to be generated).
Phase 3: SQL Plan Management. Oracle 11g
implements a new feature set called SQL Plan
Management (SPM) that overcomes unexpected SQL execution plan
regression via a simple yet elegant methodology. Once a user session has been
enabled for automatic SQL Plan Baseline capture, the cost-based optimizer (CBO) logs any SQL statements executed
within that session into the SQL Management
Base (SMB). This stores the statements SQL text, its outline,
its bind variables, and its compilation environment as a SQL Plan Baseline.
Since
this is the first time the statement has been executed, Oracle 11g treats the
stored execution plan as optimal.
Its during the next execution of
the same SQL statement that the
elegance of SQL Plan Management becomes evident. During the statements second
execution, the CBO compares the statements execution plan against the one thats
currently stored in the SMB. If the CBO detects a new plan, the new plan is first added to plan history, and
then the new plan is evaluated to see if its more effective than the current execution plan in the SMB.
If
the new execution plan would cause the statements performance to improve, then
SPM marks the new plan as the
best choice for the execution of the statement. As long as the DBA hasnt
overridden the default value of TRUE for the OPTIMIZER_USE_SQL_PLAN_BASELINES
initialization parameter, the CBO uses the new plan during
the statements current execution. Otherwise, if the statements performance
would actually regress because
the new plan was used, then the CBO chooses the one plan from all accepted
plans in the SMB that will result in the lowest execution cost. Either way,
however, SPM will store the new execution plan within the SMB, because its
possible that the new plan may actually become a better choice in the near
future.
Capturing SQL Plan Baselines
The
good news is that Oracle 11g makes it extremely easy to capture SQL Plan
Baselines into the SMB. First, the OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES initialization parameter controls whether automatic capture of SQL Plan Baselines is
activated. This parameters default setting, FALSE, means that SQL Plan Baselines arent automatically captured. However,
as soon as the DBA sets it to TRUE at either the session or system level, SPM begins to log the execution
of SQL statements; when a SQL statement is executed more than once, that
statement will be considered as a candidate for SQL Plan Baseline capture.
Second, a new Oracle 11g package, DBMS_SPM,
provides the ability to capture and introduce high-volume SQL statements in advance by seeding plans manually from several sources:
-
One or more SQL statements currently found in the databases
Library Cache can be used to
create SQL Plan Baselines. Procedure LOAD_PLANS_FROM_CURSOR_CACHE can
be used to capture any subset of statements in the Library Cache as potential
SMB candidates.
-
SQL statements stored in either a SQL Tuning Set or an AWR Snapshot can be captured and translated
into SQL Plan Baselines via the LOAD_PLANS_FROM_SQLSET procedure.
-
Finally, SQL Plan Baselines can be populated from SQL
statements in an imported staging table.
This means its possible to capture statements from a totally different
database say, a QA environment and pre-seed them into the current
production environment. (Ill spend a lot more time on how this can be an
excellent technique to prevent plan regression during database or application
upgrades in future articles in this series.)
Viewing SQL Plan Baseline Information
The
SQL Plan Baseline metadata captured in the SMB contains attributes that SPM and
the CBO uses for plan control.
When a brand-new plan first arrives in the SMB, its marked as ENABLED,
but it wont be marked as an ACCEPTED plan until either (a) the CBO has
evaluated the plan and judged it the best plan, or (b) the plan has been
evolved into ACCEPTED
mode. Before the CBO considers using a plan for execution, it must be marked as
both ENABLED
and ACCEPTED.
The
simplest way to view this metadata is to query the DBA_SQL_PLAN_BASELINES
data dictionary view. Heres a summary of the most valuable plan
control information found there:
|
Table 1.1. SQL Plan Baseline Plan Control Metadata
|
|
Attribute
|
Description
|
|
SQL_HANDLE
|
A
unique SQL identifier in string form;
it can be used as a search key
|
|
PLAN_NAME
|
A
unique SQL plan identifier in string form;
it can be used as a search key
|
|
SQL_TEXT
|
The
SQL statements unnormalized, actual text
|
|
ORIGIN
|
Tells
if the SQL Plan was either:
-
AUTO-CAPTURE:
Automatically captured
-
MANUAL-LOAD:
Manually evolved
-
MANUAL-SQLTUNE:
Automatically evolved by SQL Tuning Advisor
-
AUTO-SQLTUNE:
Automatically evolved by Automatic SQL Tuning
|
|
ENABLED
|
Indicates
that the SQL Plan is enabled (YES) for CBO utilization or not (NO). Disabled
plans are ignored by the CBO
|
|
ACCEPTED
|
Indicates
that the SQL Plan is validated as a good
plan, either because Oracle 11g has:
-
Automatically
accepted it, or
-
The
DBA has forced its manual acceptance by changing its status to ACCEPTED via
procedure DBMS_SPM.ALTER_SQL_PLAN_BASELINE()
|
|
FIXED
|
SQL
Plans whose FIXED attribute is set to YES will be considered by the CBO. If
multiple plans are marked as FIXED, the CBO will only select the best execution
plan from those so marked
|
|
OPTIMIZER_COST
|
The
total cost estimated by the CBO to execute the SQL statement using this
execution plan
|
Another way to view the potential
impact of existing SQL Plan Baselines on a SQL statements execution is via the
new DISPLAY_SQL_PLAN_BASELINE procedure of package DBMS_XPLAN.
For example, I can use this procedure to view all SQL Plan Baselines that match
a SQL statements handle in the SMB; if I supply the SQL statements plan name
as well, then its execution plan will also be shown.
Automatic SQL Plan Capture: A Simple Example
To
demonstrate exactly how SQL Plan Management selects the most effective
execution plan for a SQL statement, Ill start with an extremely simple
example: a SQL statement (see Listing
1.1) that retrieves a relatively small subset of data from
several tables in the Sales History (SH) schema. Note that Ive tagged
this statement with an appropriate comment (SPM_1.1) so that its easier to
track its state as it progresses towards an accepted plan baseline.
Now Im
ready for experimenting with automatic capture of SQL Plan Baselines. As shown
in Listing
1.2, Ill set the OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES
initialization parameter to TRUE for just this session to activate automatic
capture of SQL Plan Baselines, and Ill set OPTIMIZER_MODE to ALL_ROWS
so that the CBO optimizes the SQL statements corresponding execution plan to
return the entire result set as efficiently as possible. To insure that this
session will utilize any SQL Plan Baselines that are captured, Ive also set
initialization parameter OPTIMIZER_USE_SQL_PLAN_BASELINES to TRUE
(its default value). This parameter controls whether the CBO should check if
the next repeatable execution of the SQL statement should be evaluated for a possible
better execution plan.
Then Ill
execute statement SPM_1.1 twice.
Its first execution insures that
the statements execution is logged into the SMB, but its the statements second execution that causes its execution
plan to be automatically accepted as a SQL Plan Baseline for the statement. To
show the current state of the SMB in this point of my experiments, Ill execute
the query shown in Listing
1.3 against the DBA_SQL_PLAN_BASELINES view. As the
resulting output shows, the current statement has indeed been captured into the
SMB via automatic capture means. (Note that Ive abbreviated the SQL
statements hash value and its plan baseline to their last eight characters for
easier handling.
Finally,
Ill change the OPTIMIZER_MODE to FIRST_ROWS so that the CBO
optimizes the SQL statements corresponding execution plan to return the first
few rows of the querys result set as soon as possible the obvious antithesis
of the ALL_ROWS
setting, which strives for maximum throughput. Listing
1.4 shows the commands I issued to achieve this, as well as the
results of querying the DBA_SQL_PLAN_BASELINES view once again. This
query output clearly shows that both execution plans are stored within the SMB,
but plan 07e0351f
is indeed more efficient its optimizer cost is only 757, as compared to plan ddc1fcd0s
optimizer cost of 2388. Accordingly, SPM marks only the first plan as both ENABLED and ACCEPTED.
Finally,
Listing
1.5 shows the details of both execution plans. Ive utilized DBMS_XPLANs
new DISPLAY_SQL_BASELINE
procedure to display their exact execution methods; note that
the SPM has captured the corresponding SQL Plan Baseline and all of its
optimizer statistics.
Next Steps
Ive
introduced SQL Plan Management theory and some rudimentary examples of how to
use it effectively, but theres still a plethora of performance tuning
scenarios to cover. In the next article in this series, Ill delve into how to:
-
Capture SQL Plan Baselines via manual methods
-
Use SQL Plan Baselines to prepare for application
upgrades
-
Evolve a SQL Plan Baseline manually
References and Additional Reading
While
Im hopeful that Ive given you a thorough grounding in the technical aspects
of the features Ive discussed in this article, Im also sure that there may be
better documentation available since its been published. I therefore strongly
suggest that you take a close look at the corresponding Oracle documentation on
these features to obtain crystal-clear understanding before attempting to
implement them in a production environment. Please note that Ive drawn upon
the following Oracle Database 11gR1 documentation for the deeper technical
details of this article:
B28274-01 Oracle Database 11gR1 Performance Tuning Guide
B28279-02 Oracle Database 11gR1 New Features Guide
B28419-02 Oracle Database 11gR1 PL/SQL Packages and Types
Reference
The
following notes in Oracle MetaLink also provide valuable background information
on stored outlines in Oracle 8i and beyond:
67536.1: Using Stored
Outlines
102311.1: How to Move Stored
Outlines for One Application from One Database to Another
132547.1: Stored
Outlines Quick Reference
»
See All Articles by Columnist Jim Czuprynski