using adaptive cursor sharing (acs) to produce multiple optimal plans.pptx.pdf

Upload: mabu-dba

Post on 04-Jun-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    1/51

    Using Adaptive Cursor Sharing (ACS) toproduce multiple Optimal Plans

    Carlos Sierra

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    2/51

    Carlos Sierra

    ! Enkitec Consultant! Oracle Performance! SQL Tuning! PL/SQL

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    3/51

    Adaptive Cursor Sharing (ACS)

    ! Motivation! Mechanics! Test Case! Demo! Remarks

    3

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    4/51

    ACS Motivation

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    5/51

    SQL Processing

    ! Hard parse side effects CPU consumption Latch contention

    ! Excessive hard parsing Affects concurrency Restricts scalability

    ! Mitigating hard parsing Cursor sharing

    Hard parsing is expensive!

    5

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    6/51

    Implementing Cursor SharingReplacing literals with bind variables

    6

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    7/51

    Before Bind Peeking

    ! Predicate WHERE channel_id = :b1

    ! Unknowns Is :b1 between low and high values of channel_id? Is :b1 a popular value of channel_id? Are there any rows with value :b1 for channel_id?

    ! Penalty Possible suboptimal plans

    Before 9i CBO was blind to values passed

    7

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    8/51

    With Bind Peeking

    ! Predicate WHERE channel_id = :b1

    ! Plan is determined by peeked values EXEC :b1 := 9;

    ! Optimal plan for 1stexecution CBO can use low/high and histograms on channel_id

    ! Penalty Possible suboptimal plans for subsequent executions on skewed data

    9i offers a partial solution

    8

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    9/51

    Real-life Problem with Bind PeekingPeople Soft Payroll Application

    9

    ! WHERE employee BETWEEN :b1 AND :b2! Payroll for one employee

    :b1 = 123456 :b2 = 123456

    ! Payroll for one company :b1 = 000001 :b2 = 999999

    ! Doing payroll for an employee first then entire company

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    10/51

    With Adaptive Cursor Sharing

    ! Some queries are ACS candidates! Sophisticated non-persistent mechanism! Selectivity of predicates determine plan! Multiple optimal plans for a query!

    If ACS is successfully applied! Penalty

    Marginal increase in CPU and memory overhead

    11g improves cursor sharing

    10

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    11/51

    ACS Mechanics

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    12/51

    ACS high-level OverviewHigh level overview

    ! If SQL with binds meets some requirements Flag cursor as bind sensitive Start monitoring data volume manipulated by cursor

    ! If bind sensitive and data volume manipulated by cursor variessignificantly

    Flag cursor as bind aware Start generating multiple optimal plans for this query on next hard parse

    ! If bind aware then use selectivity of predicates to decide on plan12

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    13/51

    Bind Sensitive

    ! SQL has explicit binds Or literals and cursor_sharing is force

    ! Predicate: column + operand + bind_variable Equality operand = and histogram on column

    ! Ex: channel_id = :b1 Non-equality operand (range) regardless of histogram on column

    ! >, >=,

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    14/51

    Bind Aware

    ! Significant changes in data volume manipulated by cursor A few rows versus a few thousands of rows A few thousands of rows versus a few millions of rows

    ! Specifying /*+ BIND_AWARE */ CBO Hint Bypasses the monitoring phase on data volume

    How to become bind aware?

    14

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    15/51

    Plan Selection

    ! Evaluate selectivity of predicates at soft parse! Compare to a non-persistent selectivity profile! If within ranges of a known profile then select associated plan! Else hard parse

    Compute and execute newly generated plan Create selectivity profile for new plan or update profile of existing plan

    !If ranges on selectivity profiles overlap then merge profiles

    Based on selectivity profile of predicates

    15

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    16/51

    V$ dynamic views for ACS

    ! V$SQL Shareable, bind sensitive and bind aware flags

    ! V$SQL_CS_STATISTICS Data volume manipulated (rows processed)

    ! V$SQL_CS_HISTOGRAM Record keeping of data volume per execution (small, medium, large)

    ! V$SQL_CS_SELECTIVITY Predicates selectivity profiles

    ACS non-persistent performance views

    16

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    17/51

    ACS Test Case

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    18/51

    Our Query with LiteralsGuesstimate execution plan then verify it with demo 0

    18

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    19/51

    Possible Access Paths?

    19

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    20/51

    Optimal Execution Plan

    20

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    21/51

    Our Query with Bind VariablesHow many optimal execution plans can you foresee?

    21

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    22/51

    Multiple Optimal Plans for one QueryGuesstimate optimal plan (access paths) for each query

    Query :b1 :b2 AP1 AP2

    q1 9 33 N1 N2q2 5 32

    q3 2 999

    q4 9 999

    q5 2 33

    22

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    23/51

    Multiple Optimal Plans for one QueryGuesstimate optimal plan (access paths) for each query

    Query :b1 :b2 AP1 AP2

    q1 9 33 N1 N2q2 5 32 N1 N2

    q3 2 999 FTS FTS

    q4 9 999 N1 FTS

    q5 2 33 FTS N2

    23

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    24/51

    Multiple Optimal Plans for one QueryExecute demos 1-5 and verify access paths

    Query :b1 :b2 AP1 AP2

    q1 9 33 N1 N2q2 5 32 N1 N2

    q3 2 999 FTS FTS

    q4 9 999 N1 FTS

    q5 2 33 FTS N2

    24

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    25/51

    Bind Sensitive: Rows Processed

    ! Data volume manipulated Fuzzy representation S: few rows M: thousands or rows L: millions of rows

    ! v$sql_cs_histogram Bucket(0): S Bucket(1): M Bucket(2): L

    Monitor v$sql_cs_statistics.rows_processed

    Query :b1 :b2 Optimal RowsProcessed

    q1 9 33 N1/N2 37,382

    q2 5 32 N1/N2 2

    q3 2 999 FTS/FTS 8,021,324

    q4 9 999 N1/FTS 6,233,815

    q5 2 33 FTS/N2 1,825,131

    25

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    26/51

    ACS Demo

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    27/51

    Demo 6: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q1 9 33 N1/N2 37,382

    q2 5 32 N1/N2 2

    q3 2 999 FTS/FTS 8,021,324

    q4 9 999 N1/FTS 6,233,815

    q5 2 33 FTS/N2 1,825,131

    Obtain rows processed from demo 1-5 then guesstimate aware flag

    27

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    28/51

    Demo 6: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q1 9 33 N1/N2 37,382 1

    q2 5 32 N1/N2 2 0

    q3 2 999 FTS/FTS 8,021,324 2

    q4 9 999 N1/FTS 6,233,815 2

    q5 2 33 FTS/N2 1,825,131 2

    Obtain rows processed from demo 1-5 then guesstimate aware flag

    28

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    29/51

    Demo 6: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q1 9 33 N1/N2 37,382 1 N

    q2 5 32 N1/N2 2 0 N

    q3 2 999 FTS/FTS 8,021,324 2 Y

    q4 9 999 N1/FTS 6,233,815 2 Y

    q5 2 33 FTS/N2 1,825,131 2 Y

    Obtain rows processed from demo 1-5 then guesstimate aware flag

    29

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    30/51

    Demo 6: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q1 9 33 N1/N2 37,382 1 N 0 N1/N2

    q2 5 32 N1/N2 2 0 N 0 N1/N2

    q3 2 999 FTS/FTS 8,021,324 2 Y 1 FTS/FTS

    q4 9 999 N1/FTS 6,233,815 2 Y 2 N1/FTS

    q5 2 33 FTS/N2 1,825,131 2 Y 3 FTS/N2

    Obtain rows processed from demo 1-5 then guesstimate aware flag

    30

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    31/51

    Demo 6: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q1 9 33 N1/N2 37,382 1 N 0 N1/N2

    q2 5 32 N1/N2 2 0 N 0 N1/N2

    q3 2 999 FTS/FTS 8,021,324 2 Y 1 FTS/FTS

    q4 9 999 N1/FTS 6,233,815 2 Y 2 N1/FTS

    q5 2 33 FTS/N2 1,825,131 2 Y 3 FTS/N2

    Obtain rows processed from demo 1-5 then guesstimate aware flag

    31

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    32/51

    Demo 7: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131

    q4 9 999 N1/FTS 6,233,815

    q3 2 999 FTS/FTS 8,021,324

    q2 5 32 N1/N2 2

    q1 9 33 N1/N2 37,382

    Compute bucket and guesstimate aware flag and actual plan

    32

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    33/51

    Demo 7: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2

    q4 9 999 N1/FTS 6,233,815 2

    q3 2 999 FTS/FTS 8,021,324 2

    q2 5 32 N1/N2 2 0

    q1 9 33 N1/N2 37,382 1

    Compute bucket and guesstimate aware flag and actual plan

    33

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    34/51

    Demo 7: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2 N

    q4 9 999 N1/FTS 6,233,815 2 N

    q3 2 999 FTS/FTS 8,021,324 2 N

    q2 5 32 N1/N2 2 0 N

    q1 9 33 N1/N2 37,382 1 Y

    Compute bucket and guesstimate aware flag and actual plan

    34

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    35/51

    Demo 7: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2 N 0 FTS/N2

    q4 9 999 N1/FTS 6,233,815 2 N 0 FTS/N2

    q3 2 999 FTS/FTS 8,021,324 2 N 0 FTS/N2

    q2 5 32 N1/N2 2 0 N 0 FTS/N2

    q1 9 33 N1/N2 37,382 1 Y 1 N1/N2

    Compute bucket and guesstimate aware flag and actual plan

    35

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    36/51

    Demo 7: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2 N 0 FTS/N2

    q4 9 999 N1/FTS 6,233,815 2 N 0 FTS/N2

    q3 2 999 FTS/FTS 8,021,324 2 N 0 FTS/N2

    q2 5 32 N1/N2 2 0 N 0 FTS/N2

    q1 9 33 N1/N2 37,382 1 Y 1 N1/N2

    Compute bucket and guesstimate aware flag and actual plan

    36

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    37/51

    Demo 8: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2

    q4 9 999 N1/FTS 6,233,815 2

    q3 2 999 FTS/FTS 8,021,324 2

    q1 9 33 N1/N2 37,382 1

    q2 5 32 N1/N2 2 0

    Guesstimate aware flag and actual plan

    37

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    38/51

    Demo 8: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2 N

    q4 9 999 N1/FTS 6,233,815 2 N

    q3 2 999 FTS/FTS 8,021,324 2 N

    q1 9 33 N1/N2 37,382 1 N

    q2 5 32 N1/N2 2 0 N

    Guesstimate aware flag and actual plan

    38

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    39/51

    Demo 8: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2 N 0 FTS/N2

    q4 9 999 N1/FTS 6,233,815 2 N 0 FTS/N2

    q3 2 999 FTS/FTS 8,021,324 2 N 0 FTS/N2

    q1 9 33 N1/N2 37,382 1 N 0 FTS/N2

    q2 5 32 N1/N2 2 0 N 0 FTS/N2

    Guesstimate aware flag and actual plan

    39

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    40/51

    Demo 8: When Cursor becomes Bind Aware?

    Query :b1 :b2 Optimal

    RowsProcessed Bucket Aware Child Actual

    q5 2 33 FTS/N2 1,825,131 2 N 0 FTS/N2

    q4 9 999 N1/FTS 6,233,815 2 N 0 FTS/N2

    q3 2 999 FTS/FTS 8,021,324 2 N 0 FTS/N2

    q1 9 33 N1/N2 37,382 1 N 0 FTS/N2

    q2 5 32 N1/N2 2 0 N 0 FTS/N2

    Guesstimate aware flag and actual plan

    40

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    41/51

    Real-life Problem with ACSPeople Soft Payroll Application

    41

    ! WHERE employee BETWEEN :b1 AND :b2! Payroll for one employee

    :b1 = 123456 :b2 = 123456

    ! Payroll for one company :b1 = 000001 :b2 = 999999

    ! Doing payroll for a few employees first then entire company

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    42/51

    Closing Remarks

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    43/51

    Understanding Selectivity ProfileFrom demo 6

    Query :b1 :b2 Child

    q3 2 999 1

    q4 9 999 2

    q5 2 33 3

    43

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    44/51

    Understanding Selectivity ProfileFrom demo 6

    Query :b1 :b2 Child

    q3 2 999 1

    q4 9 999 2

    q5 2 33 3

    44

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    45/51

    Understanding Selectivity ProfileFrom demo 6

    Query :b1 :b2 Child

    q3 2 999 1

    q4 9 999 2

    q5 2 33 3

    45

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    46/51

    Remarks on Bind Sensitivity

    ! Monitor V$SQL_CS_STATISTICS.rows_processed If small number of rows then

    ! V$SQL_CS_HISTOGRAM.bucket_id(0)++ If medium number of rows then

    ! V$SQL_CS_HISTOGRAM.bucket_id(1)++ If large number of rows then

    ! V$SQL_CS_HISTOGRAM.bucket_id(2)++

    Based on experimental observation

    46

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    47/51

    Remarks on Bind Aware

    ! Some cases where cursor may become bind aware bucket_id(0) = bucket_id(1) > 0 bucket_id(1) = bucket_id(2) > 0 bucket_id(0) > 0 and bucket_id(2) > 0

    ! Or use /*+ BIND_AWARE */ CBO Hint What if we cannot modify code?

    Based on experimental observation

    47

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    48/51

    Conclusions

    !ACS only applies to a subset of queries with binds!ACS requires a ramp-up process (few executions)! In some cases cursor may fail to become bind aware! To force a cursor become bind aware use CBO Hint!ACS is not persistent!ACS works well with SQL Plan Management

    ACS can produce multiple optimal plans for one query

    48

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    49/51

    Give Away

    ! Creates a SQL Patch for one SQL_ID! Turns on EVENT 10053 for SQL_ID! Hints on SQL Patch

    GATHER_PLAN_STATISTICS MONITOR BIND_AWARE

    ! Consider using and customizing this free script

    Script sqlt/utl/coe_gen_sql_patch.sql (MOS 215187.1)

    49

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    50/51

    References and Contact Info

    ! https://blogs.oracle.com/optimizer/ Insight into the workings of the Optimizer

    Oracle Optimizer Blog

    ! [email protected]! http://carlos-sierra.net! @csierra_usa

    50

  • 8/14/2019 Using Adaptive Cursor Sharing (ACS) to produce multiple Optimal Plans.pptx.pdf

    51/51