<?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>Holik in everything! &#187; Database</title>
	<atom:link href="http://holik.org/tag/database/feed/" rel="self" type="application/rss+xml" />
	<link>http://holik.org</link>
	<description>Jihoon&#039;s Life story.</description>
	<lastBuildDate>Tue, 02 Nov 2010 02:26:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Database에서 사용되는 join 기법들</title>
		<link>http://holik.org/2009/06/16/database%ec%97%90%ec%84%9c-%ec%82%ac%ec%9a%a9%eb%90%98%eb%8a%94-join-%ea%b8%b0%eb%b2%95%eb%93%a4/</link>
		<comments>http://holik.org/2009/06/16/database%ec%97%90%ec%84%9c-%ec%82%ac%ec%9a%a9%eb%90%98%eb%8a%94-join-%ea%b8%b0%eb%b2%95%eb%93%a4/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 13:17:19 +0000</pubDate>
		<dc:creator>Jihoon</dc:creator>
				<category><![CDATA[Research]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Join]]></category>

		<guid isPermaLink="false">http://holik.org/?p=148</guid>
		<description><![CDATA[이 글은 Sachin Arora의 Nested loops, Hash join and Sort Merge joins – difference? 라는 글에 기초하여 약간의 수정을 가한 것입니다. 1. Nested loop join (loop over loop) 이 알고리즘은 외부 루프와 내부 루프로 구성된다. 외부 루프는 몇몇의 엔트리로 구성되며, 외부 루프의 각 엔트리마다 내부 루프가 수행된다. 예) Select tab1.*, tab2.* from tabl, tab2 where [...]]]></description>
			<content:encoded><![CDATA[<p>이 글은 Sachin Arora의 <a href="http://oracle-online-help.blogspot.com/2007/03/nested-loops-hash-join-and-sort-merge.html">Nested loops, Hash join and Sort Merge joins – difference?</a> 라는 글에 기초하여 약간의 수정을 가한 것입니다.<br />
<span style="font-weight: bold;"><br />
1. Nested loop join (loop over loop)</span></p>
<p>이 알고리즘은 외부 루프와 내부 루프로 구성된다. 외부 루프는 몇몇의 엔트리로 구성되며, 외부 루프의 각 엔트리마다 내부 루프가 수행된다.</p>
<p class="MsoNormal"><o:p></o:p>예)</p>
<p class="MsoNormal">
<div style="border: 1px solid rgb(203, 203, 203); padding: 10px; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);" class="txc-textbox">
Select tab1.*, tab2.* from tabl, tab2 where tabl.col1=tab2.col2;</div>
<p>
이 SQL문은 다음과 같이 수행된다.</p>
<div style="border: 1px solid rgb(203, 203, 203); padding: 10px; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);" class="txc-textbox">
For i in (select * from tab1) loop</p>
<div style="margin-left: 4em;">
For j in (select * from tab2 where col2=i.col1) loop
</div>
<div style="margin-left: 8em;">
Display results;
</div>
<div style="margin-left: 4em;">
End loop;
</div>
<div>
End loop;</div>
</div>
<p></p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: -0.25in;"><o:p></o:p>Nested loop join의 수행에 포함되는 단계들은 다음과 같다.
</p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: -0.25in;">1) 외부 테이블 확인한다 (identify).
</p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: -0.25in;">2) 내부 테이블을 외부 테이블에 할당한다.
</p>
<p class="MsoNormal" style="margin-left: 0.5in; text-indent: -0.25in;">3) 외부 테이블의 각 행마다 내부 테이블의 전체 행들을 접근한다.
</p>
<p><span style="font-style: italic;">Optimizer는 언제 nested loop join을 사용하는가?</span></p>
<p>효율적인 join 조건으로 적은 수의 행을 담고 있는 테이블을 조인할 때 optimizer가 nested loop join을 사용한다. 외부 테이블의 각 행 마다 매번 내부 테이블의 전체 행을 확인하기 때문에 내부 테이블을 색인하는 것이 중요하다.</p>
<p>다음의 경우에는 nested loop join을 사용하지 않는다.</p>
<ol style="list-style-type: decimal;">
<li>조인하려는 테이블들의 크기가 클 때</li>
<li>내부 질의가 항상 같은 결과를 낼 때
</li>
<li>내부 테이블의 접근 경로가 외부 테이블의 데이터에 독립적일 때
</li>
</ol>
<p><!--[endif]--> <i style=""><u></u></i><br />
<span style="font-weight: bold;">2. Hash join</span></p>
<p>Hash join은 큰 데이블을 조인할 때 사용된다. Optimizer는 2개의 테이블 중 더 작은 테이블을 사용하여 메모리에 해쉬 테이블을 생성하고, 큰 테이블 전체를 스캔하면서 해쉬 값을 비교한다.</p>
<p>Hash join 알고리즘은 다음의 두 단계로 구성된다.</p>
<ol style="list-style-type: decimal;">
<li><span style="font-weight: bold;">Build</span> 단계: 두 테이블 중 더 작은 테이블로 해쉬 테이블을 메모리에 생성한다.</li>
<li><span style="font-weight: bold;">Probe</span> 단계: 큰 테이블을 스캔하면서 해쉬 값을 비교하여 join 되는 행을 찾는다.
</li>
</ol>
<p>간단하게 알고리즘을 적으면 다음과 같다.</p>
<p class="MsoNormal"><i style=""><u>Build 단계<o:p></o:p></u></i></p>
<p class="MsoNormal">
<div style="border: 1px solid rgb(203, 203, 203); padding: 10px; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);" class="txc-textbox">
For each row RW1 in small (left/build) table loop</p>
<div style="margin-left: 4em;">
Calculate hash value on RW1 join key
</div>
<div style="margin-left: 4em;">
Insert RW1 in appropriate hash bucket.
</div>
<div>
End loop;</div>
</div>
<p></p>
<p class="MsoNormal">
<p class="MsoNormal"><i style=""><u>Probe 단계</u></i></p>
<p class="MsoNormal">
<div style="border: 1px solid rgb(203, 203, 203); padding: 10px; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);" class="txc-textbox">
For each row RW2 in big (right/probe) table loop</p>
<div style="margin-left: 4em;">
<span style="">            </span>    Calculate the hash value on RW2 join key
</div>
<div style="margin-left: 4em;">
<span style="">            </span>    For each row RW1 in hash table loop
</div>
<div style="margin-left: 8em;">
  If RW1 joins with RW2
