<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Striving for Optimal Performance &#187; TOP</title>
	<atom:link href="http://antognini.ch/category/top/feed/" rel="self" type="application/rss+xml" />
	<link>http://antognini.ch</link>
	<description></description>
	<lastBuildDate>Sat, 17 Dec 2011 23:42:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ad: The Oracle Query Optimizer 2-Day Seminar</title>
		<link>http://antognini.ch/2011/12/ad-the-oracle-query-optimizer-two-day-seminar/</link>
		<comments>http://antognini.ch/2011/12/ad-the-oracle-query-optimizer-two-day-seminar/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 23:42:45 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[Query Optimizer]]></category>
		<category><![CDATA[Speaking]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1689</guid>
		<description><![CDATA[The 31st of January and 1st of February 2012 I will present a 2-day seminar about the Oracle query optimizer in Ballerup (DK). The event is organized by Miracle A/S. The content, which is based on the chapters 2, 4, 5, 6, 9 and 10 of my book, is the following:

Chapter 1 describes the life [...]]]></description>
			<content:encoded><![CDATA[<p>The 31st of January and 1st of February 2012 I will present a 2-day seminar about the Oracle query optimizer in Ballerup (DK). The event is organized by <a href="http://www.miracleas.dk/">Miracle A/S</a>. The content, which is based on the chapters 2, 4, 5, 6, 9 and 10 of <a href="/top">my book</a>, is the following:</p>
<ul>
<li>Chapter 1 describes the life cycle of SQL statements and when the database engine can share cursors.</li>
<li>Chapter 2 describes the aim and architecture of the query optimizer.</li>
<li>Chapter 3 and 4 discuss the statistics used by the query optimizer to carry out its work.</li>
<li>Chapter 5 describes the initialization parameters influencing the behavior of the query optimizer and how to set them.</li>
<li>Chapter 6 outlines different methods of obtaining execution plans, as well as how to read them and recognize inefficient ones.</li>
<li>Chapter 7 describes how to take advantage of available access structures in order to access data stored in a single table efficiently.</li>
<li>Chapter 8 goes beyond accessing a single table, by describing how to join data from several tables together.</li>
</ul>
<p>The <a href="http://antognini.ch/downloads/Miracle_TheOracleQueryOptimizer_20110131.pdf">flyer</a> and <a href="http://www.miracleas.dk/index.php?option=com_content&#038;view=article&#038;id=455%3Aseminar-the-oracle-query-optimizer&#038;catid=13%3Amiracle&#038;Itemid=82&#038;lang=da">this page</a> provide detailed information about the seminar.</p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2011/12/ad-the-oracle-query-optimizer-two-day-seminar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>optimizer_secure_view_merging and VPD</title>
		<link>http://antognini.ch/2011/09/optimizer_secure_view_merging-and-vpd/</link>
		<comments>http://antognini.ch/2011/09/optimizer_secure_view_merging-and-vpd/#comments</comments>
		<pubDate>Sun, 11 Sep 2011 09:21:49 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[10gR2]]></category>
		<category><![CDATA[11gR1]]></category>
		<category><![CDATA[11gR2]]></category>
		<category><![CDATA[Query Optimizer]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1552</guid>
		<description><![CDATA[At page 189 of TOP I wrote the following piece of text:
In summary, with the initialization parameter optimizer_secure_view_merging set to TRUE, the query optimizer checks whether view merging could lead to security issues. If this is the case, no view merging will be performed, and performance could be suboptimal as a result. For this reason, [...]]]></description>
			<content:encoded><![CDATA[<p>At page 189 of <a href="/top">TOP</a> I wrote the following piece of text:</p>
<blockquote><p>In summary, with the initialization parameter optimizer_secure_view_merging set to TRUE, the query optimizer checks whether view merging could lead to security issues. If this is the case, no view merging will be performed, and performance could be suboptimal as a result. For this reason, if you are not using views for security purposes, it is better to set this initialization parameter to FALSE.</p></blockquote>
<p>What I didn’t consider when I wrote it, it is the implication of predicate move-around related to Virtual Private Database (VPD). In fact, as described in the <a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e17110/initparams168.htm#I1010262">documentation</a>, that parameter controls <em>view merging</em> as well as <em>predicate move-around</em>. </p>
<p>To point out what the impact is, let’s have a look to an example based on the description provided in <a href="/top">TOP</a>:</p>
<ul>
<li>Say you have a very simple table with one primary key and two more columns.</li>
</ul>
<p><pre>CREATE TABLE t (
  id NUMBER(10) PRIMARY KEY,
  class NUMBER(10),
  pad VARCHAR2(10)
);</pre></p>
<ul>
<li>For security reasons, you define the following policy. Notice the filter that is applied with the function to partially show the content of the table. How this function is implemented and what it does exactly is not important.</li>
</ul>
<p><pre>CREATE OR REPLACE FUNCTION s (schema IN VARCHAR2, tab IN VARCHAR2) RETURN VARCHAR2 AS
BEGIN
  RETURN &#039;f(class) = 1&#039;;
END;
/

BEGIN
  dbms_rls.add_policy(object_schema   =&gt; &#039;U1&#039;,
                      object_name     =&gt; &#039;T&#039;,
                      policy_name     =&gt; &#039;T_SEC&#039;,
                      function_schema =&gt; &#039;U1&#039;,
                      policy_function =&gt; &#039;S&#039;);
END;
/</pre></p>
<ul>
<li>Now let’s say that a user who has access to the table creates the following PL/SQL function. As you can see, it will just display the value of the input parameters through a call to the package dbms_output.</li>
</ul>
<p><pre>CREATE OR REPLACE FUNCTION spy (id IN NUMBER, pad IN VARCHAR2) RETURN NUMBER AS
BEGIN
  dbms_output.put_line(&#039;id=&#039; || id || &#039; pad=&#039; || pad);
  RETURN 1;
END;
/</pre></p>
<ul>
<li>With the initialization parameter optimizer_secure_view_merging set to FALSE, you can run two test queries. Both return only the values that the user is allowed to see. In the second one, however, you are able to see data that you should not be able to access.</li>
</ul>
<p><pre>SQL&gt; SELECT id, pad
  2  FROM t
  3  WHERE id BETWEEN 1 AND 5;

        ID PAD
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL

SQL&gt; SELECT id, pad
  2  FROM t
  3  WHERE id BETWEEN 1 AND 5
  4  AND spy(id, pad) = 1;

        ID PAD
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL
id=1 pad=DrMLTDXxxq
id=2 pad=XOZnqYRJwI
id=3 pad=nlGfGBTxNk
id=4 pad=AszBGEUGEL
id=5 pad=qTSRnFjRGb</pre></p>
<ul>
<li>With the initialization parameter optimizer_secure_view_merging set to TRUE, the second query returns the following output. As you can see, the function and the query display the same data.</li>
</ul>
<p><pre>SQL&gt; SELECT id, pad
  2  FROM t
  3  WHERE id BETWEEN 1 AND 5
  4  AND spy(id, pad) = 1;

        ID PAD
---------- ----------
         1 DrMLTDXxxq
         4 AszBGEUGEL
id=1 pad=DrMLTDXxxq
id=4 pad=AszBGEUGEL</pre></p>
<p>The execution plans that are used in the two situations are the following. As you can see only the second one guarantee that the policy defined via VPD is applied before the predicate based on the SPY function. Interestingly enough the other predicate based on the ID column is applied before the one of the policy. Hence, the query optimizer can choose an access path that takes advantage of the primary key.</p>
<ul>
<li>optimizer_secure_view_merging = FALSE</li>
</ul>
<p><pre>---------------------------------------------------
| Id  | Operation                   | Name        |
---------------------------------------------------
|   0 | SELECT STATEMENT            |             |
|*  1 |  TABLE ACCESS BY INDEX ROWID| T           |
|*  2 |   INDEX RANGE SCAN          | SYS_C009970 |
---------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter((&quot;SPY&quot;(&quot;ID&quot;,&quot;PAD&quot;)=1 AND &quot;F&quot;(&quot;CLASS&quot;)=1))
   2 - access(&quot;ID&quot;&gt;=1 AND &quot;ID&quot;&lt;=5)</pre></p>
<ul>
<li>optimizer_secure_view_merging = TRUE</li>
</ul>
<p><pre>----------------------------------------------------
| Id  | Operation                    | Name        |
----------------------------------------------------
|   0 | SELECT STATEMENT             |             |
|*  1 |  VIEW                        | T           |
|*  2 |   TABLE ACCESS BY INDEX ROWID| T           |
|*  3 |    INDEX RANGE SCAN          | SYS_C009971 |
----------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(&quot;SPY&quot;(&quot;ID&quot;,&quot;PAD&quot;)=1)
   2 - filter(&quot;F&quot;(&quot;CLASS&quot;)=1)
   3 - access(&quot;ID&quot;&gt;=1 AND &quot;ID&quot;&lt;=5)</pre></p>
<p>Based on these observations, the summary that is provided by <a href="/top">TOP</a> at page 189 should be amended as follows:</p>
<blockquote><p>In summary, with the initialization parameter optimizer_secure_view_merging set to TRUE, the query optimizer checks whether view merging or predicate move-around could lead to security issues. If this is the case, they will not be performed, and performance could be suboptimal as a result. For this reason, if you are not using views or VPD for security purposes, it is better to set this initialization parameter to FALSE.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2011/09/optimizer_secure_view_merging-and-vpd/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Ad: DOAG Berliner Expertenseminare (Last Call)</title>
		<link>http://antognini.ch/2011/05/ad-doag-berliner-expertenseminare-last-call/</link>
		<comments>http://antognini.ch/2011/05/ad-doag-berliner-expertenseminare-last-call/#comments</comments>
		<pubDate>Mon, 23 May 2011 13:51:21 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1520</guid>
		<description><![CDATA[I was just informed that there are still some free seats for the 2-day seminar I will present in Berlin in two weeks (June 7-8). Hence, do not wait too long if you want to join us&#8230;
The content is based on the chapters 4, 5, 6 and 7 of my book, i.e. part 3: Query [...]]]></description>
			<content:encoded><![CDATA[<p>I was just informed that there are still some free seats for the 2-day seminar I will present in Berlin in two weeks (June 7-8). Hence, do not wait too long if you want to join us&#8230;</p>
<p>The content is based on the chapters 4, 5, 6 and 7 of my <a href="/top">book</a>, i.e. part 3: Query Optimizer. The essential difference is that the content was updated to cover version 11.2 as well.</p>
<p>The event is organized by <a href="http://www.doag.org">DOAG</a>. You can read the full description of the seminar (incl. agenda) <a href="http://mydoag.doag.org/termine/termine.php?tid=417402">here</a>. Just be careful that the spoken language will be German (slides will be in English, though). </p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2011/05/ad-doag-berliner-expertenseminare-last-call/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>IS NULL Conditions and B-tree Indexes</title>
		<link>http://antognini.ch/2011/02/is-null-conditions-and-b-tree-indexes/</link>
		<comments>http://antognini.ch/2011/02/is-null-conditions-and-b-tree-indexes/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 10:01:56 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[10gR1]]></category>
		<category><![CDATA[10gR2]]></category>
		<category><![CDATA[11gR1]]></category>
		<category><![CDATA[11gR2]]></category>
		<category><![CDATA[9iR2]]></category>
		<category><![CDATA[Indexes]]></category>
		<category><![CDATA[Query Optimizer]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1479</guid>
		<description><![CDATA[At page 383 of my book I wrote the following sentence (BTW, the same information is also provided by Table 9-3 at page 381):
With B-tree indexes, IS NULL conditions can be applied only through composite B-tree indexes when several SQL conditions are applied and at least one of them is not based on IS NULL [...]]]></description>
			<content:encoded><![CDATA[<p>At page 383 of <a href="/top">my book</a> I wrote the following sentence (BTW, the same information is also provided by Table 9-3 at page 381):</p>
<blockquote><p>With B-tree indexes, IS NULL conditions can be applied only through composite B-tree indexes when several SQL conditions are applied and at least one of them is not based on IS NULL or an inequality.</p></blockquote>
<p>The text continues by showing the following examples (notice that in both cases the IS NULL predicate is applied through an access predicate):</p>
<p><pre>SELECT /*+ index(t) */ * FROM t WHERE n1 = 6 AND n2 IS NULL

Plan hash value: 780655320

----------------------------------------------
| Id  | Operation                   | Name   |
----------------------------------------------
|   0 | SELECT STATEMENT            |        |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |
|*  2 |   INDEX RANGE SCAN          | I_N123 |
----------------------------------------------

   2 - access(&quot;N1&quot;=6 AND &quot;N2&quot; IS NULL)

SELECT /*+ index(t) */ * FROM t WHERE n1 IS NULL AND n2 = 8

Plan hash value: 780655320

----------------------------------------------
| Id  | Operation                   | Name   |
----------------------------------------------
|   0 | SELECT STATEMENT            |        |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |
|*  2 |   INDEX RANGE SCAN          | I_N123 |
----------------------------------------------

   2 - access(&quot;N1&quot; IS NULL AND &quot;N2&quot;=8)
       filter(&quot;N2&quot;=8)</pre></p>
<p>When I wrote that sentence I didn&#8217;t think about one case that, according to it, specifically the part &#8220;is not based on IS NULL or an inequality&#8221;, is not covered. In fact, as the following examples show, it is also possible to apply an IS NULL predicate when the other one is an IS NOT NULL. It is especially interesting to notice that the access predicate doesn&#8217;t reference at all the NOT NULL column!</p>
<p><pre>SELECT /*+ index(t) */ * FROM t WHERE n1 IS NULL AND n2 IS NOT NULL

Plan hash value: 780655320

----------------------------------------------
| Id  | Operation                   | Name   |
----------------------------------------------
|   0 | SELECT STATEMENT            |        |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |
|*  2 |   INDEX RANGE SCAN          | I_N123 |
----------------------------------------------

   2 - access(&quot;N1&quot; IS NULL)
       filter(&quot;N2&quot; IS NOT NULL)

SELECT /*+ index(t) */ * FROM t WHERE n1 IS NOT NULL AND n2 IS NULL

Plan hash value: 3029444779

----------------------------------------------
| Id  | Operation                   | Name   |
----------------------------------------------
|   0 | SELECT STATEMENT            |        |
|   1 |  TABLE ACCESS BY INDEX ROWID| T      |
|*  2 |   INDEX SKIP SCAN           | I_N123 |
----------------------------------------------

   2 - access(&quot;N2&quot; IS NULL)
       filter((&quot;N2&quot; IS NULL AND &quot;N1&quot; IS NOT NULL))</pre></p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2011/02/is-null-conditions-and-b-tree-indexes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SIOUG Conference in Portoroz</title>
		<link>http://antognini.ch/2010/08/sioug-conference-in-portoroz/</link>
		<comments>http://antognini.ch/2010/08/sioug-conference-in-portoroz/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 12:21:10 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1247</guid>
		<description><![CDATA[This is a short note to point out that I just added to the Public Appearances page the next conference organized by the Slovenian Oracle User Group (SIOUG) in Portoroz. It will take place on September 27-29. My talk, entitled &#8220;Join Techniques&#8221;, is based on chapter 10 of my book. It will be a shorter [...]]]></description>
			<content:encoded><![CDATA[<p>This is a short note to point out that I just added to the <a href="/public-appearances/">Public Appearances</a> page the next conference organized by the <a href="http://www.sioug.si/">Slovenian Oracle User Group (SIOUG)</a> in Portoroz. It will take place on September 27-29. My talk, entitled &#8220;Join Techniques&#8221;, is based on chapter 10 of <a href="/top">my book</a>. It will be a shorter version of then one I will give at Oracle OpenWorld the week before.</p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2010/08/sioug-conference-in-portoroz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle OpenWorld Schedule</title>
		<link>http://antognini.ch/2010/07/oracle-openworld-schedule/</link>
		<comments>http://antognini.ch/2010/07/oracle-openworld-schedule/#comments</comments>
		<pubDate>Tue, 13 Jul 2010 08:33:14 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1191</guid>
		<description><![CDATA[Back from two weeks of vacation I noticed that the schedule of the next OpenWorld is available here.
The detailled information about my session, which is based on chapter 10 of my book, is the following:


ID#
S316683


Title
Join Techniques


Abstract
This presentation explains how the query optimizer joins multiple sets of data to each other. First it explains the operation [...]]]></description>
			<content:encoded><![CDATA[<p>Back from two weeks of vacation I noticed that the schedule of the next OpenWorld is available <a href="http://www.eventreg.com/oracle/openworld2010/sanfrancisco/cc">here</a>.</p>
<p>The detailled information about my session, which is based on chapter 10 of <a href="/top">my book</a>, is the following:</p>
<table>
<tr>
<td>ID#</td>
<td>S316683</td>
</tr>
<tr>
<td>Title</td>
<td>Join Techniques</td>
</tr>
<tr>
<td>Abstract</td>
<td>This presentation explains how the query optimizer joins multiple sets of data to each other. First it explains the operation of the basic join methods (nested loop, hash join, and merge join) and the possibilities we have to influence their performance. Then it presents some more advanced optimization techniques such as the transformations applied to joins, and partition-wise joins.</td>
</tr>
<tr>
<td>Track</td>
<td>Database</td>
</tr>
<tr>
<td>Date</td>
<td>22-SEP-2010</td>
</tr>
<tr>
<td>Time</td>
<td>13:00 &#8211; 14:00</td>
</tr>
<tr>
<td>Venue</td>
<td>Moscone South</td>
</tr>
<tr>
<td>Room</td>
<td>Rm 304</td>
</tr>
</table>
<p>I&#8217;m looking forward to seeing you in San Francisco!</p>
<p><strong>Update 2009-09-01</strong>: location was changed from &#8220;Rm 200&#8243; to &#8220;Rm 304&#8243;.</p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2010/07/oracle-openworld-schedule/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Troubleshooting Oracle Performance &#8211; Downloadable Files</title>
		<link>http://antognini.ch/2010/06/troubleshooting-oracle-performance-downloadable-files-3/</link>
		<comments>http://antognini.ch/2010/06/troubleshooting-oracle-performance-downloadable-files-3/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 09:29:38 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1171</guid>
		<description><![CDATA[This is just a short note to point out that I just uploaded a new version of the scripts related to TOP. The new ZIP is available through this page.
The change log is the following:


connect.sql                     [...]]]></description>
			<content:encoded><![CDATA[<p>This is just a short note to point out that I just uploaded a new version of the scripts related to <a href="/top">TOP</a>. The new ZIP is available through <a href="/top/downloadable-files">this page</a>.</p>
<p>The change log is the following:</p>
<table>
<tr>
<td>connect.sql                                 </td>
<td>Added DBM10205, DBA10205, DBM11201 and DBA11201</td>
</tr>
<tr>
<td>chapter02\bind_variables.sql                </td>
<td>Because of 11g modified/added queries against V$SQL_SHARED_CURSOR</td>
</tr>
<tr>
<td>chapter02\sharable_cursors.sql              </td>
<td>Added SET SERVEROUTPUT OFF in the initialization part</td>
</tr>
<tr>
<td>chapter03\dbms_hprof.sql                    </td>
<td>New file</td>
</tr>
<tr>
<td>chapter03\sql_trace_trigger.sql             </td>
<td>New file</td>
</tr>
<tr>
<td>chapter06\display_awr.sql                   </td>
<td>Improved query that displays AWR content</td>
</tr>
<tr>
<td>chapter06\execution_plans.sql               </td>
<td>Added example for UNION ALL (RECURSIVE WITH)</td>
</tr>
<tr>
<td>chapter07\baseline_evolution_delete.sql     </td>
<td>New file</td>
</tr>
<tr>
<td>chapter07\baseline_upgrade_11g.sql          </td>
<td>After import added update to set the owner of the SQL tuning set</td>
</tr>
<tr>
<td>chapter07\opt_estimate.sql                  </td>
<td>Uncommented 11g query</td>
</tr>
<tr>
<td>chapter07\outline_with_hj.sql               </td>
<td>Script compatible with 10g/11g (set &#8220;_hash_join_enabled&#8221;)</td>
</tr>
<tr>
<td>chapter07\tune_last_statement.sql           </td>
<td>Added SET SERVEROUTPUT OFF in the initialization part</td>
</tr>
<tr>
<td>chapter08\client-side_caching.sql           </td>
<td>New file</td>
</tr>
<tr>
<td>chapter09\conditions.sql                    </td>
<td>Added queries containing NOT IN condition</td>
</tr>
<tr>
<td>chapter09\hash_cluster.sql                  </td>
<td>Changed comment related to IN operator because of 11.2 improvement</td>
</tr>
<tr>
<td>chapter10\hash_join.sql                     </td>
<td>Fixed typo in description</td>
</tr>
<tr>
<td>chapter10\join_elimination.sql              </td>
<td>Fixed typo in description</td>
</tr>
<tr>
<td>chapter10\join_elimination2.sql             </td>
<td>New file</td>
</tr>
<tr>
<td>chapter10\pwj.sql                           </td>
<td>Disabled join-filter pruning</td>
</tr>
<tr>
<td>chapter10\subquery_unnesting.sql            </td>
<td>Cover many more cases</td>
</tr>
<tr>
<td>chapter11\ArrayInterface.java               </td>
<td>Added check for the return value of the executeBatch method</td>
</tr>
<tr>
<td>chapter11\ArrayInterfacePerf.java           </td>
<td>Fixed number of iterations in main method</td>
</tr>
<tr>
<td>chapter11\atomic_refresh.sql                </td>
<td>Changed CTAS to avoid ORA-30009</td>
</tr>
<tr>
<td>chapter11\dpi_performance.sql               </td>
<td>Changed CTAS to avoid ORA-30009</td>
</tr>
<tr>
<td>chapter11\px_auto_dop.sql                   </td>
<td>New file</td>
</tr>
<tr>
<td>chapter11\px_ddl.sql                        </td>
<td>Changed the part displaying the parallel DDL status</td>
</tr>
<tr>
<td>chapter11\px_dml.sql                        </td>
<td>Changed the part displaying the parallel DML status</td>
</tr>
<tr>
<td>chapter11\px_query.sql                      </td>
<td>Changed the part displaying the parallel query status</td>
</tr>
<tr>
<td>chapter11\result_cache_plsql.sql            </td>
<td>Added comment about invalidation in 11.2</td>
</tr>
<tr>
<td>chapter12\data_compression.sql              </td>
<td>Changed CTAS to avoid ORA-30009</td>
</tr>
<tr>
<td>databases\DBA10205                          </td>
<td>New directory containing the files to create the database DBA10205</td>
</tr>
<tr>
<td>databases\DBM10205                          </td>
<td>New directory containing the files to create the database DBM10205</td>
</tr>
<tr>
<td>databases\DBA11201                          </td>
<td>New directory containing the files to create the database DBA11201</td>
</tr>
<tr>
<td>databases\DBM11201                          </td>
<td>New directory containing the files to create the database DBM11201</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2010/06/troubleshooting-oracle-performance-downloadable-files-3/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Related-Combine Operation „UNION ALL (RECURSIVE WITH)“</title>
		<link>http://antognini.ch/2010/06/related-combine-operation-union-all-recursive-with/</link>
		<comments>http://antognini.ch/2010/06/related-combine-operation-union-all-recursive-with/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 06:53:37 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[11gR2]]></category>
		<category><![CDATA[Query Optimizer]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1160</guid>
		<description><![CDATA[To make easier the interpretation of execution plans, in chapter 6 of TOP I defined three types of operations: standalone operations, unrelated-combine operations, and related-combine operations. For combine operations I also added a list of all operations of each type. Since in 11.2 a new related-combine operation is available, I decided to write this short [...]]]></description>
			<content:encoded><![CDATA[<p>To make easier the interpretation of execution plans, in chapter 6 of <a href="/top">TOP</a> I defined three types of operations: standalone operations, unrelated-combine operations, and related-combine operations. For combine operations I also added a list of all operations of each type. Since in 11.2 a new related-combine operation is available, I decided to write this short post as addenda to the content of the book.</p>
<p>The new related-combine operation, named “UNION ALL (RECURSIVE WITH)”, is available to support the new recursive <a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/statements_10002.htm#i2077142">subquery factoring clause</a>. Hence, it is used for hierarchical queries. The following query and its execution plan show an example:<br />
<pre>SQL&gt; WITH
  2    e (xlevel, empno, ename, job, mgr, hiredate, sal, comm, deptno)
  3    AS (
  4      SELECT 1, empno, ename, job, mgr, hiredate, sal, comm, deptno
  5      FROM emp
  6      WHERE mgr IS NULL
  7      UNION ALL
  8      SELECT mgr.xlevel+1, emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, emp.sal, emp.comm, emp.deptno
  9      FROM emp, e mgr
 10      WHERE emp.mgr = mgr.empno
 11    )
 12  SELECT *
 13  FROM e;

-------------------------------------------------------------------------------
| Id  | Operation                                 | Name    | Starts | A-Rows |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                          |         |      1 |     14 |
|   1 |  VIEW                                     |         |      1 |     14 |
|   2 |   UNION ALL (RECURSIVE WITH) BREADTH FIRST|         |      1 |     14 |
|*  3 |    TABLE ACCESS FULL                      | EMP     |      1 |      1 |
|   4 |    NESTED LOOPS                           |         |      4 |     13 |
|   5 |     NESTED LOOPS                          |         |      4 |     13 |
|   6 |      RECURSIVE WITH PUMP                  |         |      4 |     14 |
|*  7 |      INDEX RANGE SCAN                     | EMP_MGR |     14 |     13 |
|   8 |     TABLE ACCESS BY INDEX ROWID           | EMP     |     13 |     13 |
-------------------------------------------------------------------------------

   3 - filter(&quot;MGR&quot; IS NULL)
   7 - access(&quot;EMP&quot;.&quot;MGR&quot;=&quot;MGR&quot;.&quot;EMPNO&quot;)
       filter(&quot;EMP&quot;.&quot;MGR&quot; IS NOT NULL)</pre></p>
<p>Notice that there are actually two operations:</p>
<ul>
<li>UNION ALL (RECURSIVE WITH) BREADTH FIRST</li>
<li>UNION ALL (RECURSIVE WITH) DEPTH FIRST</li>
</ul>
<p>As their name suggest, the difference is due to the <a href="http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/statements_10002.htm#BCEDDGGE">search clause</a> that you can set to either BREADTH FIRST BY or DEPTH FIRST BY.</p>
<p>Reading an execution plan containing the “UNION ALL (RECURSIVE WITH)” operation is the same as reading one containing the “CONNECT BY WITH FILTERING” operation. As a matter of fact, the purpose of both operations is basically the same. Just notice that also the “PUMP” operation used in the execution plan differs. While in the former it is called “RECURSIVE WITH PUMP”, in the latter it is called “CONNECT BY PUMP”. But the difference, for the purpose of reading the execution plan, does not matter.</p>
<p>You find a full description on how to read such an execution plan in <a href="/2008/06/operation-connect-by-with-filtering/">this post</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2010/06/related-combine-operation-union-all-recursive-with/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ad: Optimizing Oracle Performance Seminar in Berlin</title>
		<link>http://antognini.ch/2010/05/ad-optimizing-oracle-performance-seminar-in-berlin/</link>
		<comments>http://antognini.ch/2010/05/ad-optimizing-oracle-performance-seminar-in-berlin/#comments</comments>
		<pubDate>Sat, 22 May 2010 09:24:10 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[Speaking]]></category>
		<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=1104</guid>
		<description><![CDATA[In one month I will be in Berlin presenting a two-day seminar based on the chapters 1, 2, 8, 9, 10 and 11 of my book. The event is organized by DOAG. You can read the full description of the seminar (incl. agenda) here. Just be careful that the spoken language will be German (slides [...]]]></description>
			<content:encoded><![CDATA[<p>In one month I will be in Berlin presenting a two-day seminar based on the chapters 1, 2, 8, 9, 10 and 11 of my <a href="/top">book</a>. The event is organized by <a href="http://www.doag.org">DOAG</a>. You can read the full description of the seminar (incl. agenda) <a href="http://mydoag.doag.org/termine/termine.php?tid=400117">here</a>. Just be careful that the spoken language will be German (slides will be in English, though). Since I was just informed that there are less than ten free seats, do not wait to long if you want to join us&#8230; </p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2010/05/ad-optimizing-oracle-performance-seminar-in-berlin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chinese Edition of TOP Available!</title>
		<link>http://antognini.ch/2009/12/chinese-edition-of-top-available/</link>
		<comments>http://antognini.ch/2009/12/chinese-edition-of-top-available/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 01:26:53 +0000</pubDate>
		<dc:creator>Christian Antognini</dc:creator>
				<category><![CDATA[TOP]]></category>

		<guid isPermaLink="false">http://antognini.ch/?p=805</guid>
		<description><![CDATA[
Few weeks ago the Chinese Edition of my book, Troubleshooting Oracle Performance, was published by China-Pub! Honestly, this is something I did not expect when publishing the book.
Even though I still have to touch one of them myself, let me spend few words about it&#8230;
I still remember when I saw for the first time part [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/images/covercm.jpg" rel="thumbnail"><img id="imgright" src="/images/covercs.jpg" alt="Troubleshooting Oracle Performance - Chinese Edition" /></a></p>
<p>Few weeks ago the Chinese Edition of my book, <a href="/top">Troubleshooting Oracle Performance</a>, was published by <a href="http://www.china-pub.com/192980">China-Pub</a>! Honestly, this is something I did not expect when publishing the book.</p>
<p>Even though I still have to touch one of them myself, let me spend few words about it&#8230;</p>
<p>I still remember when I saw for the first time part of my book translated in Chinese. I was looking at the news provided to me by Google Alerts when, among the other links, there was a link related to &#8220;Troubleshooting Oracle Performance&#8221; (this is one of the terms I monitor through Google Alerts) pointing to a Chinese page. I opened the referenced page and, it goes without saying, I was not able to read it. I just recognized the cover of my book and its name. So, I put the first part of the text in yet another Google application to let translate it to English. I immediately understood what it was all about. It was part of chapter 1 of my book. Amazing!</p>
<p>Since the book is now available, it means that the translators managed to finish their work. I know for sure that it was a huge undertaking and, therefore, I would like to thank David Feng, Jame Tong, Yiwen Hu and Yi Zhu for doing it. I know that they spent a considerable amount of their valuable time to translate the text. Thanks to them, more people will be able to learn something about Oracle Database, how to use it efficiently and how to approach performance problems. And that is something that makes me proud.</p>
<p>In case you are interested in it, click <a href="http://www.china-pub.com/192980">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://antognini.ch/2009/12/chinese-edition-of-top-available/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

