<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Different Performance from Standard Edition and Enterprise Edition? 3</title>
	<atom:link href="http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/feed/" rel="self" type="application/rss+xml" />
	<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/</link>
	<description>Miscellaneous Random Oracle Topics: Stop, Think, ... Understand</description>
	<lastBuildDate>Mon, 13 May 2013 14:10:06 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Noons</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2151</link>
		<dc:creator><![CDATA[Noons]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 20:47:53 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2151</guid>
		<description><![CDATA[Exactly.  What we need really is a &quot;10054&quot; - or a &quot;10053 on steroids&quot; if you prefer - that clearly spells out what optmizer-affecting db options have been taken into consideration in a given plan.  It&#039;d go a long way in dispelling all these &quot;peformance ghosts&quot; we keep seeing on every release/patch level combo and between instances.  

Having been tasked to make our test, acceptance and production instances behave the same way when running the same SQL, I find myself fighting this same battle over and over again, when really it should be a lot easier.  Constant source of headaches, as is.  

What&#039;s worse: every new release/patch level introduces the potential for different behaviour.  Exhaustively testing all that and preventing it turns out to be expensive, if one considers the perspective of the software developer as pointed out by Charles.  Any wonder why sometimes those developers take weird decisions in terms of db design and SQL usage?  I can hear their pain...

Charles pointed out some of the very important CBO behaviour differences with seemingly harmless changes in unrelated parameters.  Hidden features like the &quot;behind the scenes parallelism&quot; we both mentioned add to this problem: there is no way to be sure we&#039;re not seeing a side effect of one of those...  I&#039;m abstracting the side effects of any bu^H^Hfeatures that might creep in, of course!

I suppose it makes the job interesting, but really I&#039;d prefer to have it simplified!   

And no: OEM and grid&#039;s performance pack won&#039;t resolve this problem, it doesn&#039;t even begin to understand it! (just pre-empting the strike before someone else jumps in with that furphy!)  :)]]></description>
		<content:encoded><![CDATA[<p>Exactly.  What we need really is a &#8220;10054&#8243; &#8211; or a &#8220;10053 on steroids&#8221; if you prefer &#8211; that clearly spells out what optmizer-affecting db options have been taken into consideration in a given plan.  It&#8217;d go a long way in dispelling all these &#8220;peformance ghosts&#8221; we keep seeing on every release/patch level combo and between instances.  </p>
<p>Having been tasked to make our test, acceptance and production instances behave the same way when running the same SQL, I find myself fighting this same battle over and over again, when really it should be a lot easier.  Constant source of headaches, as is.  </p>
<p>What&#8217;s worse: every new release/patch level introduces the potential for different behaviour.  Exhaustively testing all that and preventing it turns out to be expensive, if one considers the perspective of the software developer as pointed out by Charles.  Any wonder why sometimes those developers take weird decisions in terms of db design and SQL usage?  I can hear their pain&#8230;</p>
<p>Charles pointed out some of the very important CBO behaviour differences with seemingly harmless changes in unrelated parameters.  Hidden features like the &#8220;behind the scenes parallelism&#8221; we both mentioned add to this problem: there is no way to be sure we&#8217;re not seeing a side effect of one of those&#8230;  I&#8217;m abstracting the side effects of any bu^H^Hfeatures that might creep in, of course!</p>
<p>I suppose it makes the job interesting, but really I&#8217;d prefer to have it simplified!   </p>
<p>And no: OEM and grid&#8217;s performance pack won&#8217;t resolve this problem, it doesn&#8217;t even begin to understand it! (just pre-empting the strike before someone else jumps in with that furphy!)  <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2150</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 14:57:30 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2150</guid>
		<description><![CDATA[An interesting twist, maybe.  In the article I mentioned that in several cases the number of blocks read from disk exceeded the number of consistent gets - those were visible in the Row Source Operation execution plans in the Enterprise Edition.  I just re-executed the test on my laptop using an unset value for DB_FILE_MULTIBLOCK_READ_COUNT and the system (CPU) statistics listed at the start of this blog article.  With the changes on my laptop, I obtained the same execution plans as seen in the blog article, with one exception.  The consistent gets are now always greater than or equal to the number of blocks physically read from disk.  Interesting?

[code]
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4
  3  FROM
  4    T1
  5  WHERE
  6    T1.C2=&#039;MONDAY&#039;
  7    AND T1.C3 BETWEEN 200 AND 255;

10952 rows selected.


Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
       6884  consistent gets
       6876  physical reads
          0  redo size
     103802  bytes sent via SQL*Net to client
        470  bytes received via SQL*Net from client
         12  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      10952  rows processed
[/code]
 
[code]
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       12      0.24       0.55       6876       6884          0       10952
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       14      0.26       0.56       6876       6884          0       10952
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
     10952      10952      10952  TABLE ACCESS BY INDEX ROWID T1 (cr=6884 pr=6876 pw=0 time=20871 us cost=2973 size=234234 card=11154)
     10952      10952      10952   BITMAP CONVERSION TO ROWIDS (cr=346 pr=345 pw=0 time=2963 us)
         2          2          2    BITMAP AND  (cr=346 pr=345 pw=0 time=24470 us)
        11         11         11     BITMAP CONVERSION FROM ROWIDS (cr=183 pr=182 pw=0 time=57010 us)
     71428      71428      71428      INDEX RANGE SCAN IND_T1_C2 (cr=183 pr=182 pw=0 time=70788 us cost=194 size=0 card=0)(object id 82006)
         3          3          3     BITMAP CONVERSION FROM ROWIDS (cr=163 pr=163 pw=0 time=10584 us)
     76664      76664      76664      SORT ORDER BY (cr=163 pr=163 pw=0 time=12414 us)
     76664      76664      76664       INDEX RANGE SCAN IND_T1_C3 (cr=163 pr=163 pw=0 time=19709 us cost=164 size=0 card=0)(object id 82007)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      12        0.00          0.00
  db file sequential read                       493        0.00          0.08
  SQL*Net message from client                    12        0.00          0.00
  db file parallel read                         274        0.00          0.30
  SQL*Net more data to client                    11        0.00          0.00
[/code]
 
[code]
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4,
  3    T2.C4
  4  FROM
  5    T1,
  6    T2
  7  WHERE
  8    T1.C2=&#039;MONDAY&#039;
  9    AND T1.C3 BETWEEN 200 AND 255
 10    AND T1.C1=T2.C1
 11    AND T1.C3=T2.C3;

9484744 rows selected.


Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
      54125  consistent gets
      45339  physical reads
          0  redo size
  124731018  bytes sent via SQL*Net to client
     104684  bytes received via SQL*Net from client
       9486  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
    9484744  rows processed
[/code]
 
[code]
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.03       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch     9486      4.16       4.92      45339      54125          0     9484744
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     9488      4.19       4.94      45339      54125          0     9484744
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
   9484744    9484744    9484744  HASH JOIN  (cr=54125 pr=45339 pw=0 time=4969125 us cost=5999 size=2994849 card=76791)
     10952      10952      10952   TABLE ACCESS BY INDEX ROWID T1 (cr=6876 pr=6876 pw=0 time=1043019 us cost=2973 size=267696 card=11154)
     10952      10952      10952    BITMAP CONVERSION TO ROWIDS (cr=345 pr=345 pw=0 time=4456 us)
         2          2          2     BITMAP AND  (cr=345 pr=345 pw=0 time=24642 us)
        11         11         11      BITMAP CONVERSION FROM ROWIDS (cr=182 pr=182 pw=0 time=53970 us)
     71428      71428      71428       INDEX RANGE SCAN IND_T1_C2 (cr=182 pr=182 pw=0 time=68743 us cost=194 size=0 card=0)(object id 82006)
         3          3          3      BITMAP CONVERSION FROM ROWIDS (cr=163 pr=163 pw=0 time=11190 us)
     76664      76664      76664       SORT ORDER BY (cr=163 pr=163 pw=0 time=10622 us)
     76664      76664      76664        INDEX RANGE SCAN IND_T1_C3 (cr=163 pr=163 pw=0 time=22013 us cost=164 size=0 card=0)(object id 82007)
     76664      76664      76664   TABLE ACCESS FULL T2 (cr=47249 pr=38463 pw=0 time=3398812 us cost=3025 size=1171125 card=78075)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                    9486        0.00          0.00
  db file sequential read                       620        0.00          0.15
  db file parallel read                         274        0.00          0.31
  db file scattered read                        316        0.00          0.15
  SQL*Net message from client                  9486        0.06         10.45
  SQL*Net more data to client                  9485        0.00          0.34
[/code]

Now I am starting to wonder if Oracle Corp. released a buggy version of 11.2.0.1 that can&#039;t count physical block reads correctly, and a less buggy version that can count physical block reads and also adds the &quot;Rows (1st) Rows (avg) Rows (max)&quot; columns in the TKPROF output?]]></description>
		<content:encoded><![CDATA[<p>An interesting twist, maybe.  In the article I mentioned that in several cases the number of blocks read from disk exceeded the number of consistent gets &#8211; those were visible in the Row Source Operation execution plans in the Enterprise Edition.  I just re-executed the test on my laptop using an unset value for DB_FILE_MULTIBLOCK_READ_COUNT and the system (CPU) statistics listed at the start of this blog article.  With the changes on my laptop, I obtained the same execution plans as seen in the blog article, with one exception.  The consistent gets are now always greater than or equal to the number of blocks physically read from disk.  Interesting?</p>
<pre class="brush: plain; title: ; notranslate">
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4
  3  FROM
  4    T1
  5  WHERE
  6    T1.C2='MONDAY'
  7    AND T1.C3 BETWEEN 200 AND 255;

10952 rows selected.


Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
       6884  consistent gets
       6876  physical reads
          0  redo size
     103802  bytes sent via SQL*Net to client
        470  bytes received via SQL*Net from client
         12  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      10952  rows processed
</pre>
<pre class="brush: plain; title: ; notranslate">
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       12      0.24       0.55       6876       6884          0       10952
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       14      0.26       0.56       6876       6884          0       10952
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
     10952      10952      10952  TABLE ACCESS BY INDEX ROWID T1 (cr=6884 pr=6876 pw=0 time=20871 us cost=2973 size=234234 card=11154)
     10952      10952      10952   BITMAP CONVERSION TO ROWIDS (cr=346 pr=345 pw=0 time=2963 us)
         2          2          2    BITMAP AND  (cr=346 pr=345 pw=0 time=24470 us)
        11         11         11     BITMAP CONVERSION FROM ROWIDS (cr=183 pr=182 pw=0 time=57010 us)
     71428      71428      71428      INDEX RANGE SCAN IND_T1_C2 (cr=183 pr=182 pw=0 time=70788 us cost=194 size=0 card=0)(object id 82006)
         3          3          3     BITMAP CONVERSION FROM ROWIDS (cr=163 pr=163 pw=0 time=10584 us)
     76664      76664      76664      SORT ORDER BY (cr=163 pr=163 pw=0 time=12414 us)
     76664      76664      76664       INDEX RANGE SCAN IND_T1_C3 (cr=163 pr=163 pw=0 time=19709 us cost=164 size=0 card=0)(object id 82007)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      12        0.00          0.00
  db file sequential read                       493        0.00          0.08
  SQL*Net message from client                    12        0.00          0.00
  db file parallel read                         274        0.00          0.30
  SQL*Net more data to client                    11        0.00          0.00
</pre>
<pre class="brush: plain; title: ; notranslate">
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4,
  3    T2.C4
  4  FROM
  5    T1,
  6    T2
  7  WHERE
  8    T1.C2='MONDAY'
  9    AND T1.C3 BETWEEN 200 AND 255
 10    AND T1.C1=T2.C1
 11    AND T1.C3=T2.C3;

9484744 rows selected.


Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
      54125  consistent gets
      45339  physical reads
          0  redo size
  124731018  bytes sent via SQL*Net to client
     104684  bytes received via SQL*Net from client
       9486  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
    9484744  rows processed
</pre>
<pre class="brush: plain; title: ; notranslate">
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.03       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch     9486      4.16       4.92      45339      54125          0     9484744
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     9488      4.19       4.94      45339      54125          0     9484744
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
   9484744    9484744    9484744  HASH JOIN  (cr=54125 pr=45339 pw=0 time=4969125 us cost=5999 size=2994849 card=76791)
     10952      10952      10952   TABLE ACCESS BY INDEX ROWID T1 (cr=6876 pr=6876 pw=0 time=1043019 us cost=2973 size=267696 card=11154)
     10952      10952      10952    BITMAP CONVERSION TO ROWIDS (cr=345 pr=345 pw=0 time=4456 us)
         2          2          2     BITMAP AND  (cr=345 pr=345 pw=0 time=24642 us)
        11         11         11      BITMAP CONVERSION FROM ROWIDS (cr=182 pr=182 pw=0 time=53970 us)
     71428      71428      71428       INDEX RANGE SCAN IND_T1_C2 (cr=182 pr=182 pw=0 time=68743 us cost=194 size=0 card=0)(object id 82006)
         3          3          3      BITMAP CONVERSION FROM ROWIDS (cr=163 pr=163 pw=0 time=11190 us)
     76664      76664      76664       SORT ORDER BY (cr=163 pr=163 pw=0 time=10622 us)
     76664      76664      76664        INDEX RANGE SCAN IND_T1_C3 (cr=163 pr=163 pw=0 time=22013 us cost=164 size=0 card=0)(object id 82007)
     76664      76664      76664   TABLE ACCESS FULL T2 (cr=47249 pr=38463 pw=0 time=3398812 us cost=3025 size=1171125 card=78075)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                    9486        0.00          0.00
  db file sequential read                       620        0.00          0.15
  db file parallel read                         274        0.00          0.31
  db file scattered read                        316        0.00          0.15
  SQL*Net message from client                  9486        0.06         10.45
  SQL*Net more data to client                  9485        0.00          0.34
</pre>
<p>Now I am starting to wonder if Oracle Corp. released a buggy version of 11.2.0.1 that can&#8217;t count physical block reads correctly, and a less buggy version that can count physical block reads and also adds the &#8220;Rows (1st) Rows (avg) Rows (max)&#8221; columns in the TKPROF output?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Niall Litchfield</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2149</link>
		<dc:creator><![CDATA[Niall Litchfield]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 14:42:41 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2149</guid>
		<description><![CDATA[Hi Noons. 

I said it and I agree! BTree/Bitmap conversion is kinda interesting to me, since you can still set the parameter in SE even in 11.2.0.1 

&lt;pre&gt;
SYS @ SE &gt;@show_parameter _b_tree_bitmap_plans
old   4: AND kSPPINM=&#039;&amp;1&#039;
new   4: AND kSPPINM=&#039;_b_tree_bitmap_plans&#039;

NAME                                                             VALUE
---------------------------------------------------------------- ------------------------------
_b_tree_bitmap_plans                                             TRUE

SYS @ SE &gt;
&lt;/pre&gt;

but it doesn&#039;t seem to be honoured (perhaps rightly, perhaps not). 

I like your suggestion re: indicating which features have been considered. Perhaps externalizing the presumably existing STRUCT(s?) behind optimizer_features_enable would be useful. I&#039;m pretty sure that even back to 8i there were the odd partitioned objects used by SYS even though constructing them was not available in the product.]]></description>
		<content:encoded><![CDATA[<p>Hi Noons. </p>
<p>I said it and I agree! BTree/Bitmap conversion is kinda interesting to me, since you can still set the parameter in SE even in 11.2.0.1 </p>
<pre>
SYS @ SE &gt;@show_parameter _b_tree_bitmap_plans
old   4: AND kSPPINM='&amp;1'
new   4: AND kSPPINM='_b_tree_bitmap_plans'

NAME                                                             VALUE
---------------------------------------------------------------- ------------------------------
_b_tree_bitmap_plans                                             TRUE

SYS @ SE &gt;
</pre>
<p>but it doesn&#8217;t seem to be honoured (perhaps rightly, perhaps not). </p>
<p>I like your suggestion re: indicating which features have been considered. Perhaps externalizing the presumably existing STRUCT(s?) behind optimizer_features_enable would be useful. I&#8217;m pretty sure that even back to 8i there were the odd partitioned objects used by SYS even though constructing them was not available in the product.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2148</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 12:25:00 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2148</guid>
		<description><![CDATA[Niall,

I suspect that there is still a lot that I have not covered yet regarding the differences between Standard Edition and Enterprise Edition - probably plenty that I am not aware of yet.  I look forward to reading your blog article series on the topic.  I will have to take a closer look at the 11.2.0.1 Standard Edition results - did you use the same workload system statistics that I listed at the start of the article, or did you use other settings that are more accurate for your server environment?  It took close to 5 hours to put together this blog article, even though it probably looks like 20 minutes of effort (writing the darn test script took too long, and I ended up deleting the last half of the test script because the results were too similar to the first half).]]></description>
		<content:encoded><![CDATA[<p>Niall,</p>
<p>I suspect that there is still a lot that I have not covered yet regarding the differences between Standard Edition and Enterprise Edition &#8211; probably plenty that I am not aware of yet.  I look forward to reading your blog article series on the topic.  I will have to take a closer look at the 11.2.0.1 Standard Edition results &#8211; did you use the same workload system statistics that I listed at the start of the article, or did you use other settings that are more accurate for your server environment?  It took close to 5 hours to put together this blog article, even though it probably looks like 20 minutes of effort (writing the darn test script took too long, and I ended up deleting the last half of the test script because the results were too similar to the first half).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Charles Hooper</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2147</link>
		<dc:creator><![CDATA[Charles Hooper]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 12:09:42 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2147</guid>
		<description><![CDATA[I was a bit concerned that I did not post enough detail in the article in between the scripts and script output.  Noons, Dombrooks, and Niall, I appreciate your comments - those comments filled in what I considered to be the worst of the gaps in this blog article.

Just to spin things a bit, I repeated the test on my laptop, which has the Enterprise Edition of 11.2.0.1.  (For some reason, TKPROF in 11.2.0.1 has now decided to start including the &quot;Rows (1st) Rows (avg) Rows (max)&quot; columns in the output - previously I could only see those columns when processing a trace file with TKPROF from 11.2.0.2.)  I did not change the workload system (CPU) statistics, so the 10053 portion of the trace file showed those values as:
[code]
-----------------------------
SYSTEM STATISTICS INFORMATION
-----------------------------
  Using WORKLOAD Stats
  CPUSPEED: 2714 millions instructions/sec
  SREADTIM: 0.100000 milliseconds
  MREADTIM: 0.200000 millisecons
  MBRC: 78 blocks
  MAXTHR: 302080 bytes/sec
  SLAVETHR: -1 bytes/sec
[/code]

Also, it appears that DB_FILE_MULTIBLOCK_READ_COUNT was forced to a value of 128, while it was autoset to 128 in the other databases.  And rather than having the SGA_TARGET set to 8000M and the PGA_AGGREGATE_TARGET set 1800M, those parameters were set to 12000M and 2000M, respectively.

Now, what do you think happened to the statistics displayed in TKPROF and the execution plans?

The SQL*Plus output for the first SQL statement:
[code]
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4
  3  FROM
  4    T1
  5  WHERE
  6    T1.C2=&#039;MONDAY&#039;
  7    AND T1.C3 BETWEEN 200 AND 255;
 
10952 rows selected.
 
Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
      38485  consistent gets
      38463  physical reads
          0  redo size
     103802  bytes sent via SQL*Net to client
        469  bytes received via SQL*Net from client
         12  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      10952  rows processed
[/code]

The TKPROF output for the first SQL statement:
[code]
SELECT /* FIND_ME */
  T1.C4
FROM
  T1
WHERE
  T1.C2=&#039;MONDAY&#039;
  AND T1.C3 BETWEEN 200 AND 255
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       12      0.21       0.55      38463      38485          0       10952
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       14      0.23       0.57      38463      38485          0       10952
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
     10952      10952      10952  TABLE ACCESS FULL T1 (cr=38485 pr=38463 pw=0 time=3880132 us cost=2459 size=234234 card=11154)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      12        0.00          0.00
  db file sequential read                         1        0.00          0.00
  db file scattered read                        316        0.00          0.40
  SQL*Net message from client                    12        0.00          0.00
  SQL*Net more data to client                    11        0.00          0.00
[/code]

The SQL*Plus output for the second SQL statement:
[code]
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4,
  3    T2.C4
  4  FROM
  5    T1,
  6    T2
  7  WHERE
  8    T1.C2=&#039;MONDAY&#039;
  9    AND T1.C3 BETWEEN 200 AND 255
 10    AND T1.C1=T2.C1
 11    AND T1.C3=T2.C3;
 
9484744 rows selected.
 
Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
      85724  consistent gets
      76926  physical reads
          0  redo size
  124731018  bytes sent via SQL*Net to client
     104683  bytes received via SQL*Net from client
       9486  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    9484744  rows processed
[/code]

The TKPROF output for the second SQL statement:
[code]
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.03       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch     9486      3.99       4.87      76926      85724          0     9484744
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     9488      4.02       4.89      76926      85724          0     9484744
  
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
   9484744    9484744    9484744  HASH JOIN  (cr=85724 pr=76926 pw=0 time=4592034 us cost=4982 size=2994849 card=76791)
     10952      10952      10952   TABLE ACCESS FULL T1 (cr=38475 pr=38463 pw=0 time=3799997 us cost=2459 size=267696 card=11154)
     76664      76664      76664   TABLE ACCESS FULL T2 (cr=47249 pr=38463 pw=0 time=2836531 us cost=2487 size=1171125 card=78075)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                    9486        0.00          0.00
  db file sequential read                         2        0.00          0.00
  db file scattered read                        632        0.00          0.66
  SQL*Net message from client                  9486        0.06         10.27
  SQL*Net more data to client                  9485        0.00          0.35
  asynch descriptor resize                        1        0.00          0.00
[/code]

Now, compare the above Row Source Operation execution plans with those of Standard Edition in the article - the Row Source Operation execution plans are quite similar to what we saw with Standard Edition, but the wait event might be a bit different.  Note also the &quot;asynch descriptor resize&quot; wait event - I wonder what that means?

If I have learned anything from this exercise it is that there are plenty of opportunities to see different performance in development, test, and production databases when the database edition does not match, and when the workload system (CPU) statistics do not match.  Scary?  Yes, especially for application development companies that develop database applications using an entirely different database configuration than their customers.]]></description>
		<content:encoded><![CDATA[<p>I was a bit concerned that I did not post enough detail in the article in between the scripts and script output.  Noons, Dombrooks, and Niall, I appreciate your comments &#8211; those comments filled in what I considered to be the worst of the gaps in this blog article.</p>
<p>Just to spin things a bit, I repeated the test on my laptop, which has the Enterprise Edition of 11.2.0.1.  (For some reason, TKPROF in 11.2.0.1 has now decided to start including the &#8220;Rows (1st) Rows (avg) Rows (max)&#8221; columns in the output &#8211; previously I could only see those columns when processing a trace file with TKPROF from 11.2.0.2.)  I did not change the workload system (CPU) statistics, so the 10053 portion of the trace file showed those values as:</p>
<pre class="brush: plain; title: ; notranslate">
-----------------------------
SYSTEM STATISTICS INFORMATION
-----------------------------
  Using WORKLOAD Stats
  CPUSPEED: 2714 millions instructions/sec
  SREADTIM: 0.100000 milliseconds
  MREADTIM: 0.200000 millisecons
  MBRC: 78 blocks
  MAXTHR: 302080 bytes/sec
  SLAVETHR: -1 bytes/sec
</pre>
<p>Also, it appears that DB_FILE_MULTIBLOCK_READ_COUNT was forced to a value of 128, while it was autoset to 128 in the other databases.  And rather than having the SGA_TARGET set to 8000M and the PGA_AGGREGATE_TARGET set 1800M, those parameters were set to 12000M and 2000M, respectively.</p>
<p>Now, what do you think happened to the statistics displayed in TKPROF and the execution plans?</p>
<p>The SQL*Plus output for the first SQL statement:</p>
<pre class="brush: plain; title: ; notranslate">
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4
  3  FROM
  4    T1
  5  WHERE
  6    T1.C2='MONDAY'
  7    AND T1.C3 BETWEEN 200 AND 255;
 
10952 rows selected.
 
Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
      38485  consistent gets
      38463  physical reads
          0  redo size
     103802  bytes sent via SQL*Net to client
        469  bytes received via SQL*Net from client
         12  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      10952  rows processed
</pre>
<p>The TKPROF output for the first SQL statement:</p>
<pre class="brush: plain; title: ; notranslate">
SELECT /* FIND_ME */
  T1.C4
FROM
  T1
WHERE
  T1.C2='MONDAY'
  AND T1.C3 BETWEEN 200 AND 255
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch       12      0.21       0.55      38463      38485          0       10952
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       14      0.23       0.57      38463      38485          0       10952
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
     10952      10952      10952  TABLE ACCESS FULL T1 (cr=38485 pr=38463 pw=0 time=3880132 us cost=2459 size=234234 card=11154)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                      12        0.00          0.00
  db file sequential read                         1        0.00          0.00
  db file scattered read                        316        0.00          0.40
  SQL*Net message from client                    12        0.00          0.00
  SQL*Net more data to client                    11        0.00          0.00
</pre>
<p>The SQL*Plus output for the second SQL statement:</p>
<pre class="brush: plain; title: ; notranslate">
SQL&gt; SELECT /* FIND_ME */
  2    T1.C4,
  3    T2.C4
  4  FROM
  5    T1,
  6    T2
  7  WHERE
  8    T1.C2='MONDAY'
  9    AND T1.C3 BETWEEN 200 AND 255
 10    AND T1.C1=T2.C1
 11    AND T1.C3=T2.C3;
 
9484744 rows selected.
 
Statistics
---------------------------------------------------
          1  recursive calls
          0  db block gets
      85724  consistent gets
      76926  physical reads
          0  redo size
  124731018  bytes sent via SQL*Net to client
     104683  bytes received via SQL*Net from client
       9486  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
    9484744  rows processed
</pre>
<p>The TKPROF output for the second SQL statement:</p>
<pre class="brush: plain; title: ; notranslate">
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.03       0.01          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch     9486      3.99       4.87      76926      85724          0     9484744
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total     9488      4.02       4.89      76926      85724          0     9484744
  
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 286  
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
   9484744    9484744    9484744  HASH JOIN  (cr=85724 pr=76926 pw=0 time=4592034 us cost=4982 size=2994849 card=76791)
     10952      10952      10952   TABLE ACCESS FULL T1 (cr=38475 pr=38463 pw=0 time=3799997 us cost=2459 size=267696 card=11154)
     76664      76664      76664   TABLE ACCESS FULL T2 (cr=47249 pr=38463 pw=0 time=2836531 us cost=2487 size=1171125 card=78075)
 
Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                    9486        0.00          0.00
  db file sequential read                         2        0.00          0.00
  db file scattered read                        632        0.00          0.66
  SQL*Net message from client                  9486        0.06         10.27
  SQL*Net more data to client                  9485        0.00          0.35
  asynch descriptor resize                        1        0.00          0.00
</pre>
<p>Now, compare the above Row Source Operation execution plans with those of Standard Edition in the article &#8211; the Row Source Operation execution plans are quite similar to what we saw with Standard Edition, but the wait event might be a bit different.  Note also the &#8220;asynch descriptor resize&#8221; wait event &#8211; I wonder what that means?</p>
<p>If I have learned anything from this exercise it is that there are plenty of opportunities to see different performance in development, test, and production databases when the database edition does not match, and when the workload system (CPU) statistics do not match.  Scary?  Yes, especially for application development companies that develop database applications using an entirely different database configuration than their customers.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Noons</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2146</link>
		<dc:creator><![CDATA[Noons]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 11:03:34 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2146</guid>
		<description><![CDATA[I&#039;m always a bit turned off by the &quot;effects can be subtle&quot; thing.  To me that reads &quot;we don&#039;t exactly know&quot;.  And given the hopelessness of getting any true in depth information from Oracle for more than one release on exactly how does the optimizer work, we&#039;re better off testing,testing,testing...  
Which is not good and doesn&#039;t help make a case for clients out there upgrading their software: they can see clearly how expensive it&#039;s truly gonna be.  
I agree with you entirely that the differences in behaviour present here are due to features of EE that are simply not present - or partly disabled - in SE.   Bitmaps being an obvious one.  
There should really be an option for the optimizer to indicate which features have not been considered in elaborating a plan.
What I find interesting is that the 10g-onwards auto-maintenance default jobs make full use of creating/dropping partitions to clean up their work tables, regardless of the db being SE/EE/EE with PO.  Which seems to indicate the ability is there for the optimizer to clearly indicate what has been turned off/on, regardless of database level/version.]]></description>
		<content:encoded><![CDATA[<p>I&#8217;m always a bit turned off by the &#8220;effects can be subtle&#8221; thing.  To me that reads &#8220;we don&#8217;t exactly know&#8221;.  And given the hopelessness of getting any true in depth information from Oracle for more than one release on exactly how does the optimizer work, we&#8217;re better off testing,testing,testing&#8230;<br />
Which is not good and doesn&#8217;t help make a case for clients out there upgrading their software: they can see clearly how expensive it&#8217;s truly gonna be.<br />
I agree with you entirely that the differences in behaviour present here are due to features of EE that are simply not present &#8211; or partly disabled &#8211; in SE.   Bitmaps being an obvious one.<br />
There should really be an option for the optimizer to indicate which features have not been considered in elaborating a plan.<br />
What I find interesting is that the 10g-onwards auto-maintenance default jobs make full use of creating/dropping partitions to clean up their work tables, regardless of the db being SE/EE/EE with PO.  Which seems to indicate the ability is there for the optimizer to clearly indicate what has been turned off/on, regardless of database level/version.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Niall Litchfield</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2145</link>
		<dc:creator><![CDATA[Niall Litchfield]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 09:10:49 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2145</guid>
		<description><![CDATA[Noons,

SE does perform differently than EE for a variety of reasons, mostly related to features available in EE but not SE, these aren&#039;t limited to parallelism and partitioning and the effects can be subtle. The interesting thing with Charles&#039; test is how suitable many of his queries are (regarded as being by the cbo) for b_tree_bitmap_plans. These are not available in SE (though I definitely seem to recall seeing them - and disabling them - in either  9.0 or 9.2 SE, don&#039;t have either of those available to test anymore). In general you can expect these plans to occur when you get either an &#039;and&#039; or an &#039;or&#039; predicate on two columns which are each indexed and the indexes are somewhat selective. 

Charles,
My you are pumping out these tests fast, and stealing some of my thunder from that email conversation :),  I was working through a similar line of enquiry, but the day job and next weeks presentation are getting in the way :)  I am a little bit suprised that you didn&#039;t get a CONCATENATION operation in the index join case in SE - that&#039;s what I got in 11.2.0.1 from your first test. It would be interesting (to me) to see the 10053 traces and cost calculations.    

Niall]]></description>
		<content:encoded><![CDATA[<p>Noons,</p>
<p>SE does perform differently than EE for a variety of reasons, mostly related to features available in EE but not SE, these aren&#8217;t limited to parallelism and partitioning and the effects can be subtle. The interesting thing with Charles&#8217; test is how suitable many of his queries are (regarded as being by the cbo) for b_tree_bitmap_plans. These are not available in SE (though I definitely seem to recall seeing them &#8211; and disabling them &#8211; in either  9.0 or 9.2 SE, don&#8217;t have either of those available to test anymore). In general you can expect these plans to occur when you get either an &#8216;and&#8217; or an &#8216;or&#8217; predicate on two columns which are each indexed and the indexes are somewhat selective. </p>
<p>Charles,<br />
My you are pumping out these tests fast, and stealing some of my thunder from that email conversation <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ,  I was working through a similar line of enquiry, but the day job and next weeks presentation are getting in the way <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   I am a little bit suprised that you didn&#8217;t get a CONCATENATION operation in the index join case in SE &#8211; that&#8217;s what I got in 11.2.0.1 from your first test. It would be interesting (to me) to see the 10053 traces and cost calculations.    </p>
<p>Niall</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dombrooks</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2144</link>
		<dc:creator><![CDATA[dombrooks]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 09:01:33 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2144</guid>
		<description><![CDATA[We&#039;re already expecting parallel operations not to work on Standard Edition.
The same is true of bitmap indexes - an EE edition only feature. 

But this demonstrates that it&#039;s not just the creation of a bitmap index - which is what you might initially thing - it&#039;s also internal operations like the old btree bitmap conversion. 

This operation should also be familiar as a potential troublemaker (not always) and so it being available for consideration by the optimizer in EE is not always a good thing.]]></description>
		<content:encoded><![CDATA[<p>We&#8217;re already expecting parallel operations not to work on Standard Edition.<br />
The same is true of bitmap indexes &#8211; an EE edition only feature. </p>
<p>But this demonstrates that it&#8217;s not just the creation of a bitmap index &#8211; which is what you might initially thing &#8211; it&#8217;s also internal operations like the old btree bitmap conversion. </p>
<p>This operation should also be familiar as a potential troublemaker (not always) and so it being available for consideration by the optimizer in EE is not always a good thing.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Noons</title>
		<link>http://hoopercharles.wordpress.com/2010/11/22/different-performance-from-standard-edition-and-enterprise-edition-3/#comment-2143</link>
		<dc:creator><![CDATA[Noons]]></dc:creator>
		<pubDate>Tue, 23 Nov 2010 04:52:55 +0000</pubDate>
		<guid isPermaLink="false">http://hoopercharles.wordpress.com/?p=3660#comment-2143</guid>
		<description><![CDATA[Thanks for sharing this.  &quot;interesting&quot; is nott he word I&#039;d use.  More like: &quot;scary&quot;.  
There is no description or hint anywhere claiming EE performs differently than SE other than in the use of parallelism and partitioning where possible.  
Not the case here?]]></description>
		<content:encoded><![CDATA[<p>Thanks for sharing this.  &#8220;interesting&#8221; is nott he word I&#8217;d use.  More like: &#8220;scary&#8221;.<br />
There is no description or hint anywhere claiming EE performs differently than SE other than in the use of parallelism and partitioning where possible.<br />
Not the case here?</p>
]]></content:encoded>
	</item>
</channel>
</rss>
