<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Comments on: Joins</title>
	<atom:link href="http://jonathanlewis.wordpress.com/2010/08/02/joins/feed/" rel="self" type="application/rss+xml" />
	<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/</link>
	<description>Just another Oracle weblog</description>
	<lastBuildDate>Wed, 22 May 2013 12:40:08 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>By: Joins &#8211; HJ &#171; Oracle Scratchpad</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-37220</link>
		<dc:creator><![CDATA[Joins &#8211; HJ &#171; Oracle Scratchpad]]></dc:creator>
		<pubDate>Mon, 06 Sep 2010 13:17:42 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-37220</guid>
		<description><![CDATA[[...] Comments Joins &#8211; MJ &#171; Oracle Scratchpad on JoinsScalability Conflict &#171; Oracle Scratchpad on HeisenbergFragmentation 1 &#171; Oracle [...]]]></description>
		<content:encoded><![CDATA[<p>[...] Comments Joins &#8211; MJ &laquo; Oracle Scratchpad on JoinsScalability Conflict &laquo; Oracle Scratchpad on HeisenbergFragmentation 1 &laquo; Oracle [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Joins &#8211; MJ &#171; Oracle Scratchpad</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-37219</link>
		<dc:creator><![CDATA[Joins &#8211; MJ &#171; Oracle Scratchpad]]></dc:creator>
		<pubDate>Mon, 06 Sep 2010 13:12:32 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-37219</guid>
		<description><![CDATA[[...] Joins &#8211;&#160;MJ Filed under: Execution plans,Performance &#8212; Jonathan Lewis @ 5:50 pm UTC Aug 15,2010   The final join mechanism in my &#8220;all joins are nested loop joins&#8221; argument is the Merge Join &#8211; a join mechanism that depends on both its row sources being pre-sorted on the join columns. ((For a quick reference list of URLs to all three articles in turn, see: Joins.)) [...]]]></description>
		<content:encoded><![CDATA[<p>[...] Joins &#8211;&nbsp;MJ Filed under: Execution plans,Performance &#8212; Jonathan Lewis @ 5:50 pm UTC Aug 15,2010   The final join mechanism in my &#8220;all joins are nested loop joins&#8221; argument is the Merge Join &#8211; a join mechanism that depends on both its row sources being pre-sorted on the join columns. ((For a quick reference list of URLs to all three articles in turn, see: Joins.)) [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jonathan Lewis</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36962</link>
		<dc:creator><![CDATA[Jonathan Lewis]]></dc:creator>
		<pubDate>Thu, 12 Aug 2010 07:48:09 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36962</guid>
		<description><![CDATA[Stefan,
Thanks for your suggestions. I was just a little careful to use the term &quot;join mechanism&quot; in my original statement - the cluster join isn&#039;t an extra join mechanism: in fact, as you suggest in your final sentence, the commonest mechanism used in a cluster join is the nested loop. (Merge joins - cartesian, inevitably - can also appear).

Example of plan:
[sourcecode gutter=&quot;false&quot;]
-------------------------------------------------------------------------------
&#124; Id  &#124; Operation                    &#124; Name           &#124; Rows  &#124; Bytes &#124; Cost  &#124;
-------------------------------------------------------------------------------
&#124;   0 &#124; SELECT STATEMENT             &#124;                &#124;    10 &#124;   300 &#124;     3 &#124;
&#124;   1 &#124;  NESTED LOOPS                &#124;                &#124;    10 &#124;   300 &#124;     3 &#124;
&#124;   2 &#124;   TABLE ACCESS BY INDEX ROWID&#124; INDEXED_TABLE1 &#124;     1 &#124;    15 &#124;     2 &#124;
&#124;*  3 &#124;    INDEX RANGE SCAN          &#124; IT_I1          &#124;     1 &#124;       &#124;     1 &#124;
&#124;*  4 &#124;   TABLE ACCESS CLUSTER       &#124; INDEXED_TABLE2 &#124;    10 &#124;   150 &#124;     1 &#124;
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access(&quot;T1&quot;.&quot;SMALL_VC&quot;=&#039;0000001000&#039;)
   4 - filter(&quot;T2&quot;.&quot;ID&quot;=&quot;T1&quot;.&quot;ID&quot;)

[/sourcecode]
The two tables are in the same index cluster the ID column is the cluster key and the join is on the cluster key. Note how we have a special access method (table access cluster) but, as you assumed, a standard join mechanism (nested loop).]]></description>
		<content:encoded><![CDATA[<p>Stefan,<br />
Thanks for your suggestions. I was just a little careful to use the term &#8220;join mechanism&#8221; in my original statement &#8211; the cluster join isn&#8217;t an extra join mechanism: in fact, as you suggest in your final sentence, the commonest mechanism used in a cluster join is the nested loop. (Merge joins &#8211; cartesian, inevitably &#8211; can also appear).</p>
<p>Example of plan:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
-------------------------------------------------------------------------------
| Id  | Operation                    | Name           | Rows  | Bytes | Cost  |
-------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                |    10 |   300 |     3 |
|   1 |  NESTED LOOPS                |                |    10 |   300 |     3 |
|   2 |   TABLE ACCESS BY INDEX ROWID| INDEXED_TABLE1 |     1 |    15 |     2 |
|*  3 |    INDEX RANGE SCAN          | IT_I1          |     1 |       |     1 |
|*  4 |   TABLE ACCESS CLUSTER       | INDEXED_TABLE2 |    10 |   150 |     1 |
-------------------------------------------------------------------------------

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

   3 - access(&quot;T1&quot;.&quot;SMALL_VC&quot;='0000001000')
   4 - filter(&quot;T2&quot;.&quot;ID&quot;=&quot;T1&quot;.&quot;ID&quot;)

</pre>
<p>The two tables are in the same index cluster the ID column is the cluster key and the join is on the cluster key. Note how we have a special access method (table access cluster) but, as you assumed, a standard join mechanism (nested loop).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Stefan Schwetschke</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36958</link>
		<dc:creator><![CDATA[Stefan Schwetschke]]></dc:creator>
		<pubDate>Wed, 11 Aug 2010 09:19:18 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36958</guid>
		<description><![CDATA[Actually there are at least four kinds of joins used by Oracle: Merge, Hash, Nested Loops and Cluster Joins.

The latter are used when you join two tables that are stored in the same data blocks (clustering). When you join them in a way that each of the rows being joined share the same data block, Oracle can easily join them together without much additional efford.

I haven&#039;t tested this, but I guess in the execution plan the cluster join will show up as a nested loop join with a cluster access path on all but one of the tables accessed.]]></description>
		<content:encoded><![CDATA[<p>Actually there are at least four kinds of joins used by Oracle: Merge, Hash, Nested Loops and Cluster Joins.</p>
<p>The latter are used when you join two tables that are stored in the same data blocks (clustering). When you join them in a way that each of the rows being joined share the same data block, Oracle can easily join them together without much additional efford.</p>
<p>I haven&#8217;t tested this, but I guess in the execution plan the cluster join will show up as a nested loop join with a cluster access path on all but one of the tables accessed.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: David Aldridge</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36951</link>
		<dc:creator><![CDATA[David Aldridge]]></dc:creator>
		<pubDate>Tue, 10 Aug 2010 11:52:28 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36951</guid>
		<description><![CDATA[Opinion 1 is closest to my own, and therefore the most likely to be correct ;) &quot;Troubleshooting a problem&quot; = &quot;Troubleshooting&quot;, or &quot;Problem-shooting&quot; if you will. It&#039;s the sort of vague thing you say you&#039;re doing when you want someone to just go away reassured that you&#039;re doing &quot;something&quot; about a problem. It could mean so many things that in the end it means almost nothing.

Anyway, I&#039;m putting &quot;troubleshooting&quot; on my List Of Forbiddden Words and Phrases.]]></description>
		<content:encoded><![CDATA[<p>Opinion 1 is closest to my own, and therefore the most likely to be correct ;) &#8220;Troubleshooting a problem&#8221; = &#8220;Troubleshooting&#8221;, or &#8220;Problem-shooting&#8221; if you will. It&#8217;s the sort of vague thing you say you&#8217;re doing when you want someone to just go away reassured that you&#8217;re doing &#8220;something&#8221; about a problem. It could mean so many things that in the end it means almost nothing.</p>
<p>Anyway, I&#8217;m putting &#8220;troubleshooting&#8221; on my List Of Forbiddden Words and Phrases.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bix</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36928</link>
		<dc:creator><![CDATA[Bix]]></dc:creator>
		<pubDate>Fri, 06 Aug 2010 14:40:52 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36928</guid>
		<description><![CDATA[I am trouble-shooting a problem 
I was trouble-shooting a problem 

i just &#039;think&#039; the above both are wrong sentences...

I am on trouble-shooting a problem
I am good at trouble shooting]]></description>
		<content:encoded><![CDATA[<p>I am trouble-shooting a problem<br />
I was trouble-shooting a problem </p>
<p>i just &#8216;think&#8217; the above both are wrong sentences&#8230;</p>
<p>I am on trouble-shooting a problem<br />
I am good at trouble shooting</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bix</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36927</link>
		<dc:creator><![CDATA[Bix]]></dc:creator>
		<pubDate>Fri, 06 Aug 2010 14:32:02 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36927</guid>
		<description><![CDATA[By definition -  &#039;JOIN&#039; means - to &#039;look up&#039;  a value (from set A ) in Set B.

the basic task is to &#039;look up&#039; which is a  task basically in all 3 types of JOINS - they way Oracle &#039;organise&#039; and &#039;arrange&#039; the tables before starting look-up is different - that is all about &#039;start up&#039; cost]]></description>
		<content:encoded><![CDATA[<p>By definition &#8211;  &#8216;JOIN&#8217; means &#8211; to &#8216;look up&#8217;  a value (from set A ) in Set B.</p>
<p>the basic task is to &#8216;look up&#8217; which is a  task basically in all 3 types of JOINS &#8211; they way Oracle &#8216;organise&#8217; and &#8216;arrange&#8217; the tables before starting look-up is different &#8211; that is all about &#8216;start up&#8217; cost</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: marcov</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36926</link>
		<dc:creator><![CDATA[marcov]]></dc:creator>
		<pubDate>Fri, 06 Aug 2010 09:58:58 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36926</guid>
		<description><![CDATA[

NLJ: The driver outer loop is executed at most once, while the inner loop may or not be executed at all: it can return the first rows while computing the entire result set.

MJ: each step is executed once, but before returning the first rows it must read all the inputs, because it needs to sort them

HJ: each step is executed once. Before returning the first rows only the first step must read its input completely.]]></description>
		<content:encoded><![CDATA[<p>NLJ: The driver outer loop is executed at most once, while the inner loop may or not be executed at all: it can return the first rows while computing the entire result set.</p>
<p>MJ: each step is executed once, but before returning the first rows it must read all the inputs, because it needs to sort them</p>
<p>HJ: each step is executed once. Before returning the first rows only the first step must read its input completely.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: joel garry</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36910</link>
		<dc:creator><![CDATA[joel garry]]></dc:creator>
		<pubDate>Tue, 03 Aug 2010 20:44:43 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36910</guid>
		<description><![CDATA[Well if you are a scientist, you have to put it in the most passive third person:

The trouble-shooting of the problem was completed by the consultant.

(Slightly-less-jokey answer:  it&#039;s slang for various forms of domain-specific forensic engineering, so somewhere in the land between null and not-yet-properly-defined)]]></description>
		<content:encoded><![CDATA[<p>Well if you are a scientist, you have to put it in the most passive third person:</p>
<p>The trouble-shooting of the problem was completed by the consultant.</p>
<p>(Slightly-less-jokey answer:  it&#8217;s slang for various forms of domain-specific forensic engineering, so somewhere in the land between null and not-yet-properly-defined)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Flado</title>
		<link>http://jonathanlewis.wordpress.com/2010/08/02/joins/#comment-36908</link>
		<dc:creator><![CDATA[Flado]]></dc:creator>
		<pubDate>Tue, 03 Aug 2010 11:40:26 +0000</pubDate>
		<guid isPermaLink="false">http://jonathanlewis.wordpress.com/?p=4224#comment-36908</guid>
		<description><![CDATA[Any operation on a potentially infinite set must employ a loop (or recursion, but let&#039;s not go there). A join is an operation on two potentially infinite sets where each element of one of the sets must be searched for in the other set, so you need to process a potentially infinite set for every member of another potentially infinite set. Hence, the corresponding loops must be nested. Q.E.D.
Disclaimer: I might be talking complete rubbish (wow, it&#039;s been 20 years already since that course).

Flado]]></description>
		<content:encoded><![CDATA[<p>Any operation on a potentially infinite set must employ a loop (or recursion, but let&#8217;s not go there). A join is an operation on two potentially infinite sets where each element of one of the sets must be searched for in the other set, so you need to process a potentially infinite set for every member of another potentially infinite set. Hence, the corresponding loops must be nested. Q.E.D.<br />
Disclaimer: I might be talking complete rubbish (wow, it&#8217;s been 20 years already since that course).</p>
<p>Flado</p>
]]></content:encoded>
	</item>
</channel>
</rss>
