Download presentation
Presentation is loading. Please wait.
1
Using Stored Outlines & Profiles
Chris Lawson
2
TIP 1: EASY SQL HINTS USING STORED OUTLINES
No reason to avoid outlines. Despite threats, are reportedly still in Oracle 12. So, let’s check ‘em out.
3
What is a Stored Outline?
A stored outline preserves an execution plan: You turn-on outline capture. You run the sql. Oracle captures sql and exec plan. Oracle stores sql hints. If sql is run again, Oracle use those sql hints.
4
Instead of preserving, Let’s change plans.
But Wait That’s Not All! Instead of preserving, Let’s change plans.
5
For a Different Execution Plan
Create two outlines: One the “regular” sql. Another using a sql hint. We now have 2 stored outlines: Sql 1: No hint >> Outline 1 (bad plan) Sql 2: hint >> Outline 2 (good plan) Now, reverse hints! Oracle will apply hints from Sql 2 when it sees Sql 1.
6
Here’s the Switch Create outline sql1 on {sql with hint}
Create outline sql2 on {regular sql} Update outln.ol$hints set ol_name = decode(ol_name, ‘sql1’, ‘sql2’, ‘sql2’, ‘sql1’) where ol_name in (‘sql1’, ‘sql2’);
7
Outline Example Create outline sqlz for category tune on Merge into tab1_gt gt using ( Select /*+index(a) */ … Create outline sqlz_fix for category tune on Merge into tab1_gt gt using ( Select … Update outln.Ol$hints set ol_name = decode(ol_name, ‘sqlz_fix’, ‘sqlz’, ‘sqlz’, ‘sqlz_fix’) where ol_name in (‘sqlz’, ‘sqlz_fix’);
8
Super Easy Way If a good exec plan is in pool, lock-in that plan
exec DBMS_OUTLN.CREATE_OUTLINE (hash_value =>'123', child_number=> 0)
9
Some Traps! Get the precise sql. Recommend: Use sql in AWR/Sql report
10
Pitfall 1: AWR Spaces AWR report removes extra whitespace
Yea, yea, so what? What if the extra blanks occur as part of the functionality of the sql?
11
Don’t Change My Code! My code had a clause like this:
orig: where col1 like '% abc %' altered: where col1 like '%abc%‘ Missing the blanks means the outline won’t work! I had to alter outline script to add back extra blanks.
12
Pitfall 2: Hint Count Hints stored in outline are not simple hints.
Outlines typically have many more hints. More complicated syntax—”extended” format. This ensures that the plan is consistent. Who cares about number of hints?
13
When Outline Created, Oracle Saves Number Of Hints
If outline imported, secret process counts hints If #hints <> Hintcount, outline dropped! My sad tale
14
Hint Count When you do the "hint switch“ you will likely end up with a different number of hints. You might have started with 10 hints, but after switch, you might have 12 hints. So good idea to verify Hintcount. Let’s see an easy way to check the actual number of hints per outline.
15
Update Hintcount Select ol_name, count(*) from Outln.ol$hints
Group by ol_name; Select ol_name, Hintcount from Outln.ol$
16
Enable Outlines after instance restart!
Alter System set Use_Stored_Outlines=TRUE
17
Use Outline to Fix Parallelism?
We know: hints override parallelism set at table. Hey--use outline to override table degree? NO--Outline removes any Parallel Hint
18
Questions on Outlines?
19
Tip 2: Easy Sql Profiles Not reliable, but easy.
We have 127 stored outlines, and 3 sql profiles. For example, an OEM query had odd hint that would not work with stored outline.
20
Tell me More! A sql profile is not actually an execution plan.
It’s a set of sql hints ready for next time sql is run. Like stored outlines, but hints are different. How different?
21
How do Sql Profiles Work?
They use large amounts of cpu time. They can postulate lots of different plans. They use same optimizer that produced poor execution plan in the first place!
22
Hints, Hints Everywhere
Outline uses sql hints to preserve execution plan Like “full” or “index.” Profile hints give optimizer extra information. Outline tends to lock-in a plan, profile makes optimizer smarter.
23
What do I do? Step 1: Create the Tuning Task
Step 2: Run The Tuning Task Step 3: Get Recommendations Step 4: Apply The Profile Step 5: Confirm Profile is Enabled
24
Step 1 Create the Tuning Task Call Dbms_Sqltune.Create_Tuning_Task
Provide a specific sql_id Give time-limit
25
Step 2: Run Tuning Task Begin Dbms_Sqltune.Execute_Tuning_Task( Task_Name => 'chris1' ); End; Now, get Recommendations
26
This long report will include a summary of recommendations
Step 3 Recommendations Set Long [to get full listing] Set Longchunksize 1000 Set Linesize 100 Select Dbms_Sqltune.Report_Tuning_Task( 'chris1') From Dual; This long report will include a summary of recommendations
27
Step 3 Look for this: SQL Profile Finding (see explain plans section below) A potentially better execution plan was found for this statement. Recommendation (estimated benefit: 67.35%) Consider accepting the recommended SQL profile.
28
Step 4 Apply Profile Execute dbms_sqltune.accept_sql_profile (task_name => 'chris1', replace => TRUE);
29
Step 5: Confirm Enabled Select Name, Created, Type, Status
From Dba_Sql_Profiles Where Last_Modified > Sysdate – 1; NAME CREATED TYPE STATUS SYS_SQLPROF_01313de JUL AM MANUAL ENABLED
30
What do the hints look like?
Behind the Scenes What is Oracle doing with a sql profile? What kinds of sql hints are being applied? You can see the hints by joining Sys.Sqlobj$Data Od, Sys.Sqlobj$ What do the hints look like?
31
Sql Profiles Actual Hints
TABLE, SCALE_ROWS=3024) TABLE, TABLE, Opt_Estimate hint supplies cardinality information. Scale_Rows parameter scales the estimate of the rows
32
Sql Profiles: A Big “Plus”
Profile can handle changing literals (unlike stored outline) Use Force_Match, like this: dbms_sqltune.accept_sql_profile(task_name => 'chris1', - replace => TRUE, force_match => TRUE);
33
Sql Profiles “Minus” Syntax awkward if you need to supply sql.
For instance, if database has recently started. Especially awkward if sql has quotation marks. Stored outline is trivial to create for specific sql.
34
A Funny Quirk In Dba_Hist_Sqlstat Sql_Profile is listed
Outline_Category is not.
35
Questions?
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.