Presentation is loading. Please wait.

Presentation is loading. Please wait.

Using Stored Outlines & Profiles Chris Lawson. TIP 1: EASY SQL HINTS USING STORED OUTLINES No reason to avoid outlines. Despite threats, are reportedly.

Similar presentations

Presentation on theme: "Using Stored Outlines & Profiles Chris Lawson. TIP 1: EASY SQL HINTS USING STORED OUTLINES No reason to avoid outlines. Despite threats, are reportedly."— Presentation transcript:

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 A stored outline preserves an execution plan: 1.You turn-on outline capture. 2. You run the sql. 3. Oracle captures sql and exec plan. 4. Oracle stores sql hints. 5. If sql is run again, Oracle use those sql hints. What is a Stored Outline?

4 Instead of preserving, Let’s change plans. But Wait That’s Not All!

5 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. For a Different Execution Plan

6 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’); Here’s the Switch

7 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’); Outline Example

8 If a good exec plan is in pool, lock-in that plan exec DBMS_OUTLN.CREATE_OUTLINE (hash_value =>'123', child_number=> 0) Super Easy Way

9 Get the precise sql. Recommend: Use sql in AWR/Sql report Some Traps!

10 Pitfall 1: AWR Spaces What if the extra blanks occur as part of the functionality of the sql? AWR report removes extra whitespace Yea, yea, so what?

11 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. Don’t Change My Code!

12 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. Pitfall 2: Hint Count 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 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. Hint Count

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 We know: hints override parallelism set at table. Hey--use outline to override table degree? NO--Outline removes any Parallel Hint Use Outline to Fix Parallelism?

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 Step 3 Recommendations Set Long 32000 [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_01313de6 18-JUL-11 08.38.44.AM MANUAL ENABLED

30 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 OPT_ESTIMATE(@"SEL$AF73C875", TABLE, "S"@"SEL$4", SCALE_ROWS=3024) OPT_ESTIMATE(@"SEL$26", TABLE, "X$KSQEQ"@"SEL$26",SCALE_ROWS=8208.205) OPT_ESTIMATE(@"SEL$34", TABLE, "X$KTCXB"@"SEL$34",SCALE_ROWS=162.5641)"X$KTCXB"@"SEL$34",SCALE_ROWS=162.5641 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?

Download ppt "Using Stored Outlines & Profiles Chris Lawson. TIP 1: EASY SQL HINTS USING STORED OUTLINES No reason to avoid outlines. Despite threats, are reportedly."

Similar presentations

Ads by Google