<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Kerry Osborne's Oracle Blog</title>
	<atom:link href="http://kerryosborne.oracle-guy.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://kerryosborne.oracle-guy.com</link>
	<description>Just another Oracle blog</description>
	<pubDate>Wed, 01 Sep 2010 12:38:51 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<item>
		<title>Exadata Book</title>
		<link>http://kerryosborne.oracle-guy.com/2010/09/exadata-book/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/09/exadata-book/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 12:38:51 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[Writing]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2680</guid>
		<description><![CDATA[
Here&#8217;s some white Exaddata text
Well, I guess it&#8217;s official. A couple of weeks ago I committed to write an Exadata book for Apress, along with my intrepid co-author Randy Johnson. For those of you who don&#8217;t know Randy, he&#8217;s a very experienced Oracle Guy with a wealth of knowledge, particularly around RAC. I think the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://kerryosborne.oracle-guy.com/files/2010/08/expert-oracle-exadata.png" ><img class="size-full wp-image-2773 alignleft" title="expert-oracle-exadata" src="http://kerryosborne.oracle-guy.com/files/2010/08/expert-oracle-exadata.png" alt="" width="273" height="357" /></a></p>
<p><span style="color: white;">Here&#8217;s some white Exaddata text</span></p>
<p>Well, I guess it&#8217;s official. A couple of weeks ago I committed to write an Exadata book for Apress, along with my intrepid co-author Randy Johnson. For those of you who don&#8217;t know Randy, he&#8217;s a very experienced Oracle Guy with a wealth of knowledge, particularly around RAC. I think the two of us make a pretty good team - making up for each others weaknesses (oh wait, I should say we have &#8220;Complimentary Skill Sets&#8221; - yeah that sounds better).</p>
<p>Anyway, it turns out that writing a book is a lot of work! The way Tom Kyte turns them out I thought it must be pretty easy, but I&#8217;ve always been a little overconfident. So I&#8217;m starting to realize that I may not have time to do as many blog posts as I might like. But I must say that I am really excited about the subject matter! So I think it will be worth the effort. By the way, that&#8217;s not the official cover art (or even the official title as far as I know). I just hacked that together with a Adobe Illustrator. ;-)</p>
<p>As I have said many times, I think the Exadata storage software will usher in a whole new era in relational databases. Not just for Oracle, because you know the other guys will be trying to follow in their footsteps. But I think Oracle is miles ahead at this point, and they own their own hardware platform. Oracle claims that it has been their most successful product launch ever and I believe it. They are starting to pop up like weeds. It will be very interesting to see what the future holds for this platform. To be honest, I think we&#8217;re just seeing the tip of the iceberg at this point. Anyway, I appreciate the guys at Apress having the faith in us to take on this project. I hope we don&#8217;t disappoint them (I don&#8217;t think we will).</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/09/exadata-book/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Guess Who Got Inducted into the OakTable Network</title>
		<link>http://kerryosborne.oracle-guy.com/2010/08/guess-who-got-inducted-into-the-oak-table-network/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/08/guess-who-got-inducted-into-the-oak-table-network/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 17:10:32 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Non-Oracle]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2713</guid>
		<description><![CDATA[
I am very proud to be one of the newest OakTable Network members!
(That My Happy Face)

]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://kerryosborne.oracle-guy.com/files/2010/08/happy-kerry.png" ><img class="size-medium wp-image-2758 aligncenter" title="happy-kerry" src="http://kerryosborne.oracle-guy.com/files/2010/08/happy-kerry.png" alt="" width="177" height="207" /></a></p>
<p style="text-align: center;">I am very proud to be one of the newest OakTable Network members!</p>
<p style="text-align: center;">(That My Happy Face)</p>
<p style="text-align: center;"><a href="http://www.oaktable.net/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.oaktable.net');"><img class="alignnone size-full wp-image-2756" title="oaktable" src="http://kerryosborne.oracle-guy.com/files/2010/08/oaktable.jpg" alt="" width="300" height="177" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/08/guess-who-got-inducted-into-the-oak-table-network/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Notes on Applying Exadata Bundle Patch (BP5)</title>
		<link>http://kerryosborne.oracle-guy.com/2010/08/notes-on-applying-exadata-bundle-patch-bp5/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/08/notes-on-applying-exadata-bundle-patch-bp5/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 22:44:10 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2714</guid>
		<description><![CDATA[Randy Johnson has done a brief post after applying BP5 on our Exadata Lab machine. Looks like it went pretty smoothly with the exception of a problem with DBFS and some misleading comments in the README file regarding using the RDS protocol (both of which we had in play). Here&#8217;s a link to his post:
Exadata [...]]]></description>
			<content:encoded><![CDATA[<p>Randy Johnson has done a brief post after applying BP5 on our Exadata Lab machine. Looks like it went pretty smoothly with the exception of a problem with DBFS and some misleading comments in the README file regarding using the RDS protocol (both of which we had in play). Here&#8217;s a link to his post:</p>
<p><a href="http://blog.enkitec.com/2010/08/25/exadata-bundle-patch-5-gotchas/" onclick="javascript:pageTracker._trackPageview('/outbound/article/blog.enkitec.com');">Exadata Bundle Patch 5 Gotcha’s</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/08/notes-on-applying-exadata-bundle-patch-bp5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Running Oracle Exadata V2 on Dell Hardware</title>
		<link>http://kerryosborne.oracle-guy.com/2010/08/running-oracle-exadata-v2-on-dell-hardware/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/08/running-oracle-exadata-v2-on-dell-hardware/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 02:52:16 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Humor]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2716</guid>
		<description><![CDATA[Well we had to give it a shot.
So we created an Oracle Exadata Storage Server Software CELLBOOT USB flash drive. I&#8217;m not kidding, that&#8217;s what the Oracle/Sun guys decided to call it. They didn&#8217;t even use an acronym in the manual (I guess &#8220;ESSSCB USB FD&#8221; doesn&#8217;t roll off the tongue much better than the [...]]]></description>
			<content:encoded><![CDATA[<p>Well we had to give it a shot.</p>
<p>So we created an Oracle Exadata Storage Server Software CELLBOOT USB flash drive. I&#8217;m not kidding, that&#8217;s what the Oracle/Sun guys decided to call it. They didn&#8217;t even use an acronym in the manual (I guess &#8220;ESSSCB USB FD&#8221; doesn&#8217;t roll off the tongue much better than the whole thing anyway). We used the make_cellboot_usb utility to create the thing off one of our storage servers, which by the way was not that easy to do, since the USB ports are in the back of the 4275&#8217;s and they are not easy to get to with all the cabling that&#8217;s back there. Anyway, once we had the little bugger created we pulled it out of the back of the rack and booted a Dell Latitude D630 off of it. Here&#8217;s a picture:</p>
<p><a href="http://kerryosborne.oracle-guy.com/files/2010/08/exadata-on-dell.jpg" ><img class="alignnone size-full wp-image-2715" title="exadata-on-dell" src="http://kerryosborne.oracle-guy.com/files/2010/08/exadata-on-dell.jpg" alt="" width="800" height="600" /></a></p>
<p>Notice the thumb drive is all lit up like a Christmas tree.</p>
<p>Here is a close up of the screen (in case your eyes are going bad like mine):</p>
<p><a href="http://kerryosborne.oracle-guy.com/files/2010/08/exadata-on-dell-2.jpg" ><img class="alignnone size-full wp-image-2719" title="exadata-on-dell-2" src="http://kerryosborne.oracle-guy.com/files/2010/08/exadata-on-dell-2.jpg" alt="" width="800" height="599" /></a></p>
<p>So we tried a couple of different options but eventually got to this screen:</p>
<p><a href="http://kerryosborne.oracle-guy.com/files/2010/08/exadata-dell-messages.jpg" ><img class="alignnone size-full wp-image-2717" title="exadata-dell-messages" src="http://kerryosborne.oracle-guy.com/files/2010/08/exadata-dell-messages.jpg" alt="" width="640" height="480" /></a></p>
<p>Notice the ERROR line in the middle of the screen. Somebody wisely put a check in the boot procedure to verify the machine type, presumably if it&#8217;s not a Sun 4170 it will throw an error. We thought about hacking the system but decided not to at this point as we had real work to do. (maybe later when we&#8217;ve got nothing else to do)</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/08/running-oracle-exadata-v2-on-dell-hardware/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oracle Exadata - Storage Indexes</title>
		<link>http://kerryosborne.oracle-guy.com/2010/08/oracle-exadata-storage-indexes/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/08/oracle-exadata-storage-indexes/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 18:09:29 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2566</guid>
		<description><![CDATA[Wow! - I was stunned a few days ago by Exadata&#8217;s Storage Indexes. I was doing a little testing to see what could be offloaded and what couldn&#8217;t (more on that later). I have a 384 million row table I was using on our Exadata Quarter Rack test system. A single threaded full scan with [...]]]></description>
			<content:encoded><![CDATA[<p>Wow! - I was stunned a few days ago by Exadata&#8217;s Storage Indexes. I was doing a little testing to see what could be offloaded and what couldn&#8217;t (more on that later). I have a 384 million row table I was using on our Exadata Quarter Rack test system. A single threaded full scan with no where clause on the table takes about 24 seconds (ho hum - it&#8217;s amazing how quickly we become numbed to the outstanding performance ). So imagine my surprise when I decided to check and see how many nulls I had in a column and the result came back in .07 seconds. Wow! I thought it was a bug! Turns out it was the Storage Indexes. Alright already, I&#8217;ll show you some output from the system (by the way, as usual I used a couple of scripts: <a href="http://kerryosborne.oracle-guy.com/scripts/fsx.sql" >fsx.sql</a> and <a href="http://kerryosborne.oracle-guy.com/scripts/mystats.sql" >mystats.sql</a>):</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2566code3'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p25663"><td class="code" id="p2566code3"><pre class="none" style="font-family:monospace;">SYS@LABRAT1&gt; select count(*) from kso.skew3;
&nbsp;
  COUNT(*)
----------
 384000048
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:24.06
SYS@LABRAT1&gt; /
&nbsp;
  COUNT(*)
----------
 384000048
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:23.94
&nbsp;
SYS@LABRAT1&gt; set timing off
SYS@LABRAT1&gt; @mystats
Enter value for name: %storage%
&nbsp;
NAME                                                                             VALUE
---------------------------------------------------------------------- ---------------
cell physical IO bytes saved by storage index                                        0
&nbsp;
1 row selected.
&nbsp;
SYS@LABRAT1&gt; set timing on
SYS@LABRAT1&gt; select count(*) from kso.skew3 where col1 is null;
&nbsp;
  COUNT(*)
----------
        12
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:00.07
SYS@LABRAT1&gt; set timing off
SYS@LABRAT1&gt; @fsx
Enter value for sql_text: select count(*) from kso.skew3 where col1 is null
Enter value for sql_id: 
Enter value for inst_id: 
&nbsp;
&nbsp;
 INST SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO    AVG_PIO AVG_PX OFFLOADABLE IO_SAVED_% SQL_TEXT
----- ------------- ------ ---------- ---------- ------------- ------------ ---------- ------ ----------- ---------- ----------------------------------------
    1 0u1q4b7puqz6g      0 2684249835          5           .09    1,956,226  1,956,219      0 Yes             100.00 select count(*) from kso.skew3 where col
&nbsp;
1 row selected.
&nbsp;
SYS@LABRAT1&gt; @mystats
Enter value for name: %storage%
&nbsp;
NAME                                                                             VALUE
---------------------------------------------------------------------- ---------------
cell physical IO bytes saved by storage index                              16012763136
&nbsp;
1 row selected.</pre></td></tr></table></div>

<p>So apparently Storage Indexes are NULL aware. Very cool! This may have repercussions regarding design and implementation decisions. There are systems that don&#8217;t use NULLs in order to insure that they can access records via B-Tree indexes (which as you&#8217;re aware do not store NULLs). SAP for example uses a single space character instead of NULLs. </p>
<p><span id="more-2566"></span></p>
<p>The Sun / Oracle Exadata V2 has a number of features that get a lot of attention because of the dramatic performance gains they can provide. Smart Scan / Offloading, Hybrid Columnar Compression (HCC), Flash Cache, Infiniband Fabric, etc&#8230; Exadata Storage Indexes are not really high on the list of things that the sales guys tout, but they can provide a very significant performance benefit. One of the reasons they aren&#8217;t talked about much is that there is nothing really that you can do to affect how they work. There is no tuning them in other words. They just work. However, understanding how they work can certainly help you make better decisions about how to build systems and how to write SQL statements. I had an online discussion with someone a few weeks ago about Storage Indexes and the comment was made that we didn&#8217;t really need to understand them, because there was nothing we could do about them anyway. My thought was that we couldn&#8217;t do anything about the fact that normal B-Tree indexes don&#8217;t store NULLs either, but it is pretty important information to know when you are designing a system or trying to access data using a B-Tree index. </p>
<p>I found a very good description of Storage Indexes in an Oracle White Paper:</p>
<blockquote><p><strong><br />
Oracle Sun Database Machine Application Best Practices for Data Warehousing [ID 1094934.1]</p>
<p>Exdata Storage Index</strong></p>
<p>In Oracle Database 11gR2 a new feature called the Exadata Storage Index has been introduced. The storage index contains a summary of the data distribution on the disk and provides an additional method to eliminate unnecessary disk IO. </p>
<p>Each disk in the Exadata storage cell is divided into equal sized pieces called storage regions (default 1MB). There is an index entry for every storage regions (1MB of data stored on disk). Each entry contains the minimum and maximum value for columns seen in ‘where’ clause predicates. Information for up to 8 columns can be stored. The index is then used to eliminate disk IO by identifying which storage regions don’t match the ‘where’ clause of a query. For example consider the following query </p>
<p>The storage index is stored in the memory on each of the Exadata storage cells and is created and maintained transparently. However, if a storage cell is shutdown or rebooted the storage index will be lost from memory and will be recreated on subsequent accesses to the data after the cell has been brought back online. </p>
<p>The storage index can be used as an additional partitioning strategy if the data to be loaded is sorted on the additional partitioning column. For example, in the TPC-H benchmark, the Lineitem table is range partitioned on L_PARTKEY but several of the queries have where clause predicates on the SHIPDATE column. By loading the data in the Lineitem table sorted by SHIPDATE, the storage index can be used to eliminate data based on the SHIPDATE. </p>
<p>In order for the data to be fully sorted during the load you <b style='mso-bidi-font-weight:normal'>MUST</b> load using an INSERT /*+ APPEND */ statement with an order by clause on the column you want indexed. Before doing the load you should examine the execution plan to check that the sort and the load are being done by the same set of parallel server processes and that no data redistribution takes place between the sort and the load steps in the plan. </p></blockquote>
<p>The same document also contained this nifty graphic. You get the idea though right? Keep a min/max value for each 1M storage region.<br />
<a href="http://kerryosborne.oracle-guy.com/files/2010/08/storage_index.bmp" ><img src="http://kerryosborne.oracle-guy.com/files/2010/08/storage_index.bmp" alt="" title="storage_index" class="alignnone size-full wp-image-2695" /></a></p>
<p>The idea of using the Storage Index as an additional partitioning strategy is a very interesting. But as you can see from my example, Storage Indexes can also provide a huge benefit for highly skewed data. This is an area that Oracle has traditionally struggled with.  The typical scenario involves using an index for highly selective values and using a table scan for non-selective values. This choice is complicated by Oracle&#8217;s default bind variable peeking behavior. With Exadata, we may find that we are better off just ignoring the issue altogether. The full table scan will pretty much always provide the best performance possible, without the possibility of bind variable peeking or the overhead of a normal B-Tree index (that is to say, we probably won&#8217;t create the index at all). The storage index will provide very quick access to the highly selective values while the normal Exadata Offloading will handle the non-selective values better than we ever thought possible. </p>
<p>By the way, Netezza has a very similar &#8220;feature&#8221; called zone maps, although they apparently use a 3M storage unit. The larger unit means that it would be much more sensitive to how the data is sorted on disk, at least for the &#8220;virtual&#8221; partition elimination behavior.</p>
<p>One last thing. There is a way to turn off Storage Indexes on Exadata via a hidden parameter (_kcfis_storageidx_disabled), if you should ever want to do that (just for testing the feature perhaps). </p>
<p>Here&#8217;s a quick example:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2566code4'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p25664"><td class="code" id="p2566code4"><pre class="none" style="font-family:monospace;">SYS@LABRAT1&gt; select name, value from v$mystat s, v$statname n where n.statistic# = s.statistic# and name like '%storage%';
&nbsp;
NAME                                                                             VALUE
---------------------------------------------------------------------- ---------------
cell physical IO bytes saved by storage index                                        0
&nbsp;
Elapsed: 00:00:00.01
SYS@LABRAT1&gt; alter session set &quot;_kcfis_storageidx_disabled&quot;=true -- turn them off
  2  /
&nbsp;
Session altered.
&nbsp;
Elapsed: 00:00:00.00
SYS@LABRAT1&gt; select count(*) from kso.skew3 where col1 is null;
&nbsp;
  COUNT(*)
----------
        12
&nbsp;
Elapsed: 00:00:13.91
SYS@LABRAT1&gt; select name, value from v$mystat s, v$statname n where n.statistic# = s.statistic# and name like '%storage%';
&nbsp;
NAME                                                                             VALUE
---------------------------------------------------------------------- ---------------
cell physical IO bytes saved by storage index                                        0
&nbsp;
Elapsed: 00:00:00.00
SYS@LABRAT1&gt; alter session set &quot;_kcfis_storageidx_disabled&quot;=false -- back to default which turns it on
  2  /
&nbsp;
Session altered.
&nbsp;
Elapsed: 00:00:00.00
SYS@LABRAT1&gt; select count(*) from kso.skew3 where col1 is null;
&nbsp;
  COUNT(*)
----------
        12
&nbsp;
Elapsed: 00:00:00.07
SYS@LABRAT1&gt; select name, value from v$mystat s, v$statname n where n.statistic# = s.statistic# and name like '%storage%';
&nbsp;
NAME                                                                             VALUE
---------------------------------------------------------------------- ---------------
cell physical IO bytes saved by storage index                              16012763136
&nbsp;
Elapsed: 00:00:00.01</pre></td></tr></table></div>

<p>As always, your comments are welcomed.</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/08/oracle-exadata-storage-indexes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oracle Support Sanctions Manually Created SQL Profiles!</title>
		<link>http://kerryosborne.oracle-guy.com/2010/07/sqlt-coe_xfr_sql_profilesql/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/07/sqlt-coe_xfr_sql_profilesql/#comments</comments>
		<pubDate>Sat, 24 Jul 2010 20:00:45 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[Plan Stability]]></category>

		<category><![CDATA[Tuning]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2649</guid>
		<description><![CDATA[I originally titled this post: &#8220;SQLT - coe_xfr_sql_profile.sql&#8221;
Catchy title huh? -  (that&#8217;s why I changed it)
I&#8217;ve been promoting the use of SQL Profiles as a plan control mechanism for some time. The basic idea is to use the undocumented procedure dbms_sqltune.import_sql_profile to build a set of hints to be applied behind the scenes via [...]]]></description>
			<content:encoded><![CDATA[<p>I originally titled this post: &#8220;SQLT - coe_xfr_sql_profile.sql&#8221;</p>
<p>Catchy title huh? -  (that&#8217;s why I changed it)</p>
<p>I&#8217;ve been promoting the use of SQL Profiles as a plan control mechanism for some time. The basic idea is to use the undocumented procedure dbms_sqltune.import_sql_profile to build a set of hints to be applied behind the scenes via a SQL Profile. The hints can be created anyway can think of, but one of my favorite ways to generate them is to pull the hints from the other_xml filed of v$sql. This is a technique suggested to me originally by Randolf Geist. I have used this approach several times in the past but occasionally I&#8217;ve had a few doubts as to whether this is a good idea or even if SQL Profiles can apply all valid hints (see Jonathan Lewis&#8217;s comments on this post, <a href="http://kerryosborne.oracle-guy.com/2009/07/why-isnt-oracle-using-my-outline-profile-baseline/" >Why Oracle Isn&#8217;t Using My Profile</a>, where he expresses some doubts as well - he&#8217;s also written a bit about <a href="http://jonathanlewis.wordpress.com/2007/02/12/sql-profiles-2/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jonathanlewis.wordpress.com');">SQL Profiles on his site</a> as you might imagine). </p>
<p>So anyway, I just found out this week that there is a script published on Oracle&#8217;s Support site that does exactly the same thing.  It&#8217;s part of the SQLT zip file published in note 215187.1. By the way, SQLT has quite a bit of interesting information in it and the source (PL/SQL) is not wrapped, so it&#8217;s worth having a look at. There&#8217;s not much in the way of information about it out there, although I did see a reference to it in a comment on <a href=" http://jonathanlewis.wordpress.com/2010/04/30/10053-viewer/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jonathanlewis.wordpress.com');">one of Jonathan&#8217;s recent posts</a>. Maybe I&#8217;ll get around to doing another post on that topic some other time. Anyway,  the name of the SQL Profile building script is <a href="http://kerryosborne.oracle-guy.com/scripts/coe_xfr_sql_profile.sql" >coe_xfr_sql_profile.sql</a>. It basically pulls the hints from the other_xml field of v$sql and turns them into a SQL Profile. So I&#8217;m feeling better about myself now that I know that this approach is at least in some way sanctioned by Oracle support.</p>
<p>Here&#8217;s an example:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2649code6'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p26496"><td class="code" id="p2649code6"><pre class="none" style="font-family:monospace;">&nbsp;
SYS@LAB112&gt; @fs
Enter value for sql_text: %skew%
Enter value for sql_id: 
&nbsp;
SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO SQL_TEXT
------------- ------ ---------- ---------- ------------- ------------ ------------------------------------------------------------
688rj6tv1bav0      0  568322376          1          6.78      163,077 select avg(pk_col) from kso.skew where col1 = 1
abwg9nwg8prsj      0 3723858078          1           .01           39 select avg(pk_col) from kso.skew where col1 = 136135
&nbsp;
2 rows selected.
&nbsp;
SYS@LAB112&gt; @sql_hints
Enter value for sql_id: abwg9nwg8prsj
Enter value for child_no: 0
&nbsp;
OUTLINE_HINTS
-----------------------------------------------------------------------------------------------------------------------------------------------------------
IGNORE_OPTIM_EMBEDDED_HINTS
OPTIMIZER_FEATURES_ENABLE('11.2.0.1')
DB_VERSION('11.2.0.1')
ALL_ROWS
OUTLINE_LEAF(@&quot;SEL$1&quot;)
INDEX_RS_ASC(@&quot;SEL$1&quot; &quot;SKEW&quot;@&quot;SEL$1&quot; (&quot;SKEW&quot;.&quot;COL1&quot;))
&nbsp;
6 rows selected.
&nbsp;
SYS@LAB112&gt; @coe_xfr_sql_profile    
&nbsp;
Parameter 1:
SQL_ID (required)
&nbsp;
Enter value for 1: abwg9nwg8prsj          
&nbsp;
&nbsp;
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
     3723858078        .006
&nbsp;
Parameter 2:
PLAN_HASH_VALUE (required)
&nbsp;
Enter value for 2: 3723858078
&nbsp;
Values passed:
~~~~~~~~~~~~~
SQL_ID         : &quot;abwg9nwg8prsj&quot;
PLAN_HASH_VALUE: &quot;3723858078&quot;
&nbsp;
&nbsp;
Execute coe_xfr_sql_profile_abwg9nwg8prsj_3723858078.sql
on TARGET system in order to create a custom SQL Profile
with plan 3723858078 linked to adjusted sql_text.
&nbsp;
&nbsp;
COE_XFR_SQL_PROFILE completed.
SQL&gt;@coe_xfr_sql_profile_abwg9nwg8prsj_3723858078.sql
SQL&gt;REM
SQL&gt;REM $Header: 215187.1 coe_xfr_sql_profile_abwg9nwg8prsj_3723858078.sql 11.4.1.4 2010/07/23 csierra $
SQL&gt;REM
SQL&gt;REM Copyright (c) 2000-2010, Oracle Corporation. All rights reserved.
SQL&gt;REM
SQL&gt;REM AUTHOR
SQL&gt;REM   carlos.sierra@oracle.com
SQL&gt;REM
SQL&gt;REM SCRIPT
SQL&gt;REM   coe_xfr_sql_profile_abwg9nwg8prsj_3723858078.sql
SQL&gt;REM
SQL&gt;REM DESCRIPTION
SQL&gt;REM   This script is generated by coe_xfr_sql_profile.sql
SQL&gt;REM   It contains the SQL*Plus commands to create a custom
SQL&gt;REM   SQL Profile for SQL_ID abwg9nwg8prsj based on plan hash
SQL&gt;REM   value 3723858078.
SQL&gt;REM   The custom SQL Profile to be created by this script
SQL&gt;REM   will affect plans for SQL commands with signature
SQL&gt;REM   matching the one for SQL Text below.
SQL&gt;REM   Review SQL Text and adjust accordingly.
SQL&gt;REM
SQL&gt;REM PARAMETERS
SQL&gt;REM   None.
SQL&gt;REM
SQL&gt;REM EXAMPLE
SQL&gt;REM   SQL&gt; START coe_xfr_sql_profile_abwg9nwg8prsj_3723858078.sql;
SQL&gt;REM
SQL&gt;REM NOTES
SQL&gt;REM   1. Should be run as SYSTEM or SYSDBA.
SQL&gt;REM   2. User must have CREATE ANY SQL PROFILE privilege.
SQL&gt;REM   3. SOURCE and TARGET systems can be the same or similar.
SQL&gt;REM   4. To drop this custom SQL Profile after it has been created:
SQL&gt;REM  EXEC DBMS_SQLTUNE.DROP_SQL_PROFILE('coe_abwg9nwg8prsj_3723858078');
SQL&gt;REM   5. Be aware that using DBMS_SQLTUNE requires a license
SQL&gt;REM  for the Oracle Tuning Pack.
SQL&gt;REM
SQL&gt;WHENEVER SQLERROR EXIT SQL.SQLCODE;
SQL&gt;REM
SQL&gt;VAR signature NUMBER;
SQL&gt;REM
SQL&gt;DECLARE
  2  sql_txt CLOB;
  3  h       SYS.SQLPROF_ATTR;
  4  BEGIN
  5  sql_txt := q'[
  6  select avg(pk_col) from kso.skew where col1 = 136135
  7  ]';
  8  h := SYS.SQLPROF_ATTR(
  9  q'[BEGIN_OUTLINE_DATA]',
 10  q'[IGNORE_OPTIM_EMBEDDED_HINTS]',
 11  q'[OPTIMIZER_FEATURES_ENABLE('11.2.0.1')]',
 12  q'[DB_VERSION('11.2.0.1')]',
 13  q'[ALL_ROWS]',
 14  q'[OUTLINE_LEAF(@&quot;SEL$1&quot;)]',
 15  q'[INDEX_RS_ASC(@&quot;SEL$1&quot; &quot;SKEW&quot;@&quot;SEL$1&quot; (&quot;SKEW&quot;.&quot;COL1&quot;))]',
 16  q'[END_OUTLINE_DATA]');
 17  :signature := DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt);
 18  DBMS_SQLTUNE.IMPORT_SQL_PROFILE (
 19  sql_text    =&gt; sql_txt,
 20  profile     =&gt; h,
 21  name        =&gt; 'coe_abwg9nwg8prsj_3723858078',
 22  description =&gt; 'coe abwg9nwg8prsj 3723858078 '||:signature||'',
 23  category    =&gt; 'DEFAULT',
 24  validate    =&gt; TRUE,
 25  replace     =&gt; TRUE,
 26  force_match =&gt; FALSE /* TRUE:FORCE (match even when different literals in SQL). FALSE:EXACT (similar to CURSOR_SHARING) */ );
 27  END;
 28  /
&nbsp;
PL/SQL procedure successfully completed.
&nbsp;
SQL&gt;WHENEVER SQLERROR CONTINUE
SQL&gt;SET ECHO OFF;
&nbsp;
            SIGNATURE
---------------------
 15022055147995020558
&nbsp;
&nbsp;
... manual custom SQL Profile has been created
&nbsp;
&nbsp;
COE_XFR_SQL_PROFILE_abwg9nwg8prsj_3723858078 completed
&nbsp;
SYS@LAB112&gt; @sql_profiles
Enter value for sql_text: 
Enter value for name: 
&nbsp;
NAME                           CATEGORY        STATUS   SQL_TEXT                                                               FORCE
------------------------------ --------------- -------- ---------------------------------------------------------------------- -----
PROFILE_fgn6qzrvrjgnz          DEFAULT         DISABLED select /*+ index(a SKEW_COL1) */ avg(pk_col) from kso.skew a           NO
PROFILE_8hjn3vxrykmpf          DEFAULT         DISABLED select /*+ invalid_hint (doda) */ avg(pk_col) from kso.skew where col1 NO
PROFILE_69k5bhm12sz98          DEFAULT         DISABLED SELECT dbin.instance_number,        dbin.db_name, dbin.instance_name,  NO
PROFILE_8js5bhfc668rp          DEFAULT         DISABLED select /*+ index(a SKEW_COL2_COL1) */ avg(pk_col) from kso.skew a wher NO
PROFILE_bxd77v75nynd8          DEFAULT         DISABLED select /*+ parallel (a 4) */ avg(pk_col) from kso.skew a where col1 &gt;  NO
PROFILE_7ng34ruy5awxq          DEFAULT         DISABLED select i.obj#,i.ts#,i.file#,i.block#,i.intcols,i.type#,i.flags,i.prope NO
SYS_SQLPROF_0126f1743c7d0005   SAVED           ENABLED  select avg(pk_col) from kso.skew                                       NO
PROF_6kymwy3guu5uq_1388734953  DEFAULT         ENABLED  select 1                                                               YES
PROFILE_cnpx9s9na938m_MANUAL   DEFAULT         ENABLED  select /*+ opt_param('statistics_level','all') */ * from kso.skew wher NO
PROF_79m8gs9wz3ndj_3723858078  DEFAULT         ENABLED  /* SQL Analyze(252,1) */ select avg(pk_col) from kso.skew              NO
PROFILE_9ywuaagwscbj7_GPS      DEFAULT         ENABLED  select avg(pk_col) from kso.skew                                       NO
PROF_arcvrg5na75sw_3723858078  DEFAULT         ENABLED  select /*+ index(skew@sel$1 skew_col1) */ avg(pk_col) from kso.skew wh NO
SYS_SQLPROF_01274114fc2b0006   DEFAULT         ENABLED  select i.table_owner, i.table_name, i.index_name, FUNCIDX_STATUS, colu NO
SYS_SQLPROF_0127d10ffaa60000   DEFAULT         ENABLED  select table_owner||'.'||table_name tname , index_name, index_type, st NO
SYS_SQLPROF_01281e513ace0000   DEFAULT         ENABLED  SELECT TASK_LIST.TASK_ID FROM (SELECT /*+ NO_MERGE(T) ORDERED */ T.TAS NO
PROFILE_5bgcrdwfhbc83_EXACT    DEFAULT         ENABLED  select avg(pk_col) from kso.skew where col1 = :&quot;SYS_B_0&quot;               YES
coe_abwg9nwg8prsj_3723858078   DEFAULT         ENABLED                                                                         NO
&nbsp;
17 rows selected.
&nbsp;
SYS@LAB112&gt; -- that's interesting - looks like the sql_text has gotten wiped out
SYS@LAB112&gt; -- let's see if it works anyway
SYS@LAB112&gt; 
SYS@LAB112&gt; select avg(pk_col) from kso.skew where col1 = 136135;
&nbsp;
AVG(PK_COL)
-----------
   15636135
&nbsp;
SYS@LAB112&gt; @fs
Enter value for sql_text: select avg(pk_col) from kso.skew where col1 = 136135
Enter value for sql_id: 
&nbsp;
SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO SQL_TEXT
------------- ------ ---------- ---------- ------------- ------------ ------------------------------------------------------------
abwg9nwg8prsj      0 3723858078          1           .02           47 select avg(pk_col) from kso.skew where col1 = 136135
&nbsp;
1 row selected.
&nbsp;
SYS@LAB112&gt; @dplan
Enter value for sql_id: abwg9nwg8prsj
Enter value for child_no: 
&nbsp;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  abwg9nwg8prsj, child number 0
-------------------------------------
select avg(pk_col) from kso.skew where col1 = 136135
&nbsp;
Plan hash value: 3723858078
&nbsp;
------------------------------------------------------------------------------------------
| Id  | Operation                    | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |           |       |       |    32 (100)|          |
|   1 |  SORT AGGREGATE              |           |     1 |    24 |            |          |
|   2 |   TABLE ACCESS BY INDEX ROWID| SKEW      |    32 |   768 |    32   (0)| 00:00:01 |
|*  3 |    INDEX RANGE SCAN          | SKEW_COL1 |    32 |       |     3   (0)| 00:00:01 |
------------------------------------------------------------------------------------------
&nbsp;
Predicate Information (identified by operation id):
---------------------------------------------------
&nbsp;
   3 - access(&quot;COL1&quot;=136135)
&nbsp;
Note
-----
   - SQL profile coe_abwg9nwg8prsj_3723858078 used for this statement
&nbsp;
&nbsp;
24 rows selected.</pre></td></tr></table></div>

<p>So it is very similar to my <a href="http://kerryosborne.oracle-guy.com/scripts/create_sql_profile.sql" >create_sql_profile.sql</a> script. The Oracle COE script does have the advantage of creating an output script that can be run to create the SQL Profile. That means you have a chance to edit the hints before creating the SQL Profile. It also means you can easily move a SQL Profile from one environment (TEST for example) to another (PROD for example). </p>
<p>But the best thing about it is that I no longer have to be concerned about using an undocumented procedure to do something that it may not have been intended to do in the first place!</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/07/sqlt-coe_xfr_sql_profilesql/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Writing Some Chapters in a Book</title>
		<link>http://kerryosborne.oracle-guy.com/2010/07/writing-some-chapters-in-a-book/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/07/writing-some-chapters-in-a-book/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 01:49:27 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[Writing]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2480</guid>
		<description><![CDATA[My friend Karen Morton asked if I would be willing to contribute to a book that she is working on (i.e. write a few chapters). Of course I said yes. The book&#8217;s title is Pro Oracle SQL and it is to be published by Apress sometime before the end of the year (my first deadline [...]]]></description>
			<content:encoded><![CDATA[<p>My friend <a href="http://karenmorton.blogspot.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/karenmorton.blogspot.com');">Karen Morton</a> asked if I would be willing to contribute to a book that she is working on (i.e. write a few chapters). Of course I said yes. The book&#8217;s title is <em><a href="http://apress.com/book/view/9781430232285" onclick="javascript:pageTracker._trackPageview('/outbound/article/apress.com');">Pro Oracle SQL</a></em> and it is to be published by <a href="http://apress.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/apress.com');">Apress</a> sometime before the end of the year (my first deadline is fast approaching).</p>
<p style="text-align: center;"><a href="http://apress.com/book/view/9781430232285" onclick="javascript:pageTracker._trackPageview('/outbound/article/apress.com');"><img class="size-full wp-image-2523 aligncenter" title="pro-oracle-sql" src="http://kerryosborne.oracle-guy.com/files/2010/06/pro-oracle-sql.gif" alt="" width="185" height="244" /></a></p>
<p style="text-align: center;">
<p style="text-align: left;">
<p style="text-align: left;">Karen is the lead author, but there are also several co-authors involved in this project, all of whom I have a lot of respect for. Here&#8217;s the List (in alphabetical order by last name):</p>
<p style="text-align: center;"><a href="http://adhdocddba.blogspot.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/adhdocddba.blogspot.com');">Robyn Sands</a><br />
<a href="http://orainternals.wordpress.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/orainternals.wordpress.com');">Riyaj Shamsudeen</a><br />
<a href="http://jkstill.blogspot.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/jkstill.blogspot.com');">Jared Still </a></p>
<p>If you&#8217;re reading this you are probably already familiar with Apress. They have published a number of Oracle books by notable authors including Tom Kyte, Jonathan Lewis and Chris Antognini. They have also published a few collaborations by members of the Oak Table Network. So I am happy to be  joining that illustrious group.  Anyway, I am particularly excited about getting to write the chapter on <em>Plan Stability and Control</em> which is a subject near and dear to my heart. So I&#8217;ll get to drone on about Outlines, Profiles, and Baselines - among other things. You can <a href="http://www.amazon.com/Pro-Oracle-SQL-Karen-Morton/dp/1430232285/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1278891433&amp;sr=8-1-spell" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.amazon.com');">pre-order the book from Amazon</a>. ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/07/writing-some-chapters-in-a-book/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Exadata and Parallel Queuing</title>
		<link>http://kerryosborne.oracle-guy.com/2010/07/exadata-and-parallel-queuing/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/07/exadata-and-parallel-queuing/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 03:31:08 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[11gR2]]></category>

		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2570</guid>
		<description><![CDATA[Over the years Oracle has added many enhancements in order to allow individual SQL statements to take full advantage of multiprocessor computers. A few months ago Cary Millsap did a talk where he recalled the presentation Larry Ellison did when Oracle first announced the Parallel Query feature. During Larry&#8217;s demo he had a multiprocessor computer [...]]]></description>
			<content:encoded><![CDATA[<p>Over the years Oracle has added many enhancements in order to allow individual SQL statements to take full advantage of multiprocessor computers. A few months ago <a href="http://carymillsap.blogspot.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/carymillsap.blogspot.com');">Cary Millsap</a> did a talk where he recalled the presentation <a href="http://en.wikipedia.org/wiki/Larry_Ellison" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');">Larry Ellison</a> did when Oracle first announced the Parallel Query feature. During Larry&#8217;s demo he had a multiprocessor computer all to himself. I don&#8217;t remember how many processors it had, but I remember he had some kind of graphic showing individual CPU utilization on one screen while he fired up a parallel query on another screen. The monitoring screen lit up like a Christmas tree. Every one of the CPU&#8217;s was pegged during his demo. When Cary was telling the story he said that he had wondered at the time what would have happened if there had been other users on the system during the demo. Their experience would probably not have been a good one. I remember having the exact same thought. </p>
<p>Oracle&#8217;s parallel capabilities have been a great gift but they have also been a curse because controlling the beast in an environment where there are multiple users trying to share the resources is pretty difficult. There have been many attempts at coming up with a reasonable way of throttling big parallel statements along the way. But to date, I think this technology has only been used effectively in batch processing environments and large data warehouses where consuming the whole machine&#8217;s resources is acceptable due to the relatively low degree of concurrency required by those environments. </p>
<p>So why did I mention Exadata in the title of this post? Well I believe that one of the most promising aspects of Exadata is it&#8217;s potential with regard to running mixed work loads (OLTP and DW) on the same database, without crippling one or the other. In order to do that, Oracle needs some mechanism to separate the workloads. Resource Manager is an option in this area, but it doesn&#8217;t go far enough in controlling throughput on parallel queries. This new queuing mechanism should be a great help in that regard. So let&#8217;s review the options:</p>
<p><strong>Parallel Adaptive Multi User (the old way)</strong><br />
This ability to automatically downgrade the degree of parallelism based on what&#8217;s happening on the system when a query kicks off is actually a powerful mechanism and is the best approach we&#8217;ve had prior to 11g Release 2. The downside of this approach is that parallelized statements can have wildly varying execution times. As you can imagine, a statement that gets 32 slaves one time and then gets downgraded to serial execution the next time will probably not make the user very happy. The argument for this type of approach is that stuff is going to run slower if the system is busy regardless of what you do. And that users expect it to run slower when the system is busy. The first part of that statement may be true but I don&#8217;t believe the second part is (at least in most cases). The bigger problem with the downgrade mechanism though is that the the decision about how many slaves to use is based on a single point in time (the point when the parallel statement starts). And once the degree of parallelism (DOP) is set for a statement it can not be changed. That execution of the statement will run with the number of slaves it got to start with, even if additional resources become available. So consider the statement that takes a minute with 32 slaves that gets downgraded to serial due to a momentarily high load. And say that 10 seconds after it starts the system load drops back to more normal levels. Unfortunately, the serialized statement will continue to run for nearly 30 minutes with it&#8217;s single process, even though on average the system is not busier than usual. </p>
<p><strong>Parallel Queuing (the new way)</strong><br />
Now let&#8217;s compare that with the new mechanism introduced in 11gR2 that allows parallel statements to be queued in a First In - First Out fashion. This mechanism separates (presumably) long running parallel queries from the rest of the workload. The mechanics are pretty simple. Turn the feature on. Set a target number of parallel slaves (parallel_servers_target). Run stuff. If a statement tries to start that requires exceeding the target, it will be queued until the required number of slaves become available.</p>
<p>The Parallel Queuing feature is controlled by a hidden parameter called &#8220;_parallel_statement_queuing&#8221;. A value of TRUE turns it on and FALSE turns it off. FALSE is the default by the way. This parameter is not documented but is set automatically when the PARALLEL_DEGREE_POLICY parameter is set to AUTO. Unfortunately, PARALLEL_DEGREE_POLICY is one of those parameters that controls more than one thing. When set to AUTO it also turns on Automatic DOP calculation. This feature calculates a DOP for each statement regardless of whether any objects have been decorated with a parallel setting. The result is that all kinds of statements are run in parallel, even if no objects have been specifically defined with a parallel degree setting. This is truly automatic parallel processing because the database decides what to run in parallel and with how many slaves. On top of that, by default, the slaves may be spread across multiple nodes in a RAC database (this can be disabled by setting PARALLEL_FORCE_LOCAL to TRUE). Finally, AUTO is supposed to enable &#8220;In Memory Parallel Query&#8221;. This poorly named feature refers to 11gR2&#8217;s ability to make use of the SGA for parallel query, as opposed to using direct reads exclusively. Note: I haven&#8217;t actually seen this kick in yet, which is probably good, since Exadata Offloading depends on direct reads. I haven&#8217;t seen it kick in on non-Exadata databases either though.</p>
<p>Unfortunately this combination of features is a little like the wild west with things running in parallel all over the place. But the ability to queue parallel statements does provide some semblance of order.  And to be fair, there are a number of parameters that can be set to control how the calculations are performed. Anyway, here&#8217;s a brief synopsis of parameter changes caused by the various settings PARALLEL_DEGREE_POLICY.</p>
<p><span id="more-2570"></span></p>
<ol>
<table border="3" cellspacing="3" cellpadding="3" width="600">
<caption>Parameters Affected by Parallel_Degree_Policy</caption>
<tbody>
<tr>
<td>Parallel_Degree_Policy</td>
<td>Parameter</td>
<td>Value</td>
</tr>
<tr>
<td>MANUAL</td>
<td>_parallel_statement_queuing</td>
<td>FALSE</td>
</tr>
<tr>
<td> </td>
<td>_parallel_cluster_cache_policy</td>
<td>ADAPTIVE</td>
</tr>
<tr>
<td>LIMITED</td>
<td>_parallel_statement_queuing</td>
<td>FALSE</td>
</tr>
<tr>
<td> </td>
<td>_parallel_cluster_cache_policy</td>
<td>ADAPTIVE</td>
</tr>
<tr>
<td>AUTO</td>
<td>_parallel_statement_queuing</td>
<td>TRUE</td>
</tr>
<tr>
<td> </td>
<td>_parallel_cluster_cache_policy</td>
<td>CACHED</td>
</tr>
</tbody>
</table>
</ol>
<p>So let&#8217;s look at how it behaves:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2570code9'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p25709"><td class="code" id="p2570code9"><pre class="none" style="font-family:monospace;">-bash-3.2$ !sql
sqlplus / as sysdba
&nbsp;
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jul 5 13:10:26 2010
&nbsp;
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
&nbsp;
&nbsp;
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
&nbsp;
EXADATA&gt; @parms 
Enter value for parameter: parallel
Enter value for isset: 
Enter value for show_hidden: 
&nbsp;
NAME                                               VALUE                                                                  ISDEFAUL ISMODIFIED ISSET
-------------------------------------------------- ---------------------------------------------------------------------- -------- ---------- ----------
fast_start_parallel_rollback                       LOW                                                                    TRUE     FALSE      FALSE
parallel_adaptive_multi_user                       TRUE                                                                   TRUE     FALSE      FALSE
parallel_automatic_tuning                          FALSE                                                                  TRUE     FALSE      FALSE
parallel_degree_limit                              CPU                                                                    TRUE     FALSE      FALSE
parallel_degree_policy                             AUTO                                                                   TRUE     TRUE       TRUE
parallel_execution_message_size                    16384                                                                  TRUE     FALSE      FALSE
parallel_force_local                               FALSE                                                                  TRUE     FALSE      FALSE
parallel_instance_group                                                                                                   TRUE     FALSE      FALSE
parallel_io_cap_enabled                            FALSE                                                                  TRUE     FALSE      FALSE
parallel_max_servers                               160                                                                    TRUE     FALSE      FALSE
parallel_min_percent                               0                                                                      TRUE     FALSE      FALSE
parallel_min_servers                               0                                                                      TRUE     FALSE      FALSE
parallel_min_time_threshold                        AUTO                                                                   TRUE     FALSE      FALSE
parallel_server                                    TRUE                                                                   TRUE     FALSE      FALSE
parallel_server_instances                          2                                                                      TRUE     FALSE      FALSE
parallel_servers_target                            64                                                                     TRUE     FALSE      FALSE
parallel_threads_per_cpu                           2                                                                      TRUE     FALSE      FALSE
recovery_parallelism                               0                                                                      TRUE     FALSE      FALSE
&nbsp;
18 rows selected.
&nbsp;
EXADATA&gt; select owner, table_name, degree from dba_tables where table_name = 'SKEW';
&nbsp;
OWNER      TABLE_NAME                     DEGREE
---------- ------------------------------ ------
KSO        SKEW                                1
&nbsp;
EXADATA&gt; set echo on
EXADATA&gt; @avgskew
EXADATA&gt; select avg(pk_col) from kso.skew a where col1 &gt; 0
  2  /
&nbsp;
AVG(PK_COL)
-----------
 16093749.3
&nbsp;
EXADATA&gt; @fs
Enter value for sql_text: select avg(pk_col) from kso.skew a where col1 &gt; 0
Enter value for sql_id: 
&nbsp;
SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO SQL_TEXT
------------- ------ ---------- ---------- ------------- ------------ ------------------------------------------------------------
05cq2hb1r37tr      0  568322376          1         28.77      162,427 select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
1 row selected.
&nbsp;
EXADATA&gt; @dplan
Enter value for sql_id: 05cq2hb1r37tr
Enter value for child_no: 
&nbsp;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  05cq2hb1r37tr, child number 0
-------------------------------------
select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
Plan hash value: 568322376
&nbsp;
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       | 28420 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |    24 |            |          |
|*  2 |   TABLE ACCESS FULL| SKEW |    32M|   732M| 28420   (2)| 00:05:42 |
---------------------------------------------------------------------------
&nbsp;
Predicate Information (identified by operation id):
---------------------------------------------------
&nbsp;
   2 - filter(&quot;COL1&quot;&gt;0)
&nbsp;
&nbsp;
19 rows selected.
&nbsp;
EXADATA&gt; alter system set parallel_degree_policy=auto;
&nbsp;
System altered.
&nbsp;
EXADATA&gt; @avgskew
&nbsp;
AVG(PK_COL)
-----------
 16093749.3
&nbsp;
1 row selected.
&nbsp;
EXADATA&gt; @fs
Enter value for sql_text: 
Enter value for sql_id: 05cq2hb1r37tr
&nbsp;
SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO SQL_TEXT
------------- ------ ---------- ---------- ------------- ------------ ------------------------------------------------------------
05cq2hb1r37tr      0  568322376          1         28.77      162,427 select avg(pk_col) from kso.skew a where col1 &gt; 0
05cq2hb1r37tr      2  578366071          1         40.33      162,437 select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
2 rows selected.
&nbsp;
EXADATA&gt; @dplan
Enter value for sql_id: 05cq2hb1r37tr
Enter value for child_no: 2
&nbsp;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  05cq2hb1r37tr, child number 2
-------------------------------------
select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
Plan hash value: 578366071
&nbsp;
----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |       |       |  6308 (100)|          |        |      |            |
|   1 |  SORT AGGREGATE        |          |     1 |    24 |            |          |        |      |            |
|   2 |   PX COORDINATOR       |          |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000 |     1 |    24 |            |          |  Q1,00 | P-&gt;S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |          |     1 |    24 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |          |    32M|   732M|  6308   (1)| 00:01:16 |  Q1,00 | PCWC |            |
|*  6 |       TABLE ACCESS FULL| SKEW     |    32M|   732M|  6308   (1)| 00:01:16 |  Q1,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------
&nbsp;
Predicate Information (identified by operation id):
---------------------------------------------------
&nbsp;
   6 - access(:Z&gt;=:Z AND :Z&lt;=:Z)
       filter(&quot;COL1&quot;&gt;0)
&nbsp;
Note
-----
   - automatic DOP: Computed Degree of Parallelism is 5
&nbsp;
&nbsp;
28 rows selected.
&nbsp;
EXADATA&gt; alter system set parallel_degree_policy=auto;
&nbsp;
System altered.
&nbsp;
EXADATA&gt; !ss.sh avgskew.sql 20 kso/kso
&nbsp;
starting 20 copies of avgskew.sql
&nbsp;
EXADATA&gt; set echo on
EXADATA&gt; @queued_sql
EXADATA&gt; col sql_text for a60 trunc
EXADATA&gt; SELECT sid, sql_id, sql_exec_id, sql_text
  2  from v$sql_monitor
  3  WHERE status='QUEUED'
  4  order by 3
  5  /
&nbsp;
 SID SQL_ID        SQL_EXEC_ID SQL_TEXT
---- ------------- ----------- ------------------------------------------------------------
 293 05cq2hb1r37tr    16777265 select avg(pk_col) from kso.skew a where col1 &gt; 0
 270 05cq2hb1r37tr    16777266 select avg(pk_col) from kso.skew a where col1 &gt; 0
   7 05cq2hb1r37tr    16777267 select avg(pk_col) from kso.skew a where col1 &gt; 0
  22 05cq2hb1r37tr    16777268 select avg(pk_col) from kso.skew a where col1 &gt; 0
  42 05cq2hb1r37tr    16777269 select avg(pk_col) from kso.skew a where col1 &gt; 0
 101 05cq2hb1r37tr    16777270 select avg(pk_col) from kso.skew a where col1 &gt; 0
  78 05cq2hb1r37tr    16777271 select avg(pk_col) from kso.skew a where col1 &gt; 0
  60 05cq2hb1r37tr    16777272 select avg(pk_col) from kso.skew a where col1 &gt; 0
 118 05cq2hb1r37tr    16777273 select avg(pk_col) from kso.skew a where col1 &gt; 0
 160 05cq2hb1r37tr    16777274 select avg(pk_col) from kso.skew a where col1 &gt; 0
 137 05cq2hb1r37tr    16777275 select avg(pk_col) from kso.skew a where col1 &gt; 0
 181 05cq2hb1r37tr    16777276 select avg(pk_col) from kso.skew a where col1 &gt; 0
 199 05cq2hb1r37tr    16777277 select avg(pk_col) from kso.skew a where col1 &gt; 0
 216 05cq2hb1r37tr    16777278 select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
14 rows selected.
&nbsp;
EXADATA&gt; -- using Tanel Poder's snapper - 
EXADATA&gt; @snapper ash=sid+event+wait_class,ash1=plsql_object_id+plsql_subprogram_id+sql_id 5 1 all
Sampling with interval 5 seconds, 1 times...
&nbsp;
-- Session Snapper v3.11 by Tanel Poder @ E2SN ( http://tech.e2sn.com )
&nbsp;
&nbsp;
--------------------------------------------------------------
Active% |    SID | EVENT                     | WAIT_CLASS
--------------------------------------------------------------
   100% |    118 | enq: JX - SQL statement q | Scheduler
   100% |    216 | enq: JX - SQL statement q | Scheduler
   100% |     78 | enq: JX - SQL statement q | Scheduler
   100% |     63 | enq: JX - SQL statement q | Scheduler
   100% |    233 | enq: JX - SQL statement q | Scheduler
   100% |    199 | enq: JX - SQL statement q | Scheduler
   100% |    137 | enq: JX - SQL statement q | Scheduler
   100% |     96 | enq: JX - SQL statement q | Scheduler
   100% |    101 | enq: JX - SQL statement q | Scheduler
   100% |     27 | enq: JX - SQL statement q | Scheduler
&nbsp;
---------------------------------------------------
Active% | PLSQL_OBJE | PLSQL_SUBP | SQL_ID
---------------------------------------------------
  2095% |            |            | 05cq2hb1r37tr
     3% |            |            |
&nbsp;
--  End of ASH snap 1, end=2010-07-04 20:18:05, seconds=5, samples_taken=39
&nbsp;
&nbsp;
PL/SQL procedure successfully completed.</pre></td></tr></table></div>

<p>There are several things worth mentioning in this example. First we see that with PARALLEL_DEGREE_POLICY set to it&#8217;s default value of MANUAL, my avgskew.sql script runs a serial plan. Second we see that when we set PARALLEL_DEGREE_POLICY to AUTO, the statement is automatically parallelized. Notice the note at the bottom of the plan output and you see that Automatic DOP was set at 5. Magical! I then used a shell script (ss.sh) to fire off 20 copies of the avgskew.sql script in rapid succession. Querying V$SQL_MONITOR showed that the statements were indeed queuing. Finally, I ran Tanel Poder&#8217;s <a href="http://tech.e2sn.com/oracle-scripts-and-tools/session-snapper" onclick="javascript:pageTracker._trackPageview('/outbound/article/tech.e2sn.com');">snapper</a> to see what event the queued statements were waiting on. Turns out it was &#8220;enq: JX - SQL statement queue&#8221;. Note that there is also an event called &#8220;PX Queuing: statement queue&#8221; that we didn&#8217;t see in the snapper output. I&#8217;m not exactly sure why Oracle split these two events apart, but apparently &#8220;PX Queuing: statement queue&#8221; is the event that clocks time when a statement is next in line, while &#8220;enq: JX - SQL statement queue&#8221; is used when a statement is in the queue but not the next one up. Guy Harrison has a really good post on the parallel_degree_policy that covers these two events <a href="http://guyharrison.squarespace.com/blog/2009/9/7/the-parallel_degree_policy-parameter-in-11gr2.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/guyharrison.squarespace.com');">here</a>.</p>
<p>Oracle has provided some control over the Automatic DOP calculations as well with the PARALLEL_DEGREE_LIMIT parameter. The default value for this parameter is CPU which comes up with an &#8220;Ideal DOP&#8221; based on the amount of data, but then caps it with a formula based on CPU_COUNT, THREADS_PER_CPU and ACTIVE_INSTANCE_COUNT. There is a good description in this an Oracle white paper <a href="http://www.oracle.com/technology/products/bi/db/11g/pdf/twp_parallel_execution_fundamentals_11gr2.pdf" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.oracle.com');">Parallel Execution Fundamentals</a> that covers this calculation.</p>
<p>Of course, automatic DOP calculations are still a little scary. So it&#8217;s nice that there is a way to turn on the Parallel Queuing feature without enabling the Automatic DOP. Here&#8217;s another quick example showing that Queuing can be turned on without the other features:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2570code10'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p257010"><td class="code" id="p2570code10"><pre class="none" style="font-family:monospace;">EXADATA&gt; alter system set parallel_degree_policy=manual;
&nbsp;
System altered.
&nbsp;
EXADATA&gt; @flush_pool
&nbsp;
System altered.
&nbsp;
EXADATA&gt; @avgskew
&nbsp;
AVG(PK_COL)
-----------
 16093749.3
&nbsp;
EXADATA&gt; @fs
Enter value for sql_text: %avg%kso.skew%
Enter value for sql_id: 
&nbsp;
SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO SQL_TEXT
------------- ------ ---------- ---------- ------------- ------------ ------------------------------------------------------------
05cq2hb1r37tr      0  568322376          1         10.92      162,496 select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
1 row selected.
&nbsp;
EXADATA&gt; @dplan
Enter value for sql_id: 05cq2hb1r37tr
Enter value for child_no: 
&nbsp;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  05cq2hb1r37tr, child number 0
-------------------------------------
select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
Plan hash value: 568322376
&nbsp;
---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |       |       | 28420 (100)|          |
|   1 |  SORT AGGREGATE    |      |     1 |    24 |            |          |
|*  2 |   TABLE ACCESS FULL| SKEW |    32M|   732M| 28420   (2)| 00:05:42 |
---------------------------------------------------------------------------
&nbsp;
Predicate Information (identified by operation id):
---------------------------------------------------
&nbsp;
   2 - filter(&quot;COL1&quot;&gt;0)
&nbsp;
&nbsp;
19 rows selected.
&nbsp;
EXADATA&gt; -- so with MANUAL - the DOP is not set automatically
EXADATA&gt; -- let's set the table to have a parallel degree
EXADATA&gt;
EXADATA&gt; alter table kso.skew parallel (degree 6);
&nbsp;
Table altered.
&nbsp;
EXADATA&gt; @avgskew
&nbsp;
AVG(PK_COL)
-----------
 16093749.3
&nbsp;
1 row selected.
&nbsp;
EXADATA&gt; @fs
Enter value for sql_text: 
Enter value for sql_id: 05cq2hb1r37tr
&nbsp;
SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO SQL_TEXT
------------- ------ ---------- ---------- ------------- ------------ ------------------------------------------------------------
05cq2hb1r37tr      0  578366071          1         13.93      142,437 select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
1 row selected.
&nbsp;
EXADATA&gt; @dplan
Enter value for sql_id: 05cq2hb1r37tr
Enter value for child_no: 
&nbsp;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  05cq2hb1r37tr, child number 0
-------------------------------------
select avg(pk_col) from kso.skew a where col1 &gt; 0
&nbsp;
Plan hash value: 578366071
&nbsp;
----------------------------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |          |       |       |  5256 (100)|          |        |      |            |
|   1 |  SORT AGGREGATE        |          |     1 |    24 |            |          |        |      |            |
|   2 |   PX COORDINATOR       |          |       |       |            |          |        |      |            |
|   3 |    PX SEND QC (RANDOM) | :TQ10000 |     1 |    24 |            |          |  Q1,00 | P-&gt;S | QC (RAND)  |
|   4 |     SORT AGGREGATE     |          |     1 |    24 |            |          |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR |          |    32M|   732M|  5256   (1)| 00:01:04 |  Q1,00 | PCWC |            |
|*  6 |       TABLE ACCESS FULL| SKEW     |    32M|   732M|  5256   (1)| 00:01:04 |  Q1,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------
&nbsp;
Predicate Information (identified by operation id):
---------------------------------------------------
&nbsp;
   6 - access(:Z&gt;=:Z AND :Z&lt;=:Z)
       filter(&quot;COL1&quot;&gt;0)
&nbsp;
&nbsp;
24 rows selected.
&nbsp;
EXADATA&gt;  !ss.sh avgskew.sql 20 kso/kso
&nbsp;
starting 20 copies of avgskew.sql
&nbsp;
EXADATA&gt; @queued_sql
&nbsp;
no rows selected
&nbsp;
EXADATA&gt; -- so now it's parallel but only objects or statements that we define as parallel
EXADATA&gt; -- but no queuing, let's turn on queuing
EXADATA&gt;
EXADATA&gt; alter system set &quot;_parallel_statement_queuing&quot;=true;
&nbsp;
System altered.
&nbsp;
EXADATA&gt; !ss.sh avgskew.sql 20 kso/kso
&nbsp;
starting 20 copies of avgskew.sql 
&nbsp;
EXADATA&gt; @queued_sql
&nbsp;
 SID SQL_ID        SQL_EXEC_ID SQL_TEXT
---- ------------- ----------- ------------------------------------------------------------
 181 05cq2hb1r37tr    16777363 select avg(pk_col) from kso.skew a where col1 &gt; 0
 216                  16777364
  44                  16777365
 273                  16777366
 234                  16777367
 160                  16777368
 100                  16777369
 233                  16777370
  30                  16777371
 138                  16777372
   7                  16777373
 293                  16777374
 137                  16777375
  83                  16777376
 251                  16777377
  66                  16777378
 123                  16777379
 195                  16777380
&nbsp;
18 rows selected.
&nbsp;
EXADATA&gt; -- now we have control of which statements are parallelized and we have queuing</pre></td></tr></table></div>

<p>This example shows that you can have Parallel Queuing without turning on Automatic DOP. Of course it&#8217;s using a hidden parameter, so don&#8217;t do this without checking with your mother first (I mean Oracle support). Maybe they will make this a real parameter in a future release (one can only hope). Note that there are hints to turn this feature on and off on a statement level as well (STATEMENT_QUEUING and NO_STATEMENT_QUEUING).  </p>
<p>So why did I mention Exadata again? Mixed workloads require a mechanism that forces parallel queries to play nicely with others. (kind of like kindergarten) Parallel Queuing provides a relatively simple mechanism for doing just that. I also mentioned Resource Manager (RM) in passing. That&#8217;s another option at our disposal. It does have the ability to curb parallel processing as well and it&#8217;s enabled by default in 11gR2. RM, along with it&#8217;s kissing cousin IORM, are key components in consolidation strategies on Exadata as well.  But we&#8217;ll have to leave that for another post. Some much to do and so little time.</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/07/exadata-and-parallel-queuing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Exadata Offload - The Secret Sauce</title>
		<link>http://kerryosborne.oracle-guy.com/2010/06/exadata-offload-the-secret-sauce/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/06/exadata-offload-the-secret-sauce/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 04:12:10 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[11gR2]]></category>

		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2531</guid>
		<description><![CDATA[The &#8220;Secret Sauce&#8221; for Exadata is it&#8217;s ability to offload processing to the storage tier. Offloading means that the storage servers can apply predicate filters at the storage layer, instead of shipping every possible block back to the database server(s). Another thing that happens with offloading is that the volume of data returned can be [...]]]></description>
			<content:encoded><![CDATA[<p>The &#8220;Secret Sauce&#8221; for Exadata is it&#8217;s ability to offload processing to the storage tier. Offloading means that the storage servers can apply predicate filters at the storage layer, instead of shipping every possible block back to the database server(s). Another thing that happens with offloading is that the volume of data returned can be further reduced by column projection (i.e. if you only select 1 column from a 100 column table, there is no need to return the other 99 columns). Offloading is geared to long running queries that access a large amount of data. Offloading only works if the Oracle decides to use it&#8217;s direct path read mechanism. Direct path reads have traditionally been done by parallel query slaves but can also be done by serial queries. In fact, as of 11g, Oracle has changed the decision making process resulting in more aggressive use of serial direct path reads. I&#8217;ve seen this feature described as &#8220;serial direct path reads&#8221; and &#8220;adaptive direct path reads&#8221;.</p>
<p>I&#8217;ll digress here a bit to discuss this feature since direct path reads are critical to Exadata Offloading. Direct path reads do not load blocks into Oracle&#8217;s buffer cache. Instead, the data is returned directly to the PGA of the process requesting the data. This means that the data does not have to be in Oracle block format. That means no 8K block that is only partially filled, that may only have a record or two that you&#8217;re interested in, containing every column including ones you don&#8217;t want, and with additional header information - needs to be shipped back up from the storage layer. Instead, a much more compact result set containing only the columns requested and hopefully only the rows you need are returned. As I said, direct path reads are traditionally used by parallel query slaves. They are also used in a few other instances such as LOB access and sorts that spill over into TEMP. So the ability to use direct path reads is very important to the Exadata platform and thus the changes to the make them more attractive in 11g. Here are a few links to info on the subject of serial direct path reads:</p>
<ol>
<li>Doug Burns has a good post on <a href="http://oracledoug.com/serendipity/index.php?/archives/1321-11g-and-direct-path-reads.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/oracledoug.com');">11g serial direct path reads</a>.</li>
<li>Alex Fatkulin has a very good post on some of the factors controlling <a href="http://afatkulin.blogspot.com/2009/01/11g-adaptive-direct-path-reads-what-is.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/afatkulin.blogspot.com');">adaptive direct path reads</a>.</li>
<li>There is a note on MOS (<a href="https://support.oracle.com/CSP/ui/flash.html#tab=KBHome%28page=KBHome&#038;id=%28%29%29,%28page=KBNavigator&#038;id=%28bmDocID=793845.1&#038;viewingMode=1143&#038;bmDocTitle=High%20%27direct%20path%20read%27%20waits%20in%2011g&#038;from=BOOKMARK&#038;bmDocDsrc=KB&#038;bmDocType=PROBLEM%29%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/support.oracle.com');">793845.1</a>) on changes in 11g in the heuristics to choose between direct path reads or reads through the buffer cache.</li>
<li>You may also find MOS note (<a href="https://support.oracle.com/CSP/ui/flash.html#tab=KBHome%28page=KBHome&amp;id=%28%29%29,%28page=KBNavigator&amp;id=%28bmDocTitle=WAITEVENT:%20%22direct%20path%20read%22%20Reference%20Note&amp;bmDocDsrc=KB&amp;bmDocType=REFERENCE&amp;bmDocID=50415.1&amp;viewingMode=1143&amp;from=BOOKMARK%29%29" onclick="javascript:pageTracker._trackPageview('/outbound/article/support.oracle.com');">50415.1</a>) on misleading nature of &#8220;direct path read&#8221; wait events of interest.</li>
</ol>
<p>Also be aware that direct path reads are only available for full scans (tables or indexes). So any statement that uses an index to get to a row in a table will not use this mechanism. Also keep in mind that direct path requires extra processing to ensure that all blocks on disk are current - (i.e. a check point), so frequently modified tables will suffer some overhead before direct path reads can be initiated. </p>
<p>I must say that I think the changes to the heuristics in 11g may be a little on the aggressive side for non-Exadata platforms (the changes may well be driven by Exadata). And by the way, serial direct path reads are not always faster than the normal reads that go through the buffer cache.  Dion Cho has a good post on a <a href="http://dioncho.wordpress.com/2010/06/09/interesting-combination-of-rac-and-serial-direct-path-read/" onclick="javascript:pageTracker._trackPageview('/outbound/article/dioncho.wordpress.com');">performance problem due to serial direct path reads</a> kicking in on one node of an 11g RAC environment (not Exadata). The node doing the direct path reads was running the query much slower than the node using the normal buffer cache reads. He also has a post on <a href="http://dioncho.wordpress.com/2009/07/21/disabling-direct-path-read-for-the-serial-full-table-scan-11g/" onclick="javascript:pageTracker._trackPageview('/outbound/article/dioncho.wordpress.com');">turning off serial direct path reads</a>.</p>
<p>But enough about the direct path reads stuff, on to the Offloading. One of the first things I wanted to know when I got my first look at a system running on Exadata was whether a particular query was eligible for offloading and if so, how much of the expected i/o was saved by the feature. So of course I wrote a little script to show me that. Turns out there is plenty of info in V$SQL to see what&#8217;s going on. I called the script <a href="http://kerryosborne.oracle-guy.com/scripts/fsx.sql" >fsx.sql</a> (short for Find_Sql_eXadata). Here&#8217;s a little demo:</p>
<p><span id="more-2531"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2531code14'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p253114"><td class="code" id="p2531code14"><pre class="none" style="font-family:monospace;">SYS@LABRAT1&gt; @test_offload
SYS@LABRAT1&gt; -- ran but turned off output
SYS@LABRAT1&gt; -- select /* test full */ * from kso.skew3; 
SYS@LABRAT1&gt; 
SYS@LABRAT1&gt; select /* test count */ count(col1) from kso.skew3;
&nbsp;
COUNT(COL1)
-----------
  384000036
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:24.04
SYS@LABRAT1&gt; select /* test count(rll) */ count(pk_col), count(col1), count(col2), count(col3), count(col4) from kso.skew3;
&nbsp;
COUNT(PK_COL) COUNT(COL1) COUNT(COL2) COUNT(COL3) COUNT(COL4)
------------- ----------- ----------- ----------- -----------
    384000048   384000036   384000036   384000036   384000036
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:39.09
SYS@LABRAT1&gt; select /* test max */ max(col1) from kso.skew3;
&nbsp;
 MAX(COL1)
----------
   1000000
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:24.51
SYS@LABRAT1&gt; select /* test max all */ max(pk_col), max(col1), max(col2), max(col3), max(col4) from kso.skew3;
&nbsp;
MAX(PK_COL)  MAX(COL1) MAX(COL2)                      MAX(COL3) M
----------- ---------- ------------------------------ --------- -
 1.0000E+12    1000000 asddsadasd                     01-JAN-09 Y
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:57.32
SYS@LABRAT1&gt; select /* test avg */ avg(col1) from kso.skew3;
&nbsp;
 AVG(COL1)
----------
495000.194
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:30.00
SYS@LABRAT1&gt; select /* test avg filter */ avg(col1) from kso.skew3 where col1 between 2 and 10000;
&nbsp;
 AVG(COL1)
----------
&nbsp;
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:13.97
SYS@LABRAT1&gt; select /* test index */ avg(pk_col) from kso.skew where col1 = 136133;
&nbsp;
AVG(PK_COL)
-----------
   15636133
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:00.00
SYS@LABRAT1&gt; set echo off
SYS@LABRAT1&gt; set timing off
SYS@LABRAT1&gt; @fsx
Enter value for sql_text: % test %
Enter value for sql_id: 
Enter value for inst_id: 
&nbsp;
 INST SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO    AVG_PIO AVG_PX OFFLOADABLE IO_SAVED_% SQL_TEXT
----- ------------- ------ ---------- ---------- ------------- ------------ ---------- ------ ----------- ---------- ----------------------------------------
    1 1767x3dw3m8pa      0 2684249835          1         57.31    1,956,226  1,956,219      0 Yes               9.35 select /* test max all */ max(pk_col), m
    1 1wp72w4c5d449      0 2684249835          1         29.98    1,956,226  1,956,219      0 Yes              71.84 select /* test avg */ avg(col1) from kso
    1 46vd0hducqms8      0 1667163222          1        422.77    2,032,691  1,956,219      0 No                 .00 select /* test full */ * from kso.skew3
    1 5ry8vd8u0n0bf      0 2684249835          1         24.03    1,956,226  1,956,219      0 Yes              71.85 select /* test count */ count(col1) from
    1 6jtf4rnxu2dq7      0 2684249835          1         24.50    1,956,226  1,956,219      0 Yes              71.85 select /* test max */ max(col1) from kso
    1 8pfxs6mdf62mq      0 3723858078          1           .00           35          0      0 No                 .00 select /* test index */ avg(pk_col) from
    1 abwyftyy395gk      0 2684249835          1         13.96    1,956,226  1,956,219      0 Yes              99.99 select /* test avg filter */ avg(col1) f
    1 fxpkhxt4jwqqm      0 2684249835          1         39.08    1,956,226  1,956,219      0 Yes               9.35 select /* test count(rll) */ count(pk_co
&nbsp;
8 rows selected.</pre></td></tr></table></div>

<p>So I did several queries. Some were off-loadable and some were not. Then I ran the script to see what how the statements had been handled. There are a couple of things to note here:</p>
<ol>
<li>I used IO_CELL_OFFLOAD_ELIGIBLE_BYTES in V$SQL to indicate whether a statement can be offloaded or not.<br />
(i.e. decode(IO_CELL_OFFLOAD_ELIGIBLE_BYTES,0,&#8217;No&#8217;,'Yes&#8217;) Offloadable) Note, if you run this script on a non-Exadata 11gR2 database, all the SQL statements should show up as Offloadable=NO.</li>
<li>All the statements using the aggregate functions (max,count,avg&#8230;) are marked as off-loadable even though the functions themselves are not off-loadable. I believe that projection accounts for reduced IO (limited to columns requested) and the marking as off-loadable. Note that the statement commented &#8220;test max all&#8221; shows almost no reduction in IO (it applies the max function to each column). I&#8217;m not yet sure why there was a slight reduction in I/O even with all columns listed. And by the way, V$SQLFN_METADATA has a list of all valid functions and whether they are off-loadable or not (none of the aggregate functions are).</li>
<li>Statements selecting all columns with no where clause are not off-loadable (no filter predicate or column projection).</li>
<li>Statements using index range scans are not off-loadable (the optimizer has to pick a plan with a full scan). Check out the statement commented &#8220;test index&#8221; for an example.</li>
</ol>
<p>It is possible to turn offloading off via a parameter, CELL_OFFLOAD_PROCESSING, or via a hint. Here&#8217;s a bit of the Oracle Exadata Storage Server Software User&#8217;s Guide:</p>
<blockquote><p>The CELL_OFFLOAD_PROCESSING initialization parameter enables SQL processing offload to Exadata Cell. When the value of the parameter is set to TRUE, predicate evaluation can be offloaded to cells. The default value of the parameter is TRUE. If the parameter is set to FALSE at the session or system level, then the database performs all the predicate evaluation with cells serving blocks. You can set CELL_OFFLOAD_ PROCESSING dynamically with the SQL ALTER SYSTEM or ALTER SESSION command. For example:<br />
SQL> ALTER SESSION SET CELL_OFFLOAD_PROCESSING = TRUE;<br />
The CELL_OFFLOAD_PROCESSING parameter can also be set with the OPT_PARAM optimizer hint to enable or disable predicate filtering for a specific SQL command. For example:<br />
&#8211; to disable cell_offload_processing for a SQL command SELECT /*+ OPT_PARAM(&#8217;cell_offload_processing&#8217; &#8216;false&#8217;) */ COUNT(*) FROM EMPLOYEES;<br />
&#8211; to enable cell_offload_processing for a SQL command SELECT /*+ OPT_PARAM(&#8217;cell_offload_processing&#8217; &#8216;true&#8217;) */ COUNT(*) FROM EMPLOYEES;</p></blockquote>
<p>And a quick example:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2531code15'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p253115"><td class="code" id="p2531code15"><pre class="none" style="font-family:monospace;">SYS@LABRAT1&gt; select /* test avg filter hint */
  2  /*+ OPT_PARAM('cell_offload_processing' 'false') */
  3  avg(col1) from kso.skew3 where col1 between 2 and 10000;
&nbsp;
 AVG(COL1)
----------
&nbsp;
&nbsp;
1 row selected.
&nbsp;
SYS@LABRAT1&gt; @fsx
Enter value for sql_text: % test avg filter %
Enter value for sql_id: 
Enter value for inst_id: 
&nbsp;
 INST SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO    AVG_PIO AVG_PX OFFLOADABLE IO_SAVED_% SQL_TEXT
----- ------------- ------ ---------- ---------- ------------- ------------ ---------- ------ ----------- ---------- ----------------------------------------
    1 0nb4tjmjuq67t      0 2684249835          1        104.89    1,956,227  1,956,219      0 No                 .00 select /* test avg filter hint */ /*+ OP
    1 abwyftyy395gk      0 2684249835          1         13.96    1,956,226  1,956,219      0 Yes              99.99 select /* test avg filter */ avg(col1) f
&nbsp;
2 rows selected.</pre></td></tr></table></div>

<p>So as you can see, the hint disabled offloading and resulted in the statement taking about 10X the elapsed time of the offloaded version. </p>
<p>Now for one more example to whet your appetite for things to come:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p2531code16'); return false;">View Code</a> NONE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p253116"><td class="code" id="p2531code16"><pre class="none" style="font-family:monospace;">SYS@LABRAT1&gt; select count(*) from kso.skew3 where col1 is null;
&nbsp;
  COUNT(*)
----------
        12
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:00.08
SYS@LABRAT1&gt; @fsx
Enter value for sql_text: %col1 is null%
Enter value for sql_id: 
Enter value for inst_id: 
&nbsp;
 INST SQL_ID         CHILD  PLAN_HASH      EXECS     AVG_ETIME      AVG_LIO    AVG_PIO AVG_PX OFFLOADABLE IO_SAVED_% SQL_TEXT
----- ------------- ------ ---------- ---------- ------------- ------------ ---------- ------ ----------- ---------- ----------------------------------------
    1 0u1q4b7puqz6g      0 2684249835          1           .08    1,956,226  1,956,219      0 Yes             100.00 select count(*) from kso.skew3 where col
&nbsp;
1 row selected.
&nbsp;
Elapsed: 00:00:00.09
SYS@LABRAT1&gt; @dplan
Enter value for sql_id: 0u1q4b7puqz6g                               
Enter value for child_no: 
&nbsp;
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID  0u1q4b7puqz6g, child number 0
-------------------------------------
select count(*) from kso.skew3 where col1 is null
&nbsp;
Plan hash value: 2684249835
&nbsp;
------------------------------------------------------------------------------------
| Id  | Operation                  | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |       |       |       |   533K(100)|          |
|   1 |  SORT AGGREGATE            |       |     1 |     5 |            |          |
|*  2 |   TABLE ACCESS STORAGE FULL| SKEW3 |    12 |    60 |   533K  (1)| 01:46:38 |
------------------------------------------------------------------------------------
&nbsp;
Predicate Information (identified by operation id):
---------------------------------------------------
&nbsp;
   2 - storage(&quot;COL1&quot; IS NULL)
       filter(&quot;COL1&quot; IS NULL)
&nbsp;
&nbsp;
20 rows selected.
&nbsp;
Elapsed: 00:00:00.02</pre></td></tr></table></div>

<p>Yes that&#8217;s a full scan on a 384M row table that occupies about 2M blocks. And it took 8/100&#8217;s of a second. That&#8217;s 80 milliseconds - roughly the amount of time necessary to do 10-15 single block disk i/o&#8217;s. </p>
<p>Wow! Can you say storage index? More on that in the next installment!</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/06/exadata-offload-the-secret-sauce/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Oracle Exadata Delivery Day</title>
		<link>http://kerryosborne.oracle-guy.com/2010/05/oracle-exadata-delivery-day/</link>
		<comments>http://kerryosborne.oracle-guy.com/2010/05/oracle-exadata-delivery-day/#comments</comments>
		<pubDate>Wed, 26 May 2010 02:25:02 +0000</pubDate>
		<dc:creator>osborne</dc:creator>
		
		<category><![CDATA[Exadata]]></category>

		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://kerryosborne.oracle-guy.com/?p=2484</guid>
		<description><![CDATA[Well our new Exadata showed up this week. We had a pretty nice lab environment already. A bunch of Dell&#8217;s, some IBM&#8217;s, several Sun&#8217;s. We have a couple of EMC Sans as well (we actually threw away a whole EMC rack to make room for the Exadata). And of course we have every version of [...]]]></description>
			<content:encoded><![CDATA[<p>Well our new Exadata showed up this week. We had a pretty nice lab environment already. A bunch of Dell&#8217;s, some IBM&#8217;s, several Sun&#8217;s. We have a couple of EMC Sans as well (we actually threw away a whole EMC rack to make room for the Exadata). And of course we have every version of Oracle from 8i to 11gR2. It&#8217;s a good learning environment. It also let&#8217;s us try things when clients have a specific set of versions that we want to mimic. So now we have an Exadata V2 as well. We&#8217;ve had the delivery date on the calendar for several weeks. For some reason it reminded of the Weird Al Yankovik song <a href="http://www.google.com/url?q=http://s0.ilike.com/play%23%2522Weird%2BAl%2522%2BYankovic:Weasel%2BStomping%2BDay:567667:s51225593.12681246.1717365.0.2.215%252Cstd_16ec2c042eaf4815b33b84014b147fa6&amp;ei=iOf7S7rGN4mKNqDy4N0B&amp;sa=X&amp;oi=music_play_track&amp;resnum=1&amp;ct=result&amp;cd=2&amp;ved=0CBoQ0wQoADAA&amp;usg=AFQjCNHmvi4SmRFxiwr9zvnw7PoXGUVIkA" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');"><em>Weasel Stomping Day</em></a>.</p>
<p style="text-align: center;"><a href="http://www.google.com/url?q=http://s0.ilike.com/play%23%2522Weird%2BAl%2522%2BYankovic:Weasel%2BStomping%2BDay:567667:s51225593.12681246.1717365.0.2.215%252Cstd_16ec2c042eaf4815b33b84014b147fa6&amp;ei=iOf7S7rGN4mKNqDy4N0B&amp;sa=X&amp;oi=music_play_track&amp;resnum=1&amp;ct=result&amp;cd=2&amp;ved=0CBoQ0wQoADAA&amp;usg=AFQjCNHmvi4SmRFxiwr9zvnw7PoXGUVIkA" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');"></a><a href="http://www.google.com/url?q=http://s0.ilike.com/play%23%2522Weird%2BAl%2522%2BYankovic:Weasel%2BStomping%2BDay:567667:s51225593.12681246.1717365.0.2.215%252Cstd_16ec2c042eaf4815b33b84014b147fa6&amp;ei=iOf7S7rGN4mKNqDy4N0B&amp;sa=X&amp;oi=music_play_track&amp;resnum=1&amp;ct=result&amp;cd=2&amp;ved=0CBoQ0wQoADAA&amp;usg=AFQjCNHmvi4SmRFxiwr9zvnw7PoXGUVIkA" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');"><img class="size-full wp-image-2492 aligncenter" title="weasel-stomping-day" src="http://kerryosborne.oracle-guy.com/files/2010/05/weasel-stomping-day.png" alt="" width="403" height="295" /></a></p>
<p>It&#8217;s probably a sad reflection on how geeky we are that everyone is  running around all excited like it&#8217;s Christmas or something.</p>
<p>Here&#8217;s a few pictures:</p>
<p><a href="http://kerryosborne.oracle-guy.com/files/2010/05/exadata-emc.jpg" ><img class="alignnone size-medium wp-image-2495" title="exadata-emc" src="http://kerryosborne.oracle-guy.com/files/2010/05/exadata-emc-225x300.jpg" alt="" width="225" height="300" /></a><a href="http://kerryosborne.oracle-guy.com/files/2010/05/exadata-emc3.jpg" ><img class="alignnone size-medium wp-image-2498" title="exadata-emc3" src="http://kerryosborne.oracle-guy.com/files/2010/05/exadata-emc3-300x225.jpg" alt="" width="300" height="225" /></a><a href="http://kerryosborne.oracle-guy.com/files/2010/05/exadata-emc4.jpg" ><img class="alignnone size-medium wp-image-2499" title="exadata-emc4" src="http://kerryosborne.oracle-guy.com/files/2010/05/exadata-emc4-225x300.jpg" alt="" width="225" height="300" /></a></p>
<p>It&#8217;s a really fast machine by the way. In fact, we had trouble keeping up with it from the moment we got it off the truck.</p>
<p><a href="http://kerryosborne.oracle-guy.com/files/2010/05/fast-exadata32.jpg" ><img class="alignnone size-medium  wp-image-2506" title="fast-exadata32" src="http://kerryosborne.oracle-guy.com/files/2010/05/fast-exadata32-225x300.jpg" alt="" width="225" height="300" /></a><a href="http://kerryosborne.oracle-guy.com/files/2010/05/fast-exadata11.jpg" ><img class="alignnone size-medium wp-image-2502" title="fast-exadata11" src="http://kerryosborne.oracle-guy.com/files/2010/05/fast-exadata11-225x300.jpg" alt="" width="225" height="300" /></a><a href="http://kerryosborne.oracle-guy.com/files/2010/05/fast-exadata21.jpg" ><img class="alignnone size-medium wp-image-2503" title="fast-exadata21" src="http://kerryosborne.oracle-guy.com/files/2010/05/fast-exadata21-225x300.jpg" alt="" width="225" height="300" /></a></p>
<p>Really fast, and slippery. Well in a couple of days we can actually turn it on (we&#8217;re supposed to let it acclimate to our environment). On Friday afternoon we&#8217;re going to have a happy hour to celebrate our newest edition. Wade calls it a sip and see. We&#8217;ll probably take a few pictures of ourselves with the little bundle of joy and sing a chorus of a festive Weird Al song, or maybe two. Come on by if you&#8217;re in the neighborhood!</p>
]]></content:encoded>
			<wfw:commentRss>http://kerryosborne.oracle-guy.com/2010/05/oracle-exadata-delivery-day/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