</div>
<div style="margin-left: 12em;">
  output (RW1, RW2)
</div>
<div style="margin-left: 4em;">
End loop;
</div>
<div>
End loop;</div>
</div>
<p style="font-style: italic;" class="MsoNormal">Optimizer는 언제 hash join을 사용하는가?</p>
<p class="MsoNormal">Optimizer는 조인하려는 테이블의 크기가 큰 경우에 사용한다. Nested loop와 다르게, hash join은 해쉬 테이블 생성 후에 join이 이루어지기 때문에 결과가 즉시 나오지 않는다.<br />
<i style=""><u><o:p></o:p></u></i></p>
<p class="MsoNormal">
<p>
<span style="font-weight: bold;">3. Sort merge join</span></p>
<p>Sort merge join은 두 개의 독립적인 데이터 소스를 조인하는 경우에 사용된다. 이 방법은 일반적으로 데이터의 크기가 큰 경우에 nested loop보다 성능이 좋지만 hash join만큼 좋지는 않다.</p>
<p>이 방법이 hash join보다 좋을 때는 join 조건으로 사용되는 열이 이미 정렬되어 있거나 정렬될 필요가 없을 때이다.</p>
<p>알고리즘은 다음과 같다.</p>
<p class="MsoNormal" style="margin-left: 0.5in;"><o:p></o:p></p>
<div style="border: 1px solid rgb(203, 203, 203); padding: 10px; background-color: rgb(132, 132, 132); color: rgb(255, 255, 255);" class="txc-textbox">
While not at the end of either input loop</p>
<div style="margin-left: 4em;">
<span style="">        </span>    If RW1 key == RW2 key
</div>
<div style="margin-left: 8em;">
Output (RW1, RW2)</div>
<div style="margin-left: 8em;">
Get next row R1 from input 1
</div>
<div style="margin-left: 8em;">
<span style="">                </span>    Get next row R2 from input 2
</div>
<div style="margin-left: 4em;">
<span style="">        </span>    Else if RW1 key &lt; RW2 key
</div>
<div style="margin-left: 8em;">
Get next row RW1 from input 1
</div>
<div style="margin-left: 4em;">
<span style="">        </span>    Else
</div>
<div style="margin-left: 8em;">
Get next row RW2 from input 2
</div>
<div>
<span style=""> </span>End loop;</div>
</div>
<p class="MsoNormal" style="margin-left: 0.5in;">
<p>
중요한 점은 외부 테이블의 행의 개수만큼 내부 테이블에 접근하여야 하는 nested loop join과는 다르게, sort merge join 알고리즘은 테이블의 각 행을 단 한 번씩만 접근한다. 따라서 데이터의 크기가 클 때 nested loop join보다 더 좋은 성능을 보인다.</p>
<p>Optimizer는 언제 sort merge join을 사용하는가?</p>
<ol style="list-style-type: upper-alpha;">
<li>join 조건이 부등 조건일 경우 (&lt;, &lt;=, &gt;=)에 사용한다. hash join은 부등 조건에 사용될 수 없고, 데이터의 크기가 큰 경우 nested loop join은 고려의 대상이 아니다.</li>
<li>&#8220;order by&#8221;와 같이, 만약 어떤 속성에 대하여 항상 정렬해야하는 경우, hash join보다 sort merge join이 더 좋은 성능을 보이기 때문에 optimizer는 sort merge join을 사용한다.
</li>
</ol>
<p><i style=""></i></p>
<p><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save"><img src="http://holik.org/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a> </p>]]></content:encoded>
			<wfw:commentRss>http://holik.org/2009/06/16/database%ec%97%90%ec%84%9c-%ec%82%ac%ec%9a%a9%eb%90%98%eb%8a%94-join-%ea%b8%b0%eb%b2%95%eb%93%a4/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

