Dynamic Sampling: some questions about the guts 2007-12-01 - By Rajeev Prabhakar
Back Charles
1) Do you have histograms collected for relevant column(s) ? 2) What is the value of cursor_sharing parameter ? 3) Do you use dbms_stats ? If yes, what parameters/options do you use ?
-Rajeev
On Nov 30, 2007 3:45 PM, Charles Schultz <sacrophyte@(protected)> wrote:
> In one of our reporting environments (OSEE 10.2.0.2) we have > optimizer_dynamic_sampling cranked up to 5. We have a case where dynamic > sampling is pushing the CBO to choose a poor plan. Our situation highlights > Level 4, specifically "tables that have single-table predicates that > reference 2 or more columns". (from the documentation<http://download.oracle .com/docs/cd/B19306_01/server.102/b14211/stats.htm#sthref1491> > ) > > Looking at a 10046 trace, I see a OPT_DYN_SAMP query that counts a sample > of rows that match variations on the predicate. I have found that a 10046 > can always be good grounds for finding more questions than it answers. > *grin* > > To avoid the bandwidth, I will show just the relevant parts of the > sampling query: > SELECT /* OPT_DYN_SAMP */ > ... > FROM > (SELECT /* ... */ > 1 AS C1, > CASE > WHEN "RCRAPP1"."RCRAPP1_AIDY_CODE"=:bind1 > AND "RCRAPP1"."RCRAPP1_INFC_CODE"=:bind2 > AND "RCRAPP1"."RCRAPP1_CURR_REC_IND"=:bind3 > AND "RCRAPP1"."RCRAPP1_VPDI_CODE"=:bind4 > THEN 1 > ELSE 0 > END AS C2, > CASE > WHEN "RCRAPP1"."RCRAPP1_AIDY_CODE"=:bind1 > AND "RCRAPP1"."RCRAPP1_VPDI_CODE"=:bind4 > THEN 1 > ELSE 0 > END AS C3, > CASE > WHEN "RCRAPP1"."RCRAPP1_AIDY_CODE"=:bind1 > AND "RCRAPP1"."RCRAPP1_VPDI_CODE"=:bind4 > THEN 1 > ELSE 0 > END AS C4 > FROM ... > SAMPLE BLOCK (.037704 , 1) SEED (1) "RCRAPP1" > ) SAMPLESUB > / > > First question: Why the predicate variations? I am assuming that sometimes > C4 is different than C3, so I am going to ignore C4 for now. > 2) How does the Optimizer use these sample counts to influence the costs > and subsequent access/join methods? > > I believe what is happening in our case is that sampling is "just unlucky" > and it happens to come up with a inaccurate picture of how many rows match > (an order of magnitude too many). I can prove this by using this query > directly with different sample sizes. > > I am hoping that by understanding dynamic sampling a little better, I can > understand how to resolve this issue. I realize that one can add the > dynamic_sampling query hint, and perhaps that is the "best" solution for > this. Aside from adjusting dynamic sampling (whether it be at the system > level or via a hint), is there any other way to address this situation? > > TIA, > > -- > Charles Schultz
<div>Charles</div> <div> </div> <div>1) Do you have histograms collected for relevant column(s) ?</div> <div>2) What is the value of cursor_sharing parameter ?</div> <div>3) Do you use dbms_stats ? If yes, what parameters/options </div> <div> do you use ?</div> <div> </div> <div>-Rajeev </div> <div><br> </div> <div class="gmail_quote">On Nov 30, 2007 3:45 PM, Charles Schultz <<a href= "mailto:sacrophyte@(protected)">sacrophyte@(protected)</a>> wrote:<br> <blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0 .8ex; BORDER-LEFT: #ccc 1px solid">In one of our reporting environments (OSEE <a href="http://10.2.0.2/" target="_blank">10.2.0.2</a>) we have optimizer_dynamic _sampling cranked up to 5. We have a case where dynamic sampling is pushing the CBO to choose a poor plan. Our situation highlights Level 4, specifically " ;tables that have single-table predicates that reference 2 or more columns" . (from the <a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/stats .htm#sthref1491" target="_blank">documentation</a>)<br><br>Looking at a 10046 trace, I see a OPT_DYN_SAMP query that counts a sample of rows that match variations on the predicate. I have found that a 10046 can always be good grounds for finding more questions than it answers. *grin* <br><br>To avoid the bandwidth, I will show just the relevant parts of the sampling query:<br><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace">SELECT /* OPT_DYN_SAMP */</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> . ..</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> FROM</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace "><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> (SELECT /* ... */</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> 1 AS C1,</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> CASE</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> WHEN "RCRAPP1". "RCRAPP1_AIDY_CODE"=:bind1 </span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> AND "RCRAPP1"."RCRAPP1 _INFC_CODE"=:bind2 </span> <br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> AND "RCRAPP1"."RCRAPP1_CURR _REC_IND"=:bind3 </span> <br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> AND "RCRAPP1"."RCRAPP1_VPDI _CODE"=:bind4 </span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> THEN 1</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> ELSE 0</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> END AS C2,</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> CASE</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> WHEN "RCRAPP1"." ;RCRAPP1_AIDY_CODE"=:bind1</span><br style="COLOR: rgb(51,51,153); FONT -FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> AND "RCRAPP1"."RCRAPP1_VPDI_CODE"=:bind4 </span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> THEN 1</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> ELSE 0</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> END AS C3,</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> CASE</span><br style="COLOR: rgb(51,51,153); FONT -FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> WHEN "RCRAPP1"."RCRAPP1_AIDY _CODE"=:bind1</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> AND "RCRAPP1"." ;RCRAPP1_VPDI_CODE"=:bind4</span><br style="COLOR: rgb(51,51,153); FONT -FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> THEN 1 </span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> ELSE 0</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> END AS C4</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> FROM ...</span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new ,monospace"> SAMPLE BLOCK (.037704 , 1) SEED (1) "RCRAPP1"</span> <br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"><span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace">) SAMPLESUB< /span><br style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace"> <span style="COLOR: rgb(51,51,153); FONT-FAMILY: courier new,monospace">/</span ><br><br>First question: Why the predicate variations? I am assuming that sometimes C4 is different than C3, so I am going to ignore C4 for now. <br>2) How does the Optimizer use these sample counts to influence the costs and subsequent access/join methods?<br><br>I believe what is happening in our case is that sampling is "just unlucky" and it happens to come up with a inaccurate picture of how many rows match (an order of magnitude too many). I can prove this by using this query directly with different sample sizes. <br><br>I am hoping that by understanding dynamic sampling a little better, I can understand how to resolve this issue. I realize that one can add the dynamic_sampling query hint, and perhaps that is the "best" solution for this. Aside from adjusting dynamic sampling (whether it be at the system level or via a hint), is there any other way to address this situation? <br><br>TIA,<br><br>-- <br><font color="#888888">Charles Schultz </font>< /blockquote></div><br>
|
|