<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
	<channel>
		<title><![CDATA[DB Research &amp; Study Group - www.bysql.net (with durinuri.com)]]></title>
		<link>http://bysql.net/</link>
		<description><![CDATA[]]></description>
		<language>ko</language>
		<pubDate>Fri, 24 Apr 2026 18:41:17 +0900</pubDate>
		<lastBuildDate>Fri, 24 Apr 2026 18:41:17 +0900</lastBuildDate>
		<generator>XpressEngine</generator>
								<item>
			<title><![CDATA[2.3.4. 해쉬 (Hash) 조인]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=548</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=548</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=548#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;&nbsp;&lt;br  /&gt;p 565 - 605&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.4. 해쉬 (Hash) 조인&lt;/b&gt;&lt;br  /&gt;데이터 처리범위가 초기보다 초대형으로 증가하면서 Sort Merge로 처리할수 없는 수준에 까지 도달&lt;br  /&gt;해쉬조인이 랜덤와 정렬의 부담을 벗어나게 할수 있는 원리를 알필요가 있음&lt;br  /&gt;- 인덱스를 경유하여 랜덤을 하지 않고 해쉬함수를 이용한 연결을 수행&lt;br  /&gt;- 파티션 단위로 처리하기 때문에 대량의 처리에 수행속도가 급격히 상승하지 않음&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;해쉬영역(Hash Area)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 해쉬조인을 수행하기 위해 메모리 내에 만들어진 영역&lt;br  /&gt;- 비트맵 백터 ; 먼저 액세스 하는 빌드 입력의 유일한 값을 생성해 두었다가 나중에 검색하는 검색입력을 필터링&lt;br  /&gt;&nbsp;&nbsp; 해쉬테이블 ; 파티션들의 위치정보를 가지고 있으며 조인의 연결 작업을 수행하거나 디스크의 파티션 짝들을 찾는데 사용&lt;br  /&gt;&nbsp;&nbsp; 파티션테이블 ; 여러개의 파티션이 존재, 조인할 집합의 실제 로우들을 가짐&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;b&gt;&lt;i&gt;파티션 (Partition)&lt;/i&gt;&lt;/b&gt;&lt;/u&gt;&lt;br  /&gt;- 파티션을 결정하기 위해 수행하는 첫번째 해쉬함수가 리턴한 동일한 해쉬값을 갖는 묶음 (동일한 해쉬갑을 갖는 로우들의 버캣)&lt;br  /&gt;- Fan-out ; 인메모리에서 작업이 불가능하여 만들어진 파티션의 수&lt;br  /&gt;- 하나의 파티션은 여러개의 클러스터로 분리&lt;br  /&gt;- 2차 해싱을 하면 저장할 클러스터의 위치가 결정( I/O의 단위, 검색 단위 로활용)&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;클러스터(Cluster)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 파티션의 분할&lt;br  /&gt;- 연속된 블록으로 이루어지며 디스크와 I/O를 하는 단위&lt;br  /&gt;- Hash_multiblock_io_count에 의해 동시 I/O 양 결정&lt;br  /&gt;- 해쉬테이블을 만들어 해당 클러스터를 찾고 클러스터를 스캔하여 원하는 로우와 연결&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;빌드입력(Build Input)과 검색입력(Probe Input)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 빌드입력 ; 조인을 위해 먼저 액세스하여 필요한 준비를 처리&lt;br  /&gt;- 검색입력 ; 액세스하면서 조인을 수행하는 처리(검정 혹은 검색입력)&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;인-메모리(In-Memory) 해쉬조인과 유예 해쉬조인&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 인메모리 해쉬조인 ; 빌드입력이 해쉬영역에 모두 위치할수있는 경우 수행&lt;br  /&gt;- 유예 해쉬조인 ; 빌드입력이 해쉬영역에 모두 위치할수 없는 경우 수행&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;비트맵 백터(Bitmap Vector)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 빌드입력에 대해 파티션을 구하는 작업중에 생성&lt;br  /&gt;- 빌드입력값들에 대한 유일한 값을 메모리 내의 해쉬영역에 정의하는것( 검색입력의 파티션 생성작업시 필터링에사용)&lt;br  /&gt;- 해쉬영역에 만들어지는 비트맵 벡터는 빌드 입력의 전체 집합에 대해서 생성&lt;br  /&gt;&nbsp;(처리대상이 커서 해쉬영역을 초과하여 임시 세그먼트에 저장하게 되더라도 처리할 빌드 입력의 모든 집합에 대해 조인 종료시까지 유지)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;해쉬 테이블(Hash Table)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 메모리 내에 생성&lt;br  /&gt;- 조인의 연결 작업에서 대응되는 로우를 찾기 위한 해쉬 인덱스로 사용 (조인수행시 임시적으로 생성)&lt;br  /&gt;- 해쉬값과 해쉬 클러스터의 주소를 보유&lt;br  /&gt;- 검색입력에 있는 연결고리 값으로 해쉬키 값을 찾고, 그곳에 있는 클러스터 주소를 이용해 해당 클러스터를 찾아 스캔&lt;br  /&gt;- 해당 처리 단위의 빌드 입력에 대해서만 정보를 가지고 있음 (연결작업을 위한 인덱스 개념)&lt;br  /&gt;
&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;파티션 테이블 (Partition Table)&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;- 빌드입력이 메모리 크기를 초과하여 파티션을 생성하게 되면 관련정보가 저장되는곳&lt;br  /&gt;- 디스크의 임시세그먼트로 이동하면 그 위치정보 또한 보유&lt;br  /&gt;- 같은 묵음으로 처리되는 단위마다 파티션의 크기의 합이 적은 집합을 빌드입력으로, 나머지는 검색입력의 역할&lt;br  /&gt;- 동적 역할 반전 (Dynamic Role Reverse) ; 처리 되는 단위마다 동적으로 역할이 변함&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;&lt;br  /&gt;
2.3.4.1. 인-메모리 해쉬조인&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;img src=&quot;http://bysql.net/files/attach/images/166/548/INMEMORYHASH.PNG&quot; alt=&quot;INMEMORYHASH.PNG&quot; width=&quot;600&quot; height=&quot;376&quot; style=&quot;&quot; /&gt;
&lt;br  /&gt;&lt;br  /&gt;&lt;i&gt;&lt;br  /&gt;
* 빌드입력; 빨간색(통계정보를 참조하여 효과적인 카디널리티를 갖는 집합선택)&lt;/i&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;- 조인의 연결을 위해서 기존의 인덱스를 전혀 사용하지 않음 (인라인뷰에서 가공한집합과 조인하는경우 유용)&lt;br  /&gt;- 부분처리가 가능 (빌드 입력이 처리범위를 줄여줄수있거나 소형인경우에는 유용)&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.4.2. 유예 해쉬조인&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;- 빌드 입력이 해쉬영역을 최과하게 되면 디스크에저장하여 처리&lt;br  /&gt;- 인-메모리의 처리과정에 임시 세그먼트를 생성하여 디스크상에 위치시켜가면서 처리시키는 과정이 추가&lt;br  /&gt;- 연결을 수행할수 없는 파티션들을 디스크로 이동&lt;br  /&gt;&lt;br  /&gt;- 미리 생성되어 있는 인덱스를 사용하지 않음&lt;br  /&gt;- 부분범위 처리가 불가능하게됨&lt;br  /&gt;- 해쉬조인이 소트머지 조인보다 더많은 메모리 영역을 필요 (처리량에 따라 손익의 차이가 나는 시점이 존재)&lt;br  /&gt;- SORT MERGE조인과 해쉬조인의 큰차이가 나지 않는경우 해쉬조인은 추가적인 SORT과정이 필요할수 있음&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;&lt;br  /&gt;
2.3.5.세미(Semi) 조인&lt;/b&gt;&lt;br  /&gt;- 서브쿼리를 사용했을 대 메인쿼리와의 연결하는 처리&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.5.1. 세미조인의 개념 및 특징&lt;/b&gt;&lt;br  /&gt;- 서브쿼리를 사용했을 때 메인 쿼리와의 연결을 하기 위해 적용되는 광범위한 유사 조인을 의미&lt;br  /&gt;- 조인은 동일한 동급상에 위치 서브쿼리는 주종관계를 가짐&lt;br  /&gt;- 조인은 집합의 곱 1*1=1, 1*M=M, M*1=M,M*M=MM(카티젼곱) 과 동일한 결과집합을 가짐&lt;br  /&gt;- 세미조인은 메인쿼리의 결과집합과 동일&lt;br  /&gt;- 서브쿼리는 메인쿼리의 컬럼을 마음대로 사용할수있지만 메인쿼리는 서브쿼리의 집합에 잇는 컬럼들을 사용할수 없음&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.5.2. 세미조인의 실행계획&lt;/b&gt;&lt;br  /&gt;&lt;b&gt;가) Nested Loops 형 세미조인&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;- 서브쿼리가 &#039;제공자&#039; 역할을 할수도 &#039;확인자&#039; 역할을 할수도 있음&lt;br  /&gt;- 메인쿼리 집합의 보호&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;제공자&lt;/b&gt;&lt;br  /&gt;SELECT COL1,COL2,...&lt;br  /&gt;FROM TAB1 x&lt;br  /&gt;WHERE KEY1 IN (SELECT KEY2 FROM TAB2 y&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHERE y.COL1 ... AND y.COL2 ... );&lt;br  /&gt;&lt;br  /&gt;&lt;i&gt;&lt;b&gt;실행계획&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;&lt;br  /&gt;NESTED LOOPS&lt;br  /&gt;&nbsp;&nbsp;&nbsp; VIEW&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;SORT (UNIQUE) &lt;/b&gt;&lt;i&gt;---&gt; 메인 쿼리 집합을 보호&lt;/i&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS BY ROWID OF TAB2&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX RANGE SCAN OF COL1_IDX&lt;br  /&gt;TABLE ACCESS BY ROWID OF TAB1&lt;br  /&gt;&nbsp;&nbsp;&nbsp; INDEX RANGE SCAN OF KEY1_IDX&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;확인자&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;SELECT 사번,성명,직급,입사일,....&lt;br  /&gt;FROM 사원 X&lt;br  /&gt;WHERE 부서=&#039;경리과&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND 사번 IN (SELECT 사번 FROM 가족 y&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHERE y.사번=x.사번&lt;b&gt;&lt;i&gt; &lt;-- 논리적으로 종속시킴&lt;/i&gt;&lt;/b&gt; (실행에는 필요없음)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND y.생년월일 &lt; &#039;20050101&#039;);&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;i&gt;&lt;b&gt;실행계획&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;&lt;br  /&gt;FILTER&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;사원&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;부서_INDEX&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;가족&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;PK_INDEX&#039;&lt;br  /&gt;&lt;br  /&gt;SUB쿼리에 메인쿼리 집합의 컬럼을 종속시키게 되면 서브쿼리가 우선 실행되게 되어&lt;br  /&gt;경우에 따라 실행계획의 비효율이 발생할수도 있다.&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;나) Sort Merge 형 세미조인&lt;/b&gt;&lt;br  /&gt;연결고리의 이상이 발생하거나 대량의 데이터를 연결해야 할 때는 세미조인역시 SORT MERGE형 조인이 적용될수 있음&lt;br  /&gt;&lt;br  /&gt;실행계획의 예&lt;br  /&gt;&lt;br  /&gt;SELECT STATEMENT&lt;br  /&gt;&nbsp;&nbsp;&nbsp; MERGE JOIN&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (JOIN)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;사원&#039;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;SORT (JOIN)&lt;/b&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (&lt;b&gt;UNIQUE&lt;/b&gt;)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;근태&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;유형_일자_IDX&#039; (NON-UNIQUE)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;다) 필터(Filter)형 세미조인&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;먼저 수행하여 액세스한 결과를 서브쿼리를 통해 체크하여 취할것인지 아니면 버려야 할것인지를 결정하는 역할&lt;br  /&gt;버퍼내에 이전의 값을 저장해 두었다가 대응되는 집합을 액세스하기 전에 먼저 저장된값과 비교함으로 액세스를 최소화&lt;br  /&gt;EXISTS를 사용한 서브쿼리에서 대부분 나타남(언제나 확인자 역할만 가능함)&lt;br  /&gt;&lt;br  /&gt;SELECT ... FROM ORDER x&lt;br  /&gt;WHERE ORDDATE LIKE &#039;200506%&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; EXISTS (SELECT &#039;X&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM DEPT y&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE y.DEPTNO = x.SALDEPT&nbsp; and y.TYPE1 = &#039;1&#039;)&lt;br  /&gt;&lt;i&gt;&lt;b&gt;&lt;br  /&gt;
실행계획&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;FILTER&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;ORDER&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;ORDDATE_INDEX&#039; (NON_UNIQUE)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;DEPT&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF &#039;DEPT_PK&#039; (UNIQUE)&lt;br  /&gt;&lt;br  /&gt;필터 처리는 연결을 시도하다가 성공하는 로우를 만나면 연결작업을 멈춤&lt;br  /&gt;버퍼를 이용한 처리를 하여 랜덤 액세스 양을 최소화&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;라) 해쉬(Hash)형 세미조인&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;SELECT ... FROM ORDER x&lt;br  /&gt;WHERE ORDDATE LIKE &#039;200506%&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; EXISTS (SELECT &lt;b&gt;/*+ HASH_SJ(x,y) */&nbsp;&lt;/b&gt; &#039;X&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM DEPT y&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE y.DEPTNO = x.SALDEPT&nbsp; and y.TYPE1 = &#039;1&#039;)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;i&gt;&lt;b&gt;실행계획&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;HASH JOIN SEMI&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;ORDER&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;ORDDATE_INDEX&#039; (NON_UNIQUE)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;DEPT&#039;&lt;br  /&gt;&lt;br  /&gt;서브쿼리는 하나의 테이블만 존재&lt;br  /&gt;서브뭐리내에 또다시 서브쿼리를 사용했을 경우 사용불가&lt;br  /&gt;연결고리 연산자는 반드시 &#039;=&#039; 이어야 함&lt;br  /&gt;서브쿼리내에 GROUP BY,CONNECT BY, ROWNUM 을 사용할수 없음 (버전에 따라 다름)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;마) 부정(Anti)형 세미조인&lt;/b&gt;&lt;br  /&gt;알지 못하는 값을 가지고 인덱스를 적용할 수 없기 때문에 연결 작업이 수행된다면 매우 심각한 부담이 발생&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;머지 부정형 조인으로 유도&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;SELECT COUNT(*) FROM TAB1&lt;br  /&gt;WHERE COL1 LIKE &#039;ABC%&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and COL2 IS NOT NULL&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and COL2 NOT IN (SELECT &lt;b&gt;/*+ MERGE_AJ */ &lt;/b&gt;FLD2&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM TAB2&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE FLD3 between &#039;20050101&#039; and &#039;20050131&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; and FLD2 IS NOT NULL);&lt;br  /&gt;&lt;br  /&gt;&lt;i&gt;&lt;b&gt;실행계획&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;SELECT STATEMENT Optimizer=FIRST_ROWS&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &lt;b&gt;MERGE JOIN (ANTI)&lt;/b&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (JOIN)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;TAB1&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;COL1_INDEX&#039; (NON-UNIQUE)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (UNIQUE)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;TAB2&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;FLD3_INDEX&#039; (NON-UNIQUE)&lt;br  /&gt;&lt;br  /&gt;- 반드시 NOT IN 을 사용, 비용기준 옵티마이져, NOT NULL 이 보장&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;해쉬 부정형 조인으로 유도&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;SELECT COUNT(*) FROM TAB1&lt;br  /&gt;WHERE COL1 LIKE &#039;ABC%&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and COL2 IS NOT NULL&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and COL2 NOT IN (SELECT &lt;b&gt;/*+ HASH_AJ */ &lt;/b&gt;FLD2&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM TAB2&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE FLD3 between &#039;20050101&#039; and &#039;20050131&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; and FLD2 IS NOT NULL);&lt;br  /&gt;&lt;br  /&gt;&lt;i&gt;&lt;b&gt;실행계획&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;SELECT STATEMENT Optimizer=FIRST_ROWS&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &lt;b&gt;HASH JOIN (ANTI)&lt;/b&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;TAB1&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;COL1_INDEX&#039; (NON-UNIQUE)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;TAB2&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;FLD3_INDEX&#039; (NON-UNIQUE)&lt;br  /&gt;
&lt;br  /&gt;
&lt;br  /&gt;
-&#039;NOT IN&#039; 만가능&lt;br  /&gt;
- NOT NULL 이라는 전제가 있을때만 가능 (HASH조인과 같은방법으로 처리하다가 성공여부 결정만 반대로 수행)&lt;br  /&gt;
- 긍정형연산에서는 NULL은 어차피 찾는 값이 아니므로 문제 될것이 없음&lt;br  /&gt;
- 부정형에서는 NULL이 비교연산에서 무시되어 원하는값과는 달라질수 있음&lt;br  /&gt;
&lt;br  /&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Sun, 13 Sep 2009 15:00:18 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[2.3. 조인 종류별 특징및 활용 방안]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=545</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=545</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=545#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;&nbsp;534-564&lt;br  /&gt;&lt;b&gt;2.3. 조인 종류별 특징및 활용 방안&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;조인은 크게 두가지 분류로 나눌수 있다.&lt;br  /&gt;- 어떤 집합을 먼저 액세스 하여 상수값을 만들고 그것을 이용해 대응되는 집합을 찾아가는것 (Nested Loops)&lt;br  /&gt;- 서로 연결하기 좋도록 미리 소정의 선행작업을 수행한 다음 서로를 대응 시켜 가는 방법 (Sort Merge)&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.1. Nested Loops 조인&lt;/b&gt;&lt;br  /&gt;- 가장 전통적인 조인방법이다.&lt;br  /&gt;- 먼저 액세스한 결과를 다음의 액세스에 상수값으로 제공해준다.&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.1.1. Nested Loops 조인의 기본개념&lt;/b&gt;&lt;br  /&gt;&lt;b&gt;가) Nested Loops 조인의 특징&lt;/b&gt;&lt;br  /&gt;- 순차적 &lt;br  /&gt;( Driving TABLE의 처리범위에 있는 각각의 로우와 테이블간의 연결모두 순차적)&lt;br  /&gt;- 선행적&lt;br  /&gt;( 초기 액세스 테이블의 처리범위에 의해 처리량이 결정)&lt;br  /&gt;- 종속적&lt;br  /&gt;( 나중에 처리되는 테이블은 앞서 처리된 값을 받아 액세스)&lt;br  /&gt;- 랜덤 액세스&lt;br  /&gt;( 선행테이블은 첫번째 경우만 랜덤, 연결테이블은 모두 랜덤 액세스로 수행)&lt;br  /&gt;- 선택적&lt;br  /&gt;( 연결되는 방향에 따라 사용되는 인덱스들이 전혀 달라짐)&lt;br  /&gt;- 방향성, 연결고리 상태&lt;br  /&gt;( 연결고리의 인덱스 유무에 따라 액세스 방향및 수행속도에 많은 차이 발생)&lt;br  /&gt;- 부분범위 처리 가능&lt;br  /&gt;( 부분범위 처리 조건을 만족하면 운반단위가 채워지는 순간에 우선 멈출수 있음&lt;br  /&gt;- 체크조건의 영향력&lt;br  /&gt;( 부분범위의 경우 조건이 넓으면 운반단위를 빨리채우므로 빨리 수행&lt;br  /&gt;&nbsp;&nbsp; 전체범위 처리일 경우 가공할 대상이 많아지므로 수행속도가 나빠짐)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;나) Nested Loops 조인의 적용 기준&lt;/b&gt;&lt;br  /&gt;- 부분범위 처리 &lt;br  /&gt;- 조인되는 한쪽이 상대방 테이블의 결과를 제공받아야만 처리범위를 줄일수 있는 상황일 경우&lt;br  /&gt;- 처리량이 적은 경우 (많다면 부분처리)&lt;br  /&gt;- 연결고리에 이상이 없는 경우&lt;br  /&gt;- 먼저 수행한 집합의 처리범위의 크기와 얼마나 많은 처리 범위를 미리 줄여 줄 수 있느냐가 수행속도에 영햘을 미침&lt;br  /&gt;- 운반단위의 크기가 수행속도에 상당한 영향을 미침&lt;br  /&gt;- 대용량 처리일시라도 메모리 사용이 부담될경우 유리 (Sort조인 이나 해쉬조인은 과도하게 메모리 사용을 요구)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.1.2. Nested Loops 조인의 순서결정&lt;/b&gt;&lt;br  /&gt;- 어떤순서로 수행되느냐에 따라 조인의 효율이 달라짐&lt;br  /&gt;&lt;br  /&gt;SELECT ......&lt;br  /&gt;FROM TAB x, TAB2 y, TAB3 z&lt;br  /&gt;WHERE x.A1 = y.B1&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND z.C1 = y.B2&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND x.A2 = y.B2&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND x.A2 = &#039;10&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND y.B2 LIKE &#039;AB%&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;(1) TAB1 - TAB2 -TAB3&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;div&gt;&lt;table class=&quot;&quot; id=&quot;r938&quot; border=&quot;1&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot; width=&quot;674&quot; height=&quot;108&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;순서&lt;br  /&gt;&lt;/td&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;ACCESS PATH&lt;br  /&gt;&lt;/td&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;설명&lt;br  /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TAB1 x&lt;br  /&gt;TAB2 y&lt;br  /&gt;TAB3 z&lt;br  /&gt;&lt;/td&gt;&lt;td&gt;A2=&#039;10&#039;&lt;br  /&gt;B1=A1 and B2 LIKE &#039;AB%&#039;&lt;br  /&gt;C1=B2&lt;br  /&gt;&lt;/td&gt;&lt;td&gt;x.A1=y.B1 은 y가 아직 액세스 되지않았음&lt;br  /&gt;z.C1=y.B2 의경우 z가 아직 액세스 되지 않았음&lt;br  /&gt;이미 x 와 y가 액스세 되어있으므로 선택&lt;br  /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;(2) TAB2 - TAB3 - TAB1&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;table class=&quot;&quot; id=&quot;f-ek&quot; border=&quot;1&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot; width=&quot;674&quot; height=&quot;108&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;순서&lt;br  /&gt;&lt;/td&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;ACCESS PATH&lt;br  /&gt;&lt;/td&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;설명&lt;br  /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TAB2 y&lt;br  /&gt;TAB3 z&lt;br  /&gt;TAB1 x&lt;/td&gt;&lt;td&gt;B2 LIKE &#039;AB%&#039;&lt;br  /&gt;C1=B2&lt;br  /&gt;A1=B1 and A2=&#039;10&#039;&lt;/td&gt;&lt;td&gt; y 중 상수값을 가진 값만 선택됨&lt;br  /&gt;y 가 이미 액세스 되었으므로 선택&lt;br  /&gt;이미 y와 z가 액세스 되어있으므로 x와 조인된 모든것 선택&lt;br  /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;(3) TAB3 - TAB2 - TAB1&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;table class=&quot;&quot; id=&quot;k6dk&quot; border=&quot;1&quot; bordercolor=&quot;#000000&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot; width=&quot;674&quot; height=&quot;108&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;순서&lt;br  /&gt;&lt;/td&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;ACCESS PATH&lt;br  /&gt;&lt;/td&gt;&lt;td style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;설명&lt;br  /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TAB3 z&lt;br  /&gt;TAB2 y&lt;br  /&gt;TAB1 x&lt;/td&gt;&lt;td&gt;FULL TABLE SCAN&lt;br  /&gt;B2=C1 and B2 LIKE &#039;AB%&#039;&lt;br  /&gt;A1=B1 and A2=&#039;10&#039;&lt;/td&gt;&lt;td&gt;z 의 유일한 조건인 z.c=y.b2 처리 불가능 z를 전체다 읽음&lt;br  /&gt;z 가 이미 액세스 되므로 z와 조인과 y의 상수대입 조건 수행&lt;br  /&gt;x 와 관련된 조건 수행&lt;br  /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br  /&gt;각각의 조건은 주어진 환경에 따라 성능이 달라진다.&lt;br  /&gt;자신의 처리범위를 줄여줄 수있는 다른 집합들이 액세스 된후에나&lt;br  /&gt;자신이 먼저 처리범위를 줄여줄 수 있다면 그들보다 먼저 수행도도록 하는것이 가능하면 좋다.&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.2. Sort Merge 조인&lt;/b&gt;&lt;br  /&gt;조인할 집합들을 정렬한후 서로 연결하여 수행&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;가) Sort Merge 조인의 특징&lt;/b&gt;&lt;br  /&gt;1) 동시적 &lt;br  /&gt;( 상대 집합의 처리결과와 상관없이 자신이 보유한 처리조건만 가지고 액세스하여 정렬을 완료한후 머지 수행)&lt;br  /&gt;2) 독립적&lt;br  /&gt;( 자신에게 주어진 상사값에 의해서만 범위를 줄임)&lt;br  /&gt;3) 전체범위 처리&lt;br  /&gt;( 정렬이 완료된 후에라야 조인을 시작할수 있음)&lt;br  /&gt;4) 스캔방식&lt;br  /&gt;( 스캔방식으로 처리)&lt;br  /&gt;5) 선택적&lt;br  /&gt;( 연결고리가 되는 컬럼은 인덱스를 전혀 사용하지 않음)&lt;br  /&gt;6) 무방향성&lt;br  /&gt;(조인의 방향과는 거의 무관)&lt;br  /&gt;7) 자신의 처리범위를 줄이기위해 인덱스는 한가지만 사용되고 나머지는 머지 작업대상을 줄여주기 때문에 중요함&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;나) Sort Merge 조인의 적용기준&lt;/b&gt;&lt;br  /&gt;1) 전체처리로만 가능한 형태일 경우 검토&lt;br  /&gt;2) 상대 테이블에서 값을 받지 않고도 처리범위를 줄일수 있다면 효과가 큼&lt;br  /&gt;3) 스캔방식의 처리로 많은 양의 랜덤 액세스를 줄일수 있다.&lt;br  /&gt;4) 연결고리 이상 상태에 영향을 받지 않음&lt;br  /&gt;5) 자신의 처리범위를 줄여줄수 있는 인덱스 구성이 중요&lt;br  /&gt;6) 운반단위의 크기가 수행속도에 영향을 미치지 않음&lt;br  /&gt;7) 온라인 상태에서는 NL이 유리&lt;br  /&gt;8) 옵티마이져가 &#039;ALL_ROWS&#039;일경우 &#039;SORT MERGE 조인&#039; 이나 &#039;해쉬조인&#039;의 실행계획이 자주 수립됨&lt;br  /&gt;9) 충분한 메모리 활용이 가능하고 병렬처리를 통해 빠르게 정렬작업이 가능한경우&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.3.3. Nested Loops 조인과 Sort Merge 조인의 비교&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;1)&lt;/b&gt; &lt;b&gt;조건처리&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;SELECT a.FLD1, ..., b.COL1 ...&lt;br  /&gt;FROM TAB1 a, TBA2 b&lt;br  /&gt;WHERE a.KEY1 = b.KEY2&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND a.FLD1 = &#039;111&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND a.FLD2 like &#039;AB%&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &lt;span style=&quot;background-color: rgb(153, 153, 153);&quot;&gt;AND b.COL1=&#039;10&#039;&nbsp; &lt;span style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;---&gt; &lt;b&gt;삭제 &lt;/b&gt;&lt;/span&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;background-color: rgb(255, 255, 255);&quot;&gt;&lt;b&gt;&lt;i&gt;Nested Loops&lt;/i&gt;&lt;/b&gt;&lt;br  /&gt;
- 삭제된 조건은 최종적으로 체크하는 역할을 수행하므로 일의양에는 큰차이가 없음&lt;br  /&gt;
&nbsp; 부분처리의 경우 운반단위가 빨리 채워졌으므로 더 유리&lt;br  /&gt;
&lt;br  /&gt;
&lt;b&gt;&lt;i&gt;Sort Merge&lt;/i&gt;&lt;/b&gt;&lt;br  /&gt;
- TAB2의 범위를 줄여주는 역할이었지만 삭제되었으므로 TAB2를 FULL SCAN후 정렬&lt;br  /&gt;
&nbsp;&nbsp; 머지할 양의 증가&lt;br  /&gt;
&lt;b&gt;&lt;br  /&gt;
2) 전체 범위 처리의경우&lt;/b&gt;&lt;br  /&gt;
&lt;br  /&gt;
SELECT a.Fld1, ...,b.COL1, ...&lt;br  /&gt;
FROM TAB1 a, TAB2 b&lt;br  /&gt;
WHERE a.KEY1=b.KEY2&lt;br  /&gt;
ORDER BY a.FLD5, b.COL5;&lt;br  /&gt;
&lt;br  /&gt;
&lt;i&gt;&lt;b&gt;Nested Loops&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;
- TAB1 (어느한쪽도 될수있음) 이 먼제 전체 테이블을 스캔&lt;br  /&gt;
- KEY1에 따라 KEY2인덱스에서 찾아 TAB2의 해당 로우를 액세스&lt;br  /&gt;
- 전체 테이블을 대상으로 랜덤 액세스 발생 (대량의 랜덤액세스)&lt;br  /&gt;
- ORDER BY 가 없다면 운반단위처리가 가능해져 수행속도가 빨라 질수 있다&lt;br  /&gt;
&lt;br  /&gt;
&lt;i&gt;&lt;b&gt;Sort Merge 조인&lt;/b&gt;&lt;/i&gt;&lt;br  /&gt;
- 각각의 테이블마다 전체 테이블 스캔이 발생하여 연결고리가 되는 컬럼으로 정렬 후 머지&lt;br  /&gt;
- 대량의 랜덤 액세스 발생이 없음 (NL 조인보다 유리)&lt;br  /&gt;
- Sort area size의 크기가 적으면 정렬작업에 대한 부하로 인해 NL보다 늦어질수도 있음&lt;br  /&gt;
&lt;br  /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;/div&gt;]]></description>
						<pubDate>Sat, 12 Sep 2009 17:16:20 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[2부 2.3.(2.3.6-2.3.8) 조인 종류별 특징 및 활용 방안(스타조인, 비트맵조인인덱스)]]></title>
			<dc:creator><![CDATA[balto]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=540</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=540</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=540#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;!--StartFragment--&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;2.3. 조인 종류별 특징 및 활용방안&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;2.3.6. 스타조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인되는 집합들 간의 관계가 별처럼 생긴 형태이다(텍스트 그림 참조)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SALES(&lt;u style=&quot;text-underline: #000000 single&quot;&gt;salesno&lt;/u&gt;, product_cd, dept_no, country_cd, type_cd, ...)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;PRODUCTS(&lt;u style=&quot;text-underline: #000000 single&quot;&gt;product_cd&lt;/u&gt;, ...)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;DEPT(&lt;u style=&quot;text-underline: #000000 single&quot;&gt;dept_no&lt;/u&gt;, ...)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;COUNTRY(&lt;u style=&quot;text-underline: #000000 single&quot;&gt;country_cd&lt;/u&gt;, ...)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TYPES(&lt;u style=&quot;text-underline: #000000 single&quot;&gt;type_cd&lt;/u&gt;, ...)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 여러 개의 디멘전(dimension) 테이블이 있을 때 이들 각각을 팩트테이블(fact table)에 연결시켜서는 안된다는 개념이다. 마스터테이블을 중심으로 테이블을 조인하되 마스터 테이블의 투플 수를 얼마나 줄여 가느냐가 중요한 포인트이다. 마스터테이블에 결합인덱스를 적절하게 구성하는 것이 중요하다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 해결해야할 문제점 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 마스터테이블의 디멘전 테이블 간에는 릴레이션이 없기 때문에 특별한 방법을 동원하여 디멘전테이블 간의 연결을 먼저 시도할 수 없다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 최적화로 액세스할 수 있는 인덱스의 구성이 중요하다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 스타조인은 디멘전의 카티젼 곱이 지나치게 많지 않을 때 사용한다.(MERGE JOIN(CARTESIAN))&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- (예) DEPT와 PRODUCTS를 먼저 조인한다는 SALES 테이블과 조인하는 예(* DEPT_NO+PRODUCT_CD 인덱스가 존재한다면 HASH JOIN 대신 NESTED LOOP 조인이 사용된다.)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT Optimizer=ALL_ROWS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;MERGE JOIN(CARTESIAN)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULL) OF &#039;DEPT&#039;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;BUFFER(SORT)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULL) OF &#039;PRODUCTS&#039;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULL) OF &#039;SALES&#039;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;2.3.7. 스타변형조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- (많이 생략하였습니다....)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 스타조인의 단점을 개선하기 위한 방법이다. 비트맵 인덱스의 특징을 살린다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 비트맵을 이용한 인덱스머지를 한다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 예제(교재참조) - &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;생략&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 스타변형조인이 일어나기 위한 전제 조건&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 하나의 팩트 테이블과 2개 이상의 디멘전테이블&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 팩트 테이블에 있는 디멘전 속성(디멘전 테이블의 외부키)에 비트맵 인덱스 존재&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(B-tree 인덱스가 있어도 비트맵 컨버전이 일어나서 스타변형조인이 발생 가능)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(3) 팩트테이블에 통계정보가 생성되어 있어야 함.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(4) Star_transformation_enabled 인자가 True 혹은 Temp_disable로 설정&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(아니면 직접 STAR_TRANSFORMATION 힌트를 준다)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 스타변형 조인의 제약조건 7가지(교재 참조)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 옵티마이저가 스타변형조인을 하지 않는 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 팩트 테이블이 가진 조건만으로도 충분히 처리범위가 줄어들 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 팩트 테이블 크기가 너무 작아 스타변형조인이 필요없다고 판단될 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;2.3.8. 비트맵 조인 인덱스&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 비트맵 조인 인덱스 사용방법&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 생성 : 생성된 인덱스는 cust_job 속성이 SALES 팩트 테이블 컬럼처럼 인식된다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;CREATE BITMAP INDEX sales_cust_job_bix ON sales(customers.cust_job)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM sales, customer&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE sales.cust_id=customer.cust_id&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;LOCAL LOGGING COMPUTE STATISTICS;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인시 인덱스 생성 집합이 보존되기 위한 조건&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 인덱스를 생성하는 테이블에 조인되는 테이블의 속성은 기본 키이거나 유일성 제약을 가져야 한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 참조테이블의 조인키가 결합인덱스로 구성되어 있으면 모든 컬럼이 조인에 존재해야한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(3) 조인조건은 반드시 = 조건이어 야하며 아우터조인은 사용할 수 없다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(4) 인덱스일체형 테이블이나 임시테이블과는 비트맵 조인인덱스를 생성할 수 없다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(5) 인덱스를 생성하는 조인 문에 집합연산, 집계함수, GROUP, ORDER, CONNECTED 문을 사용할 수 없다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(6) 인덱스 컬럼은 반드시 조인되는 테이블에 소속된 컬럼이어야 한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(7) 비트맵 조인인덱스는 비트맵 인덱스의 각종 규칙을 준수하여야 한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 비트맵 조인인덱스의 제약사항&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 병렬 DML 처리는 비트맵 조이인덱스를 가지는 테이블에서만 지원된다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 비트맵 조인인덱스를 사용하면 어떤 트랜잭션에서 동시에 하나의 테이블만 처리해야한다. 조인된 테이블이 COMMIT되지 않은 상태에서 동시에 변경되면 일관성을 보장할 수 없다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(3) 조인 문장에서 동일한 테이블이 두 번 등장할 수 없다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;-- 정말 미리 읽어야할 규칙들이 많네요!! 어설프게 알아서 사용하는 것이 위험할 수도... &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Mon, 07 Sep 2009 23:21:33 +0900</pubDate>
									<slash:comments>1</slash:comments>
					</item>
				<item>
			<title><![CDATA[제2부 2장 조인의 최적화 방안]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=531</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=531</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=531#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;495~513 페이지 까지의 내용입니다. ^^&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br  /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;제2부 2장 조인의 최적화 방안&lt;/b&gt;&lt;br  /&gt;관계형 DB는 집합의 개념의로 자료를 처리하여 그 형태 및 연산자의 활용에의해 다양하게 사용되어질수 있으며&lt;br  /&gt;각 테이블간의 물리직 연결과는 산관없이도 조인에 의해 자료의 연결이 쉽게 이루어질수있다&lt;br  /&gt;하지만 조인의 무분별한 사용은 수행속도의 문제를 가져올수 있으므로 조인의 구체적인 처리 절차와 핵세스 효율등을 알아야한다.&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;2.1. 조인과 반복 연결(LOOP QURY) 비교&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;join은 다양한 처리방법을 가지고 있고 그 처리방법에 따라 수행시간의 차이가 많이 나타날수 있다.&lt;br  /&gt;loop의경우 비교형식으로 처리되기 때문에 예상과 비슷한 시간을 확보할수 있다. 하지만&lt;br  /&gt;정확한 join의 처리방법을 활용하여 처리하면 loop와는 비교할수 없는 속도 향상을 가져올수 있다.&lt;br  /&gt;그러므로 데이터 처리의 대부분을 조인을 통해 declare에서 처리하고, 아주 특수한 경우의 처리만 loop에서 처리하도록 하는것이&lt;br  /&gt;최선의 방법중 하나라 할수 있다.&lt;br  /&gt;&lt;b&gt;&lt;br  /&gt;2.1.1. 전체 범위 처리 방식에서의 비교&lt;/b&gt;&lt;br  /&gt;&lt;img src=&quot;http://bysql.net/files/attach/images/166/531/JOIN_LOOP.png&quot; alt=&quot;JOIN_LOOP.png&quot; width=&quot;600&quot; height=&quot;381&quot; style=&quot;&quot; /&gt;
&lt;br  /&gt;&lt;br  /&gt;예1)&lt;br  /&gt;&lt;br  /&gt;[조인처리]&lt;br  /&gt;SELECT A.FLD1, ... ,B.COL1,...&lt;br  /&gt;FROM TAB2 B, TAB1 A&lt;br  /&gt;WHERE A.KEY1=B.KEY2&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND A.FLD1=&#039;10&#039;&lt;br  /&gt;ORDER BY A.FLD2;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;TAB1의 FLD1=&#039;10&#039; 인것만 전체 스캔후 TAB2를 모두 연결한후&lt;br  /&gt;FLD2로 ORDER BY 한후 운반단위 만큼 추출&lt;br  /&gt;(FLD1=&#039;10&#039; 이 1000건이면 이면 1000회의 연결이 일어난후 정렬)&lt;br  /&gt;&lt;br  /&gt;[반복연결]&lt;br  /&gt;(1)&lt;br  /&gt;SELECT FLD1, .. ,FLDn&lt;br  /&gt;FROM TAB1&lt;br  /&gt;WHERE FLD=&#039;10&#039;&lt;br  /&gt;ORDER BY FLD2;&lt;br  /&gt;&lt;br  /&gt;(2)&lt;br  /&gt;SELECT COL1, ...,COLn&lt;br  /&gt;FROM TAB2&lt;br  /&gt;WHERE KEY2 = :a.KEY1;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;TAB1을 1000건 읽어온후 ORDER BY 한후&lt;br  /&gt;TAB2의 필요한 운반단위만큼만 수행&lt;br  /&gt;&lt;br  /&gt;[인라인뷰처리]&lt;br  /&gt;SELECT x.FLD1, ...., x.FLDn, y.COL1,....,y.COLn&lt;br  /&gt;FROM (SELECT FLD1, ...., FLDn&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; FROM TAB1&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHERE FLD =&#039;10&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; ORDER BY FLD2) x, TAB2 y&lt;br  /&gt;WHERE y.KEY2=x.KEY1;&lt;br  /&gt;&lt;br  /&gt;인라인뷰로 FLD=&#039;10&#039;인것을 FLD2로 모두 정렬후 조인수행&lt;br  /&gt;&lt;br  /&gt;예2)&lt;br  /&gt;&lt;br  /&gt;[조인연결]&lt;br  /&gt;SELECT b.부서명, sum(a.매출액)&lt;br  /&gt;FROM TAB1 a, TAB2 b&lt;br  /&gt;WHERE a.부서코드 = b.부서코드&lt;br  /&gt;&nbsp; AND a.매출일 like &#039;200503%&#039;&lt;br  /&gt;GROUP BY B.부서명;&lt;br  /&gt;&lt;br  /&gt;두테이블을 전체범위로 조인한후 GROUP BY를 하여 운반단위 만큼 추출&lt;br  /&gt;&lt;br  /&gt;[반복연결]&lt;br  /&gt;(1) SELECT 부서코드, SUM(매출액)&lt;br  /&gt;&nbsp;&nbsp; &nbsp; FROM TAB1&lt;br  /&gt;&nbsp;&nbsp; &nbsp; WHERE 매출일 LIKE &#039;200504&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp; GROUP BY 부서코드;&lt;br  /&gt;&lt;br  /&gt;(2) SELECT 부서명&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp; FROM TAB2&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp; WHERE 부서코드 = :a.부서코드;&lt;br  /&gt;&lt;br  /&gt;tab1으로 group by한 결과를 tabw의 필요한 부분만 가져와서 처리&lt;br  /&gt;tab2의 액세스 양이 줄어듬&lt;br  /&gt;&lt;br  /&gt;[인라인뷰처리]&lt;br  /&gt;&lt;br  /&gt;SELECT x.부서크도, y.부서명, 매출액&lt;br  /&gt;FROM (SELECT 부서코드 , SUM(매출액) 매출액&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM TAB1&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE 매출일 LIKE &#039;200503%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY 부서코드 ) x, TAB2 y&lt;br  /&gt;WHERE y.부서코드 = x.부서코드;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;u&gt;두 테이블(집합)의 관계가 1:M 일때&lt;/u&gt;&lt;br  /&gt;&lt;b&gt;조인처리는 두테이블의 조인후 M집합으로 만든후 처리하며&lt;/b&gt;&lt;br  /&gt;&lt;b&gt;반복연결은 M집합처리후 필요한 자료만 액세스하여 처리&lt;/b&gt;하여 조인이 비효율적일수있어나&lt;br  /&gt;&lt;u&gt;&lt;b&gt;인라인뷰등의 대체수단을 활용한다면 같은 형태의 액세스로 만들어 처리할수 있다.&lt;/b&gt;&lt;/u&gt;&lt;br  /&gt;하지만 관계형 DBMS의 집합개념은 경우에 따라 반복연결이 더 효율적일수있으므로&lt;br  /&gt;각 집합간의 관계를 잘 파악후 사용하여야 한다.&lt;br  /&gt;&lt;b&gt;&lt;br  /&gt;
2.1.2. 부분범위 처리방식에서의 비교&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;
부분처리로 처리하는경우 운반단위가 채워질 때까지만 연결작업이 일어나며&lt;br  /&gt;
반복연결 역시 필요한 자료의 양만큼 수행하고 멈출수 있으므로 형태면에서 큰차이가 없을수 있다.&lt;br  /&gt;
&lt;br  /&gt;
하지만 조인의 경우 한번의 SQL 처리가 수행되어지는 반면&lt;br  /&gt;
반복연결은 연결시 마다 SQL이 수행된다.&lt;br  /&gt;
&lt;br  /&gt;
이는 조인이 SQL 내에서 연결한 테이블의 컬럼을 마듬대로 가공하여 사용하는데 반해&lt;br  /&gt;
반복연결은 별도의 언어를 통해 추가적인 가공을 해야하므로 사용면이나&lt;br  /&gt;
속도면에서 조인이 유리 할수 있다.&lt;br  /&gt;
&lt;br  /&gt;
&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Sun, 06 Sep 2009 14:26:38 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[제2부 1.4.7. 저장형 함수를 이용한 부분 범위 처리]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=528</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=528</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=528#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;&nbsp;&quot; p454-494 입니다&quot;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;제 2부 1.4. 부분범위 처리로의 유도&lt;/b&gt;&lt;br  /&gt;&lt;b&gt;1.4.7. 저장형 함수를 이용한 부분 범위 처리&lt;/b&gt;&lt;br  /&gt;- 비절차형인 SQL 에서 절차형 처리를 가능하게 해준다&lt;br  /&gt;&lt;br  /&gt;EX)&lt;br  /&gt;CREATE OR REPLACE FUNCTION GET_AVG_STOCK (&lt;br  /&gt;&nbsp;&nbsp;&nbsp; v_start_date in date,&lt;br  /&gt;&nbsp;&nbsp;&nbsp; v_end_date&nbsp;&nbsp;&nbsp; in date,&lt;br  /&gt;&nbsp;&nbsp;&nbsp; v_product_cd in varchar2 )&lt;br  /&gt;&nbsp;&nbsp;&nbsp; RETURN number IS&lt;br  /&gt;&nbsp;&nbsp;&nbsp; RET_VAL number(14);&lt;br  /&gt;BEGIN&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT SUM(stock_qty) / (v_start_date - v_end_date) ) into RET_VAL&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM PROD_STOCK&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE product_cd=v_product_cd&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND stock_date between v_start-date and v_end_date;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; RETURN RET_VAL;&lt;br  /&gt;END GET_AVG_STOCK;&lt;br  /&gt;&lt;br  /&gt;SELECT product_cd, product_name,&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GET_AVG_STOCK(product_cd, :b1, :b2) avg_stock&lt;br  /&gt;FROM PRODUCT&lt;br  /&gt;WHERE category_cd=&#039;20&#039;;&lt;br  /&gt;&lt;br  /&gt;전체처리가 없음&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;가) 확인자 역할의 M 집합 처리를 위한 부분범위처리&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;M 집합을 단지 확인자 역할로 조인을 했다면 원래 집합으로 돌아가기 위해 GROUP BY,DISTINCT 등의 부담이 많은 쿼리를 취애야함&lt;br  /&gt;서브쿼리를 활용하는 방법도 불필요한 자료를 처리해야하는 경우가 생길수도 잇음&lt;br  /&gt;&lt;br  /&gt;저장형 함수를 작성후 WHERE절에서 호출하여 조건 처리를 하고 SELECT LIST 문에서 값을 출력하는 형태&lt;br  /&gt;-&gt; 저장형 함수를 중복수행하는 문제가 있을수 있음&lt;br  /&gt;&lt;br  /&gt;인라인뷰를 활용하여 수행하는 방법&lt;br  /&gt;EX)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; CUST_ARR_FEE_FUNC(고객번호, 시작일,종료일) -&gt; 요금총액 RETURN&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT cust_no,cust_name, bill_tot, ..&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM (SELECT ROWNUM, cust_no,cust_name,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; CUST_ARR_FEE_FUNC(cust_no,:b1,:b2) bill_tot,...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM customer&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE cust_status=&#039;ARR&#039; )&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE bill&gt;=1000000&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND ROWNUM &lt;= 30;&lt;br  /&gt;&lt;br  /&gt;Execution Plan&lt;br  /&gt;----------------------------------------------------------&lt;br  /&gt;SELECT&nbsp;&nbsp;&nbsp; STATEMENT&lt;br  /&gt;&nbsp;&nbsp;&nbsp; COUNT (STOPKEY)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW&nbsp;&nbsp;&nbsp; ............................. (b)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; COUNT&nbsp;&nbsp;&nbsp; ....................... (a)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF &#039;CUSTOMER&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;CUST_STATUS_IDX&#039;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;서브쿼리의 rownum (A) 의 역할; 서브쿼리에서 ROWNUM의 확보요청으로 옵티마이져가 서브쿼리를&lt;br  /&gt;&nbsp;VIEW로 (B) 생성한후 조건절에서 처리가능하게 됨 ( 저장형 함수를 한번만 수행)&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;나) 특정 부분만 부분범위처리로 유도&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;출력해야할 자료자체의 범위가 넓어 실행계획의 조정만으로 속도 향상을 기대하기 힘들때&lt;br  /&gt;&lt;br  /&gt;EX)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; 순수sql)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT sal_dept, agent_name, jan_tot,feb_tot ...,dec_tot &nbsp;&nbsp; &nbsp;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; (SELECT sal_dept,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUM(decode(substr(sal_date,1,6),:year||&#039;01&#039;,sal_amt)) jan_tot,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUM(decode(substr(sal_date,1,6),:year||&#039;02&#039;,sal_amt)) feb_tot,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ........................................................&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUM(decode(substr(sal_date,1,6),:year||&#039;03&#039;,sal_amt)) dec_tot&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM sales&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE sal_date like :year||&#039;%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GROUP BY sal_dept&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ORDER BY jan_tot DESC ) s, agent a&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE a.agent_no = s.sal_dept&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND a.loc= :b1;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; sales 테입을 조건의 년도에 맞게 전체 가공한후 agent 테이블과 조인하여 최종결과 출력 &lt;br  /&gt;&nbsp;&nbsp;&nbsp; (sales 자료의 양에 따라 엄청난 access를 가져올수 있음)&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; 저장형함수 활용)&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GET_AGENT_SALAMT ( 판매처, 년월)&nbsp; -&gt; 판매총액 출력&lt;br  /&gt;&lt;br  /&gt;&nbsp; SELECT sal_dept, agent_name, jan_tot,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; GET_AGENT_SALAMT (sal_dept, :year||&#039;02&#039;) feb_tot,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ........................................................&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; GET_AGENT_SALAMT (sal_dept, :year||&#039;12&#039;) dec_tot&lt;br  /&gt;&nbsp; FROM ( SELECT sal_dept, nvl (sum(sal_amt),0) JAN_TOT,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; max(agent_name) agent_name&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM sales s,agent a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE s.sal_dept=a.agent_no&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND a.loc = :b1&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND s.sal_date like :year || &#039;01&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GROUP BY sal_dept&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ORDER BY jna_tot desc);&lt;br  /&gt;&lt;br  /&gt;첫달만 group by 로 계산하하고 메인쿼리의 SELECT 문에서 GET_AGENT_SALAMT를 호출하여 첫쿼리의 결과값을 활용하여&lt;br  /&gt;저장형 함수를 호출하여 각각 의 범위를 최대한 줄임&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;1.4.8. 쿼리의 분리를 이용한 부분범위처리&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;SQL)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT deptno, y.ename, y.empno, y.job, sal_tot, comm_tot&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM (SELECT empno,&nbsp;&nbsp; &nbsp;&nbsp; &lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUM(sal_amt) sal_tot,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUM(comm)&nbsp;&nbsp; comm_tot&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM salary s&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE s.deptno like &#039;12%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND s.sal_date between &#039;20050101&#039; and &#039;20051231&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GROUP BY empno) x, employee y&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE y.empno=x.empno;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; 부서번호가 12로 시작하교  2005년에 지급한 급여의 총액(salary)을 기본적은 사원정보(employee) 와 함께 출력&lt;br  /&gt;&nbsp;&nbsp;&nbsp; salary 테일블을 조건에 따라 전체 group by하고 다시 employee로 조인하여 결과출력&lt;br  /&gt;&lt;br  /&gt;&nbsp;&lt;br  /&gt;&lt;b&gt;1.4.9. 웹 게시판에서의 부분범위처리&lt;/b&gt;&lt;br  /&gt;&lt;b&gt;가) 웹 게시판 부분범위처리 사례 1 (NON-UNIQUE INDEX)&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;SELECT /*+ index (w cust_name_idx) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ROWIDTOCHAR(rowid) rid, cust_name, ....&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM cust_table w&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE :v2=&#039;FIRST&#039; AND cust_name like :v1 || &#039;%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND rownum &lt;=25&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT /*+ use_concat index (x cust_name_idx) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ROWIDTOCHAR(rowid) rid, cust_name, ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM cust_table x&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE :v2=&#039;NEXT&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND (cust_name &gt; :v3 OR&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; (cust_name = :v3 AND rowid &gt; CHARTOROWID(:v4)))&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND cust_name like :v1||&#039;%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND rownum &lt;=25&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT /*+ use_concat index_desc(y cust_name_idx) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ROWIDTOCHAR(rowid) rid, cust_name, ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM cust_table y&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE :v2=&#039;PREV&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND (cust_name &lt; :v3 OR&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; (cust_name = :v3 AND rowid &lt; CHARTOROWID(:v4)))&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND cust_name like :v1 || &#039;%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND rownum &lt;=25&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ORDER BY cust_name, rid;&lt;br  /&gt;&lt;br  /&gt;각 쿼리의 :v2 변수로 인해 호출조건이 특정지어지어 &#039;FIRST&#039;,&#039;NEXT&#039;,&#039;PREV&#039; 세쿼리중 하나만 수행되어짐&lt;br  /&gt;v3: 은 고객이름&lt;br  /&gt;v4: 는 rowid&nbsp; 값으로 &#039;next&#039;일경우 큰값중 25개 ,prev는 작은값으로 25개 씩 출력&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;나) 웹 게시판 부분범위처리 사례 2(UNIQUE INEX)&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;기본키: &#039;게시판ID+작성일자+글번호&#039;&lt;br  /&gt;&lt;br  /&gt;SELECT BBS_ID, 작성일자, 글번호, RNUM&lt;br  /&gt;FROM ( SELECT /*+ USE_CONCAT INDEX_DESC (a billboard_uk) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ROWNUM RNUM, BBS_ID, 작성일자, 글번호, 글내용&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FROM BILLBOARD a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHERE :SW = &#039;NEXT&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND BBS_ID=BID&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND ( 작성일자 &lt; :INIT_DT&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; OR (작성일자 = :INIT_DT AND 글번호 &lt; :V_NUM )&nbsp; )&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND RNUM &lt;= 25&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ USE_CONCAT INDEX_ASC (a billboard_uk) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; (26-ROWNUM) RNUM, BBS_ID,작성일자, 글번호, 글내용&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM BILLBOARD a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE :SW = &#039;PREV&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND BBS_ID = :BID&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND&nbsp; (작성일자 &gt; :INIT_DT&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; OR (작성일자 =:INIT_DT AND 글번호 &gt; :V_NUM) )&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; AND ROWNUM &lt;=25&lt;br  /&gt;&nbsp;&nbsp;&nbsp; )&lt;br  /&gt;ORDER BY RNUM;&lt;br  /&gt;&lt;br  /&gt;INDEX_DESC는 최근값부터 출력하기 위해사용&lt;br  /&gt;초기 호출시는 INIT_DT는 SYSDATE, V_NUM의 MAX값을 준후 호출&lt;br  /&gt;SW 변수로 버튼에 따른 쿼리 수행 조정&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;다) 웹 게시판 부분범위 처리 사례 3(처음-이전-다음-끝)&lt;/b&gt;&lt;br  /&gt;기본키: CID+CSEQ&lt;br  /&gt;결합인덱스: CDAY+CID+CSEQ&lt;br  /&gt;&lt;br  /&gt;SELECT CDAY, CUST_NM, CID, CSEQ, CTEXT&lt;br  /&gt;FROM ( SELECT /*+ INDEX_ASC (a IDX 01) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cday, cust_nm, cid, cseq, ctext&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; FROM cstab a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHERE :SW = &#039;FIRST&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; AND cday between :b11 and :b12)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; AND rownum &lt;= 25&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ INDEX_DESC (a IDX01) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cday, cust_nm, cid, cseq, ctext&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM cstab a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE :SW =&#039;LAST&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND cday between :b11 and :b12&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND rownum &lt;=25&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ USE_CONCAT INDEX_ASC (a IDX01 ) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cday, cust_nm, cid, cseq, ctext&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM cstab a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE :SW = &#039;NEXT&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND ( (cday &gt; :b100)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OR (cday = :b100 and cid &gt; :b20)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; OR (cday = :b100 and cid = :b20 and cseq &gt; :b27) )&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND cday between :b11 and :b12&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND rownum &lt;=25&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ USE_CONCAT INDEX_DESC (a IDX01) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cday, cust_nm, cid, cseq, ctext&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM cstab a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE :SW=&#039;PREV&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND ( (cday &lt; :b100)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; OR (cday = :b100 and cid &lt;:b20)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; OR (cday = :b100 and cid = :b20 and cseq &lt; :b27) )&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND cday between :b11 and b:12&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND rownum &lt;=25&lt;br  /&gt;)&lt;br  /&gt;&lt;br  /&gt;order by cday,cid,cseq&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;라) 웹 게시판 부분범위 처리 사례 4 (set 단위 처리)&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;두단계로 나누어서 처리 하단부분에 각 페이지 링크를 위한 쿼리&lt;br  /&gt;&lt;br  /&gt;SELECT rnum, bbs_id, cre_dt,num&lt;br  /&gt;FROM ( SELECT /*+USE_CONCAT INDEX_DESC (a bbs_idx1) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ROWNUM rnum, bbs_id, cre_dt,num &lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM BILLBOARD a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE :sw=&#039;NEXT&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND bbs_id = :v_bbs&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND (cre_dt &lt; :v_init_dt&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; OR ( cre_dt = :init_dt AND num &lt;= :v_num) )&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND ROWNUM &lt;=201&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; UNION ALL&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ USE_CONCAT INDEX_ASC (a bbs_idx1) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ((20*10)+2 - ROWNUM) rnum,bbs_id,cre_dt,num&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM BILLBOARD a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE :sw=&#039;PREV&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND bbs_id=:v_bbs&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND (cre_dt &gt; :v_init_dt&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; OR (cre_dt = :v_init_dt AND num &gt;=:v_num) )&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND ROWNUM &lt;=201&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; )&lt;br  /&gt;WHERE rnum in (1,21,41,61,81,101,121,141,161,181,201)&lt;br  /&gt;ORDER BY rnum;&lt;br  /&gt;&lt;br  /&gt;-&gt;게시판 목록 하단에 페이지 처리&lt;br  /&gt;

&lt;br  /&gt;
&nbsp; 이전 1,2,3,4,5,6,7,8,9,10 다음&lt;br  /&gt;
&lt;br  /&gt;일경우 메인쿼리의 rnum으로 각 페이지의 시작페이지들을 출력&lt;br  /&gt;각 페이지들이 클릭될경우 다음 쿼리를 호출하여 페이지별 목록 출력&lt;br  /&gt;&lt;br  /&gt;SELECT /*+ USE_CONCAT INDEX_DESC(a bbs_idx1) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; bbs_id, cre_dt, num, c_text&lt;br  /&gt;FROM BILLBOARD a&lt;br  /&gt;WHERE bbs_id = :bbs&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND ( cre_dt &lt; :v_init_dt &lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp; OR ( cre_dt = :v_init_dt AND num &lt;= :v_num) )&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND ROWNUM &lt;= 20;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;b&gt;마) 웹 게시판 부분범위처리 사례 5 (계층구조의 처리)&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;REPLY 에 REPLAY에 달리는 형태의 게시판&lt;br  /&gt;&lt;br  /&gt;절차형 처리를 가미하고 쿼리를 분리하여 처리&lt;br  /&gt;&lt;br  /&gt;DECLARE&lt;br  /&gt;&nbsp;&nbsp;&nbsp; CURSTOR c1 (start_id NUMBER) IS&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ index_asc (a idx1) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; rownum as rnum, id , pid&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM BILLBOARD a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE sw=1 and id&gt;=start_id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; and rownum &lt;=11;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; COURSOR c2(root_id NUMBER) IS&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT rownum as rnum2, id, pid,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; lpad (&#039; &#039;,2*level-1) || comments as comm,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; sys_connect_by_path(id, &#039;/&#039;) as path&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM BILLBOARD&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; CONNECT BY pid=PRIOR id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; and rownum &lt;=11&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; START WITH id= root_id;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TYPE IdTAbTyp is TABLE of billboard.id%TYPE&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; index by binart_integer;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;TYPE CommTabTyp is TABLE of billboard.comments%TYPE&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; index by binary+integer;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_id&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; IdTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_root&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  IdTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_comm&nbsp;&nbsp; &nbsp; CommTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_num&nbsp;&nbsp; &nbsp; &nbsp; IdTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; root_id&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; number;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;first_seq &nbsp;&nbsp; &nbsp;&nbsp; number := &amp;seq;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; start_id&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; number := &amp;start_id;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; i&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; binary_integer :=0;&lt;br  /&gt;&lt;br  /&gt;BEGIN&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FOR c1_rec IN c1(start_id) LOOP&nbsp;&nbsp;&nbsp; /* 본문글 액세스*/&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; IF c1_rec_rnum &gt; 11 OR i &gt;10 THEN EXIT;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; END IF;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; root_id := c1_rec.id;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FOR c2_rec IN c2(root_id) Loop&nbsp;&nbsp; /* 계층구조 전개*/&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; IF i&gt; 10 THEN EXIT;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END IF;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; IF (c1_rec.id = start_id and c2_rec.rnum2 &gt;= first_seq) OR&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; (c1_rec.id &lt;&gt; start_id ) THEN&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; i := i+1;&nbsp;&nbsp; /* 배열에 저장 */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_id(i) :=c2_rec.id;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_root(i) :=substr(c2_rec.path,2,instr(c2_rec.path, &#039;/&#039;,2) -2);&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_comm(i) := c2_rec.comm;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_num(i)&nbsp;&nbsp;&nbsp; := c2_rec.rnum2;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END IF;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FOR i IN 1..11 LOOP&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE(ret_id(i)||&#039; &#039;||ret_root(i)||&#039; &#039; ||&nbsp;&nbsp; /*화면으로 출력*/&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_comm(i)||&#039; &#039;||ret_num(i));&lt;br  /&gt;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;END;&lt;br  /&gt;&lt;br  /&gt;출력된 결과를 사용하는 애플리케이션에서 처리하여 결과 출력&lt;br  /&gt;&lt;br  /&gt;이전페이지 이동시&lt;br  /&gt;&lt;br  /&gt;DECLARE&lt;br  /&gt;&nbsp;&nbsp;&nbsp; CURSOR c1(start_id NUMBER) IS&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ index_desc(a idx1) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; rownum as rnum, id, pid&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM BILLBOARD a&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE sw=1 and id&lt;=start_id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; and rownum &lt;=11;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; CURSOR c2(root_id NUMBER) IS&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT rownum as rnum2, id, pid,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; lpad(&#039; &#039;,2*level-1) || comments as comm,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; sys_connect_by_path(id,&#039;/&#039;) as path&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FROM BILLBOARD&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; CONNECT BY pid=PRIOR id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; and rownum &lt;= 11&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; START WITH id=root_id;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TYPE IdTabTyp is TABLE of billboard.id%TYPE&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; index by binary_integer;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; TYPE CommTabTyp is TABLE of billboard.comments%TYPE&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; index by binary_integer;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_id&nbsp;&nbsp;&nbsp; IdTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_root &nbsp;&nbsp;&nbsp; IdTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_comm&nbsp;&nbsp;&nbsp; CommTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; ret_num&nbsp;&nbsp;&nbsp; IdTabTyp;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; root_id&nbsp;&nbsp; &nbsp; number;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; last_rnum&nbsp;&nbsp;&nbsp; number :=&amp;seq;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; start_id&nbsp;&nbsp;&nbsp; number :=&amp;start_id;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; i&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; binary_integer := 0;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; j&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; binary_integer := 0;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; cnt&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; number :=0;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; BEGIN&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FOR c1_rec IN c1 (start_id) LOOP&nbsp; /* 계층구조전계 */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; IF c1_rec.rnum &gt; 11 OR cnt &gt; 21 THEN EXIT;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END IF;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; root_id :=c1_rec.id;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FOR c2_rec IN c2(root_id) LOOP&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; IF c2_rec.rnum2 &lt;= last_rnum THEN&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; i := c2_rec.rnum2;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_id(i) := c2_rec.id;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_root(i) :=substr(c2_rec.path,2,instr(c2_rec.path,&#039;/&#039;,2)-2);&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_comm(i) :=c2_rec.comm;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_num(i) :=c2_rec.rnum2;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END IF;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; last_rnum := 999;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FOR j IN reverse 1..i LOOP&nbsp;&nbsp;&nbsp; /* 배열에 저장 */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; cnt :=cnt+1;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_id(112-cnt) :=ret_id(j);&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_root(112-cnt) :=ret_root(j);&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_comm(112-cnt) :=ret_comm(j);&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_num(112-cnt) := ret_num(j);&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FOR j IN 101..111 LOOP&nbsp;&nbsp; /* 화면에 출력 */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BEGIN&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; DBMS_OUTPUT.PUT_LINE (ret_id(j)||&#039; &#039;||ret_root(j)||&#039; &#039;||&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ret_comm(j)||&#039; &#039;||ret_num(j)) ;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; EXCEPTION&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHEN NO_DATA_FOUND THEN i:=1;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;END;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; END LOOP;&lt;br  /&gt;END;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Sun, 06 Sep 2009 11:44:29 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[2.2. 연결고리 상태가 조인에 미치는 영향]]></title>
			<dc:creator><![CDATA[balto]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=523</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=523</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=523#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;!--StartFragment--&gt;&nbsp;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;2.2. 연결고리 상태가 조인에 미치는 영향&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 조인에서 연결고리란 테이블을 연결하는 조인 조건을 말한다. 연결고리에 인덱스가 있는지 여부에 따라 정상, 이상으로 구분한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;2.2.1. 연결고리 정상&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 조인조건이 되는 속성에 대한 인덱스가 모두 존재하는 경우.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 두 테이블 중 하나가 드라이빙 테이블이 될 수 있다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 어느 테이블이 드라이빙(driving) 테이블이 되더라도 드리븐(driven) 테이블의 인덱스를 사용한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;가능한 1:M의 1쪽의 테이블을 드라이빙 테이블로 한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 어느 테이블이 드라이빙 테이블이 되는가에 따라 속도가 큰 차이는 없지만 차이가 있을 수 있다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL예)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM TAB2 b, TAB1 a&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE a.key1=b.key2 AND b.col2 LIKE &#039;AB%&#039; AND a.col1=&#039;10&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(가정) &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(TAB1 :&nbsp; a.col1=&#039;10&#039;을 만족하는 범위는 5,000건)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(TAB2 :&nbsp; b.col2 LIKE &#039;AB%&#039;를 만족하는 데이터는 100건) &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(처리예 1)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB1에서 10인 것을 찾는다 -&gt; KEY2 인덱스와 연결 -&gt; 결과 생성&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB2에 KEY2+COL2 인덱스가 있다면 더 효율적이다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(처리예 2)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB2에서 AB%를 찾는다 -&gt; KEY1 인덱스와 연결 -&gt; 결과 생성&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(참고) TAB2를 먼저 처리하려면 /*+ ORDERED */ 힌트를 사용한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;2.2.2. 한쪽 연결고리 이상&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 조인조건이 되는 속성에 대한 인덱스가 한쪽 테이블에만 존재하는 경우&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 인덱스가 없는 테이블을 드라이빙 테이블로 하거나, 소트머지 혹은 해시조인을 사용한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 인덱스가 없는 테이블을 드라이빙 테이블로 하지만 아래 예처럼 비효율적인 경우가 있음을 알아야 한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL예)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM TAB2 b, TAB1 a&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE a.key1=b.key2 AND a.col1=&#039;20&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(처리예)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB2 처리 -&gt; KEY1 인덱스와 연결 -&gt; 결과 생성&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(참고) TAB1의 데이터를 줄일 수 있는 a.col=&#039;20&#039;을 인덱스를 활용하지 못한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;2.2.3. 양쪽 연결고리 이상&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 조인조건이 되는 속성에 대한 인덱스가 양쪽 테이블 모두 존재하지 않는 경우&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 소트머지 혹은 해시조인을 사용한다.&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Sat, 05 Sep 2009 14:55:53 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[2부 1.4.(1.4.1-1.4.7) 부분범위처리로의 유도 (중요하지 않은 부분 조금 미완성)]]></title>
			<dc:creator><![CDATA[balto]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=499</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=499</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=499#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;&lt;a href=&quot;./?module=file&amp;act=procFileDownload&amp;file_srl=500&amp;sid=44f39d05872f1788e209fc9227ab94c5&quot;&gt;2부-1.4-부분범위처리로의유도.hwp&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;!--StartFragment--&gt; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4 부분범위처리로의 유도&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 이장에서는 어떤 SQL 문들을 부분범위 처리로 유도할 수 있는 지 각 방법들을 살펴본다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.1. 액세스 경로를 이용한 SORT의 대체&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;-&nbsp; ORDER BY에 의한 전체처리 범위&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 1 : 인덱스를 이용하여 정렬된 순서대로 추출하는 부분범위 처리 방법&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL 문) - 전체처리&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM product&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE item_cd LIKE &#039;AB%&#039; AND category LIKE &#039;C%&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ORDER BY item_cd DESC&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL 문) - &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;item_index&lt;/span&gt;를 이용하여 부분범위처리.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT /*+ INDEX_DESC(product item_index)*/ *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM product&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE item_cd LIKE &#039;AB%&#039; AND category LIKE &#039;C%&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 2 : &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL 문) - 전체처리 - ORDER BY 컬럼과 인덱스가 다를때&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;2005%&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ORDER BY ord_dept DESC&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL 문) - 부분범위처리 - &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;ord_dept를 액세스할 때 자동으로 정렬됨&lt;/span&gt;. &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT /*+ INDEX_DESC(a ord_dept_index)*/ *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order a&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;2005%&#039; AND ord_dept &gt; &#039; &#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.2. 인덱스만 액세스하는 부분범위 처리&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;-&nbsp; 인덱스만 사용하는 실행계획 수립 조건&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;질의에 사용된 모든 컬럼이 하나의 인덱스에 결합되어 있거나&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;인덱스 머지되는 실행계획의 경우 머지되는 두 개의 인덱스에 모든 컬럼이 사용되어야 한다. &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;질의에 사용된 전체 컬럼이 몇 개의 인덱스에 포함되면 인덱스 조인 성립&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 1 : ord_date 인덱스보다는 (ord_date+qty) 인덱스가 2배 이상 빠르다. &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ord_date, SUM(qty)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;200510%&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;GROUP BY ord_date&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 2 : 적절한 인덱스 구성 &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL) (ord_date+agent_cd)를 사용한다면 약간 비효율적이다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ord_date, count(*)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;200510%&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;GROUP BY ord_dept&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL) (ord_date+agent_cd)를 사용한다면 매우 효율적이다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ord_date, count(*)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;200510%&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;GROUP BY agent_cd&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.3. MIN, MAX의 처리&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- sequence를 사용하는 방법(생략)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.4. FILTER 형 부분범위 처리&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 1 : 필터형 처리를 유도하는 것이 좋은 사례&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL) 전체범위 처리 예(COUNT()함수의 목적이 결과의 존재를 확인)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT count(*) INTO :cnt&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM ITEM_TAB&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE DEPT=&#039;101&#039; AND seq &gt; 100&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;...&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;IF cnt &gt; 0 ...&nbsp; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL) 부분범위 처리 예(EXIST로 변환한 예)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT INTO :cnt FROM DUAL&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE EXISTS (SELECT &#039;X&#039; FROM ITEM_TAB &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WHERE DEPT=&#039;101&#039; AND seq &gt; 100)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;...&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;IF cnt &gt; 0 ...&nbsp; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(실행계획)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt; &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp;FILTER&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;TABLE ACCESS (FULL) OF &#039;DUAL&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;TABLE ACCESS (BY INDEX ROWID) OF &#039;ITEM_TAB&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INDEX (RANGE SCAN) OF item_dept_idx(NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 2 : 필터형 처리를 유도하는 것이 좋은 사례&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL) 전체범위 처리 예(MINUS)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ord_dept, ord_date, custno&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;2005%&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;MINUS&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ord_dept, ord_date, &#039;12541&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM sales&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE cust_no=&#039;12541&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;(SQL) 부분범위 처리 예(EXIST로 변환한 예)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ord_dept, ord_date, custno&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM order x&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ord_date like &#039;2005%&#039; AND&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;NOT EXISTS&lt;/span&gt; ( SELECT * FROM sales y&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE y.ord_dept=x.ord-dept AND &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;t.ord_date=x.ord_date AND cust_no=&#039;12541&#039;)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.5. ROWNUM의 활용&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- ROWNUM - 가상의 컬럼으로 SQL 결과 튜플의 일련 번호이다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 : 10개의 결과 튜플이 생성되면 실행중지, 아니면 전체를 모두 수행. &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT * &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM ITEM_TAB&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE DEPT=&#039;101&#039; AND seq &gt; 100 AND ROWNUM &lt;= 10&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 실행계획의 예&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt; &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp;COUNT(STOPKEY)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;&nbsp;&nbsp;TABLE ACCESS (FULL) OF table&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- ROWNUM 사례 - ROWNUM 순서와 item_cd 정렬순과 일치(내부저장을 하지 않으므로)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ROWNUM, item_cd, category_cd&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM product&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE deptno like &#039;120%&#039; and qty &gt;0 and ROWNUM &lt;=10&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ORDER BY item_cd&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- ROWNUM 사례 - ROWNUM 순서와 item_cd 정렬순과 일치(전체범위처리)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ROWNUM, item_cd, category_cd&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM ( SELECT *&nbsp; FROM product&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE deptno like &#039;120%&#039; and qty &gt;0 ORDER BY item_cd)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ROWNUM &lt;=10 &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- ROWNUM 사례 - GROUP BY 결과를 원하는 수 만큼 출력하고 싶을 때&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ROWNUM, dept, totqty&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM ( SELECT deptno, sum(qty) totqty FROM product&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE deptno like &#039;120%&#039; GROUP BY deptno)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE ROWNUM &lt;=10 &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- ROWNUM 사례 - GROUP BY 결과중 5번째 결과만 출력하고 싶을 때&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT ROWNUM, dept, totqty&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM ( SELECT ROWNUM as RNUM, deptno, totqty&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM ( SELECT deptno, sum(qty) totqty FROM product&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE deptno like &#039;120%&#039; AND ROWNUM &lt;= 100&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;GROUP BY deptno)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE RNUM=5 AND ROWNUM =1&nbsp; /* 불필요한 처리 없애기 */&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- ROWNUM 사례 - 사용자의 무제한 액세스를 방지하고 싶을 때&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT *&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM table&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE conditions AND ROWNUM &lt;= 1000&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.6. 인라인뷰를 이용한 부분범위 처리&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 인라인뷰를 활용하여 부분범위처리를 유도하는 원리는 전체범위처리가 되는 부분을 인라인뷰로 묶어서 다른 부분들은 부분범위처리가 되도록 한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 1 : 세 개의 테이블을 조인 - 처리대상이 적은 테이블을 먼저 처리하여 전체범위가 되도록하고 대량의 테이블은 부분범위처리로 유도&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(SQL 1) 세 테이블 조인&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT a.dept_name, b.empno, b.emp_name, c.sal_ym, c.sal_tot&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM department a, employee b, salary c&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE b.deptno=a.deptno AND c.empno=b.empno AND&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;a.location=&#039;SEOUL AND b.job=&#039;MANAGER&#039; AND c.sal_ym=&#039;200512&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ORDER BY a.dept_name, b.hire_date, c.sal_ym&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(SQL 2) 세 개의 테이블을 조인 - salary 테이블이 대용량인 경우 인라인뷰를 이용하여 dept, employee 조인한 후 (empno+sal_ym) 인덱스 사용하여 salary와 조인&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT /*+ ORDERED, USE_NL(x,y) */&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;a.dept_name, b.empno, b.emp_name, c.sal_ym, c.sal_tot&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM (SELECT a.dept_name, b.hire_date, b.empno, b.emp_name&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM dept a, employee b&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE b.deptno=a.deptno AND a.location=&#039;SEOUL &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;AND b.job=&#039;MANAGER&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ORDER BY a.dept_name, b.hire_date) x, salary y&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE y.empno=x.empno AND c.sal_ym=&#039;200512&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 2 : GROUP BY를 통하여 가동된 중간집합을 생성하고 나머지는 참조되는 일종의 디멘전 테이블들을 부분범위처리로 유도하는 경우&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(SQL 1) &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT a.product_cd, product_name, avg_stock&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM product a, &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(SELECT product_cd, SUM(stock_qty) / (:b2-:b1) avg_stock&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM prod_stock&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE stock_date BETWEEN :b1 AND :b2&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;GROUP BY product_cd) b&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE b.product_cd=a.product_cd AND a.category_cd=&#039;20&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(최적이 수행절차)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;product의 category_cd 값이 20인 product_cd 속성을 찾는다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;구해진 product_cd 값과 stock_date 값으로 prod_stock 테이블을 &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(product_cd+stock_date) 인덱스를 이용하여 액세스한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;위 작업을 반복하다 운반단위가 채워지면 종료한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(해결방법) 사용자지정 저장함수 사용 혹은 스칼라 서브쿼리 사용&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(SQL 2) 스칼라 서브쿼리 사용 예&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT a.product_cd, product_name, &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(SELECT SUM(stock_qty) / (:b2-:b1) avg_stock&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM prod_stock b&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE b.product_cd=a.product_cd AND &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;stock_date BETWEEN :b1 AND :b2) avg_stock&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM product a, &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE category_cd=&#039;20&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;1.4.7저장형 함수를 이용한 부분범위 처리&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- (생략)&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Sat, 29 Aug 2009 10:47:39 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[4.2. 클러스터링 형태의 결정 기준]]></title>
			<dc:creator><![CDATA[balto]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=490</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=490</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=490#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;&lt;span style=&quot;COLOR: #ff6c00&quot;&gt;(편집에 문제 있을 수 있으니 첨부파일 참조 바랍니다.)&lt;/span&gt;&lt;span style=&quot;COLOR: #ff6c00&quot;&gt;&nbsp;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;4.2. 클러스터링 형태의 결정 기준&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예제 : 어느 테이블을 클러스터링하는 것이 효율적인지..&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB1(&lt;span style=&quot;TEXT-DECORATION: underline&quot;&gt;COL1&lt;/span&gt;, otherkeys)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB2(&lt;span style=&quot;TEXT-DECORATION: underline&quot;&gt;COL1&lt;/span&gt;, COL2, oterkeys)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB3(&lt;span style=&quot;TEXT-DECORATION: underline&quot;&gt;COL1&lt;/span&gt;, &lt;span style=&quot;TEXT-DECORATION: underline&quot;&gt;COL2&lt;/span&gt;, COL3, otherkeys) : 대용량테이블, TAB1, TAB2와 자주조인&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;TAB4(&lt;span style=&quot;TEXT-DECORATION: underline&quot;&gt;COL1&lt;/span&gt;, &lt;span style=&quot;TEXT-DECORATION: underline&quot;&gt;COL2&lt;/span&gt;, COL4, otherkeys) : 대용량테이블&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;4.2.1. 포괄적인 클러스터링&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- TAB3 + TAB4를 클러스터링라면 -&gt; M:M의 관계이므로 좋지 않다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- TAB1 + TAB2 + TAB3 을 클러스터링할 경우 -&gt; 1개의 TAB1로우, 여러 개의 TAB2로우, 다수의 TAB3로우로 클러스터링 체인이 많이 발생하여 비효율적. TAB1과 TAB2는 독립적으로 액세스해도 문제 없음. 결속력은 강화되지만 각각의 테이블 독립성은 떨어져서 TAB1이나 TAB2를 독립적으로 액세스하는 효율 저하.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;4.2.2. 부분적인 클러스터링&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- TAB1 + TAB2가 결합도가 높고 자주 조인한다면 클러스터링 해볼 만하다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;4.2.3. 단일테이블 클러스터링&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 조인의 효율성 향상을 위한 다중 클러스터링은 특정한 경우를 제외하고는 피한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 단일테이블 클러스터링은 넓은 범위의 처리를 스캔방식으로 유도하는 좋은 방법이다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;4.2.4. 단위 클러스터의 크기 결정&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 단위클러스터의 크기를 어느 정도로 하면 좋은가?&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 예 :&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;A형 : 클러스터 길이가 길고 로우의 길이가 짧다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;B형 : 클러스터 길이가 짧고 로우의 길이가 길다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;C형 : 클러스터 길이가 &lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;보통&lt;/span&gt; 로우의 길이가 짧다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;D형 : 클러스터 길이가 짧고 로우의 길이가 짧다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 클러스터를 하는 테이블은 로우가 길지 않을수록 좋고(길면 클러스터에 로우가 몇 개 못 들어간다.), 단위클러스터가 지나치게 크지 않는 것이 좋다(크면 기억장소 효율성이 떨어진다). 단위 클러스터에 20-100개가 좋다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 단위클러스터는 32K까지 허용한다. 32K보다 작은 클러스터는 작은 크기만 배정된다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 8K블록에 2K로 단위클러스터가 지장되어 있으면 오버헤드 장소를 빼고 약 3개정도의 클러스터가 저장된다. 같은 키를 가진 클러스터가 많으면 블록에 저장되는 클러스터는 더 줄어든다. &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 단위클러스터에 저장될 데이터가 많다면 체인블록에 저장된다. 체인블록은 빈 블록 혹은 다른 클러스터가 사용하다 남는 블록이 된다. &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;[단위클러스터 계산 방법]&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 입력 인자들&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;① 블록당 유휴 저장공간 = (블록크기-헤더크기)*(100-PCTFREE)/100&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(예) 저장가능 공간 = (8,000Byte-100Byte)*(100-10)*100=7,110Byte&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;② 로우의 평균길이&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(평균길이 아는방법)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ANALYZE TABLE &lt;table_name&gt; COMPUTE STATISTICS&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT avg_row_len FROM user_tables WHERE table_name = &lt;table_name&gt;;&nbsp; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(예) SQL 실행결과 100Byte 가정하면 약 71 로우 저장 가능 &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;③ 클러스터 키별 로우의 수&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(평균 로우수 알아내는 방법)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT AVG(CASE WHEN row_cnt &gt; 71 THEN &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;ELSE row_cnt END) average_row_count&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM (SELECT cluster_key_columns, count(*) row_cnt&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM table_name&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE sampling _conditions...&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;GROUP BY cluster_key_columns);&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;④ 단위 클러스터 크기 산정 = AVG_ROW_LEN * average_row_count)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;(예) 클러스터키별 평균로우의 수가 약 20이라면 클러스터 크기 = 20*100Byte = 2,000Byte, 7,110/2,000=3.5이므로 블록에 약 3개까지 단위클러스터 저장 가능 &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;[클러스터 생성 절차의 예]&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;① 클러스터 생성&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;CREATE CLUSTER sales_cluster (sale_date varchar2(8))&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;STORAGE (storage_clause...)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;PCTFREE 10 PCRUSED 60&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SIZE 2000&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;② 클러스터 인덱스 생성&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;CREATE INDEX sales_cluster_index ON CLUSTER sales_cluster&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;PCTFREE 2&nbsp; &lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;STORAGE (INITIAL 20K NEXR 10K)&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;③ 기존 테이블의 명칭을 다른 이름으로 바꾼다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;RENAME sales To sales_copy&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;④ 클러스터 내에 테이블을 생성한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;CREATE TABLE sales&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;( salesno&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;varchar2(6) not null,&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;sale_dept &lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;char(4),&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&nbsp;&nbsp;sale_date&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;varchar2(8) not null,&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;... )&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;CLUSTER sales_cluster (sale_date);&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;⑤ 생성된 테이블 내에 데이터를 저장시킨다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;INSERT INTO sales&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT * FROM sales_copy&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE sale_date &lt;= &#039;20010101&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;⑥ 기존 테이블을 삭제시키고 새롭게 생성한 테이블에 다른 인덱스를 추가시킨다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;DROP TABLE sales_copy;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;CREATE INDEX ...;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;4.2.5. 클러스터 사용을 위한 조치&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;- 넓은 범위 처리의해결을 목적으로 생성하는 단일테이블 클러스터링에 주의할 사항&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(1) 클러스터 키 컬럼을 첫 번째로 하는 인덱스를 생성하지 말 것.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;클러스터 인덱스가 있음에도 클러스터 키 컬럼을 첫 번째로 하는 결합인덱스가 존재하면 클러스터를 사용하지 않고 결합인덱스를 사용하는 경우가 있을 수 있다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;예) (sale_date + sale_dept) 결합인덱스가 있다면 아래 질의는 결합인덱스를 사용한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT SUM(count(*))&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;sales&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE sale_date BETWEEN &#039;20051201&#039; AND &#039;20051225&#039;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;AND sale_dept like &#039;110%&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;(2) 클러스터가 반드시 사용되기를 원한다면 액세스 경로를 고정시킨다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;예) 다음 SQL 문을 클러스터를 사용하는 것이 유리하다고 생각되면 힌트를 추가한다.&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;SELECT /*+CLUSTER(sales)*/ SUM(count(*))&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;FROM sales&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;WHERE sale_dept BETWEEN &#039;20051201&#039; AND &#039;20051225&#039; &lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;AND sale_dept=&#039;11200&#039;;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;span style=&quot;HWP-TAB: 1&quot;&gt;&nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;HStyle0&quot;&gt;&lt;span style=&quot;FONT-FAMILY: &#039;한컴바탕&#039;&quot;&gt;&lt;br  /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Wed, 26 Aug 2009 17:29:00 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[4.1.6. 인덱스 선정 절차]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=479</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=479</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=479#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;b&gt;4.1.6. 인덱스 선정 절차&lt;/b&gt;&lt;/font&gt;&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;인덱스 선정을 위한 전체적인 접근 절차&lt;/b&gt;&lt;br  /&gt;ㅁ관계형 DB를 사용하는 애플리케이션은 옵티마이져 액세스 경로 판단 기준으로 수행속도를 향상&lt;br  /&gt;
&nbsp;(인덱스,클러스터의 조정, 통계정보 관리등으로 최적의 실행계획을 생성)&lt;br  /&gt;
ㅁ인덱스는 특정 애플리케이션이나 특정 액세스를 위해서만 생성하는것이 아님&lt;br  /&gt;
ㅁ현재나 향후의 예상되는 액세스 형태를 종합적으로 감안하는 전략이 필요&lt;br  /&gt;
&lt;br  /&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;테이블의 액세스 형태를 최대한으로 수집&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
인덱스 대상 컬럼의 선정 및 분포도 조사&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
특수한 액세스 형태에 대한 인덱스 선정&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
클러스터링 검토&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
결합 인덱스 구성 및 순서의 결정&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
시험 생성 및 테스트&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
수정이 필요한 애플리케이션 조사 및 수정&lt;/span&gt;&lt;br  /&gt;&lt;span style=&quot;color: rgb(120, 32, 185);&quot;&gt;
일괄 적용&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br  /&gt;
&lt;/div&gt;
&lt;br  /&gt;&lt;b&gt;가) 테이블의 액세스 형태를 최대한으로 수집&lt;/b&gt;&lt;br  /&gt;
&lt;br  /&gt;
&lt;b&gt;개발단계의 액세스 형태수집&lt;/b&gt;&lt;br  /&gt;
&lt;br  /&gt;
[그림 1-4-7] 표 참조&lt;br  /&gt;
&lt;br  /&gt;
ㅁ 반복 수행되는 액세스 형태를 찾는다&lt;br  /&gt;- 자신의 수행속도에 반복 횟수를 곱한 만큼의 부하를 가져옴(속도에 많은영향이 있음)&lt;br  /&gt;
&lt;br  /&gt;
ㅁ 분포도가 아주 양호한 컬럼드을 발췌하여 액세스 유형을 조사한다&lt;br  /&gt;
- 하나의 컬럼만을 대상으로 하지말고 경우에 따려 여러개의 컬럼을 검토&lt;br  /&gt;
&lt;br  /&gt;ㅁ 자주 넓은 범위의 조건이 부여되는 경우를 찾는다&lt;br  /&gt;
- 인덱스의 경우 넓은 범위를 처리할때 부담을 많이줌&lt;br  /&gt;
- 처리범위의 최대크기와 평균 예상범위, 처리범위(order by,group by 등) 을 표시&lt;br  /&gt;
&lt;br  /&gt;ㅁ 조건에 자주 사용되는 주요컬럼들을 추출하여 액세스 유형을 조사한다&lt;br  /&gt;
&lt;br  /&gt;
ㅁ 자주 결합되어 사용되는 컬럼들의 조합형태 및 정렬순서를 조사한다&lt;br  /&gt;
- 각 컬럼간의 상호관계를 파악후 조사&lt;br  /&gt;
&lt;br  /&gt;ㅁ 역순으로 정렬하여 추출되는 경우를 찾는다&lt;br  /&gt;
- 최근 자료를 필요로 하는 데이터등&lt;br  /&gt;
&lt;br  /&gt;ㅁ 통계자료 추출을 위한 액세스 유형을 조사한다&lt;br  /&gt;- 통계처리는 범위가 넓기 때문에 수행속도에 영향을 줄수 있음&lt;br  /&gt;
&lt;br  /&gt;
&lt;b&gt;&lt;br  /&gt;
운영단계의 액세스 형태수집&lt;/b&gt;&lt;br  /&gt;
- 애플리 케이션이 작성되어 있는단계 (테스트시점, 가동중인시스템등)&lt;br  /&gt;
&lt;br  /&gt;ㅁ애플리케이션 소스코드에서 SQL을 추출하여 분석용 테이블에 보관한다&lt;br  /&gt;- 애플리케이션 명칭, SQL에 속한 서브루틴과 위치, SQL유형, SQL 원문, 사용 테이블, 사용컬럼, ORDER BY 컬럼, GROUP BY 컬럼, 반복사용여부등 저장&lt;br  /&gt;
- SQL 추출 (소스크드에서 직접추출, SW 이용 - TOAD 의 경우 SQL MONITOR 제공)&lt;br  /&gt;
&lt;br  /&gt;
ㅁSQL-Trace 파일을 파싱&lt;br  /&gt;
- SQL문장뿐만 아니라 실행계획,현재 적용되고 있는 인덱스,실행횟수, 처리범위 등 매우 상세한 정보록 획득&lt;br  /&gt;&lt;br  /&gt;
ㅁ공유 SQL영역에서 직접 SQL을 찾음&lt;br  /&gt;- SQL수집을 보다 간편하게 할수 있도록 도와줌 , 언어의 영향을 받지 않으며, TRACE보다 장기간 수집이 가능&lt;br  /&gt;&lt;b&gt;&lt;br  /&gt;
&lt;br  /&gt;
수집된SQL을 테이블 별로 출력하여 액세스 형태기록&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;
예- [그림 1-4-8] 표&lt;br  /&gt;
- 액세스 형태를 좀더 통합된 형태로 모을수 있다면 유형도 줄어들고 전략 수립도 단순해짐&lt;br  /&gt;
- 조인의 연결고리부분은 무조건 추출하고 연결고리로 알수 있도록 표시 (EX) (J)등) &lt;br  /&gt;
&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;나)인덱스 대상 컬럼의 선정 및 분포도 조사&lt;/b&gt;&lt;br  /&gt;&lt;br  /&gt;
&lt;u&gt;&lt;i&gt;대상컬럼 선정기준&lt;/i&gt;&lt;/u&gt;&lt;br  /&gt;
ㅁ 액세스 유형에 자주 등장하는 컬럼&lt;br  /&gt;ㅁ 인덱스의 앞부분에 지정해야할 컬럼&lt;br  /&gt;ㅁ 기타 수행 속도에 영향을 미칠것으로 예상되는 컬럼&lt;br  /&gt;&lt;br  /&gt;
조건절이라고 무조건 인덱스 구성에 참여할 필요는 없으며&lt;br  /&gt;
예상되는 액세스 유형을 조사하여 인덱스 대상 컬럼 선정과 분포도록 파악하여 효율적인 구조를 연구&lt;br  /&gt;
현행인덱스가 있다면 조사한 액세스 형태가 어떤 형태를 사용하는 등의 파악이 필요&lt;br  /&gt;
&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;다)특수한 액세스 형태에 대한 인덱스 선정&lt;/b&gt;&lt;br  /&gt;
반복해서 액세스되는 형태(Critical Access Path) 찾기 &lt;br  /&gt;
-&nbsp; 자신의 속도 * 횟수&nbsp; 이므로 횟수나 속도가 늘어남에 따라 최종결과도 영향을 받음&lt;br  /&gt;
&lt;br  /&gt;
혼자만으로 확실한 수행속도를 보장받을수 있다면 우선적으로 결정&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;라)클러스터링 검토&lt;/b&gt;&lt;br  /&gt;
넓은 범위의 처리를 향상시킬수 있는 방법을 찾기&lt;br  /&gt;
- 인덱스는 여러개를 동원해야 하지만 클러스터로 액세스 형태를 해결할수 있다면 적용가능 여부 판단 필요&lt;br  /&gt;
- 투자대비 효과(ROI; Return On Investment) 를 확인해야함 &lt;br  /&gt;
&lt;b&gt;&lt;br  /&gt;
마)결합 인덱스 구성 및 순서의 결정&lt;/b&gt;&lt;br  /&gt;
윗단계에서 처리한 컬럼들을 제외한 나머지 컬럼들을 대상으로 액세스 유형들을 다시 한번 확인하여&lt;br  /&gt;
두 컬럼이상의 결합으로 인덱스 생성의 부담보다 생성시 이점이 발견될 경우 &lt;br  /&gt;
새로운 결합 인덱스 생성&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;바)시험생성 및 테스트&lt;br  /&gt;
&lt;/b&gt;인덱스의 변경은 기존 실행계획에 변화를 가져오므로 운영중인 시스템에 적용시키지 말고 테스트 과정을 거쳐야함&lt;br  /&gt;
테스트 결과 예상했던 실행계획이 나타나지 않거나 한다면 액세스 형태에 필요한 힌트등을 기록&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;사)수정이 필요한 애플리케이션 조사 및 수정&lt;br  /&gt;
&lt;/b&gt;특정한 액세스 경로로 유도하기 위한 힌트나 인덱스 사용제한, 해제등의 수정&lt;br  /&gt;
&lt;br  /&gt;&lt;b&gt;아)일괄적용&lt;/b&gt;&lt;br  /&gt;애플리케이션이 실행된되는 순간 파싱이 수행(Runtime parsing)&lt;br  /&gt;
하지만 액세스 형태를 수집할때 잘못된 SQL을 발견하면 SQL의 수정사항등을 같이 기록하여야하며&lt;br  /&gt;
필요시 애플리케이션의 수정을 요구할때도 있다.&lt;br  /&gt;
&lt;br  /&gt;
&lt;br  /&gt;&lt;/div&gt;]]></description>
						<pubDate>Sun, 23 Aug 2009 21:58:27 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[3.2.4. 비트맵(Bitmap) 실행계획]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=476</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=476</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=476#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;blockquote class=&quot;q6&quot;&gt;&lt;p&gt;다양한 실행계획의 종류를 하나씩 살펴보고&lt;/p&gt;&lt;p&gt;각 상황에 맞는 쿼리 형태를 학습한후 상황에 맞게 사용할수 있도록 이해하여 필요시 적적하게 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;사용할수 있도록 하는게 중요&lt;br  /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.2.4. 비트맵(Bitmap) 실행계획&lt;/b&gt;&lt;br  /&gt;비트맵은 단일 테이블의 입장에서만 살펴봄&lt;br  /&gt;&lt;br  /&gt;** 범위&lt;br  /&gt;조건 연산자별 비트맵 실행계획&lt;br  /&gt;- 동치(Equal) 비교 실행계획&lt;br  /&gt;- 범위(Range) 비교 실행계획&lt;br  /&gt;- AND 조건 실행계획&lt;br  /&gt;- OR 조건 실행계획&lt;br  /&gt;- 부등식(Not equal)실행계획&lt;br  /&gt;-NULL 비교 실행계획&lt;br  /&gt;서브 쿼리 실행계획&lt;br  /&gt;B-Tree 인덱스와의 연합(Comnbine) 실행계획&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.2.4.1. 조건 연산자별 비트맵 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;가)동치(Equal) 비교 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&#039;=&#039; 이나 &#039;IN&#039; 연산 모두 SINGLE VALUE로 나타남&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE TIME_CD=&#039;200512&#039;;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;---------------------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX(&lt;b&gt;SINGLE VALUE&lt;/b&gt;) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;....&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;WHERE TIME_CD IN (&#039;200505&#039;,&#039;200507&#039;,&#039;200510&#039;);&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------------&lt;/p&gt;&lt;p&gt;&lt;b&gt;INLIST ITERATOR&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;BITMAP INDEX(&lt;b&gt;SINGLE VALUE&lt;/b&gt;) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;나)범위(Range)비교 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&#039;BETWEEN,LIKE,&gt;,&lt;,&gt;=,&lt;=&#039;&nbsp; ;&nbsp; &lt;b&gt;RANGE SCAN&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE TIME_CD BETWEEN &#039;200505&#039; AND &#039;200507&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Exectuion Plan&lt;/p&gt;&lt;p&gt;-------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (&lt;b&gt;RANGE SCAN&lt;/b&gt;) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;만약 NUMBER 형으로 저장된 컬럼에 LIKE 를 사용한다면 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;BTREE INDEX는 자료 변형으로 사용되지 않지만 BITMAP은 &#039;FULL SCAN&#039;으로 나타난다.&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE SALE_DEPT LIKE &#039;1250%&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (FRULL SCAN) OF &#039;SALE_DEPT_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;다) AND 조건 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;두 비트맵 인덱스 보유 컬럼의 &#039;AND&#039; 조건 사용시 &#039;AND 연산&#039; 실시&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE SALE_DEPT = &#039;12500&#039;&lt;/p&gt;&lt;p&gt;AND TIME_CD =&#039;200510&#039;;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&lt;b&gt; BITMAP AND&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALE_DEPT_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;BETWEEN등으로 범위스캔하고 AND 조건 사용시 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE SALE_DEPT = &#039;12500&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; AND TIME_CD BETWEEN &#039;200510&#039; AND &#039;200512&#039;;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&lt;b&gt; BITMAP AND&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALE_DEPT_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;BITMAP MERGE&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (RANGE SCAN) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;br  /&gt;&lt;p&gt;&lt;b&gt;라)OR조건 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;각컬럼별로 단위 액세스를 생성후 &#039;OR&#039; 연산 실시&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE TIME_CD = &#039;200510&#039;&lt;/p&gt;&lt;p&gt;OR ITEM_CD LIKE &#039;ABC%&#039;&lt;/p&gt;&lt;p&gt;OR SALE_DEPT = 12500;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;---------------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;BITMAP OR&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP MERGE&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (RANGE SCAN) OF &#039;ITEM_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALE_DEPT_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;복잡한 OR 조건에도 동일한 원리로 수행&lt;/p&gt;&lt;p&gt;부정형 조건과 사용되면 부정형 조건이 적용된 컬럼은 사용되지 않음&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;마)부등식(Not equal)비교 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&#039;BITMAP MINUS&#039; 연산을 수행 ; 등식 조건으로 액스사한 후 먼저 수행한 비트맵에서 제거하는 처리&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;단일 컬럼만 존재할경우 ; FULL SCAN 수행&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;NOT NULL 제약 조건을 가진경우 AND 연산 ; BITMAP MINUS를 한번만 거침&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE TIME_CD = &#039;200512&#039;&lt;/p&gt;&lt;p&gt;AND SALE_DEPT &lt;&gt; 12500;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&lt;b&gt; BITMAP MINUS&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALE_DEPT_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;NULL을 허용할 경우&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;BITMAP MINUS&lt;/b&gt;&lt;b&gt;&nbsp;&nbsp;&lt;/b&gt; &nbsp;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;b&gt; BITMAP MINUS&nbsp;&nbsp; &nbsp;&lt;/b&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALE_DEPT_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALE_DEPT_BIX&#039; &nbsp; &lt;--- NULL인경우 제거&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;바)NULL비교 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;NULL 연산 역시 일반 값들과 동일하게 비트맵 연산에 참여시켜 동작&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE TIME_CD=&#039;200512&#039;&lt;/p&gt;&lt;p&gt;AND COUNTRY IS NULL;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;----------------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP AND&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;BITMAP INDEX (SINGLE VALUE) OF &#039;COUNTRY_BIX&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.2.4.2. 서브쿼리 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT * FROM SALES_SUM&lt;/p&gt;&lt;p&gt;WHERE ITEM_CD IN (SELECT ITEM_CD FROM ITEM_T&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE CATEGORY_CD = &#039;ABC&#039; );&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;------------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (UNIQUE)&nbsp; &lt;----- 서브 쿼리&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;ITEM_T&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;ITEM_IDX2&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;ITEM_BIX&#039;&nbsp; &lt;-- 제공 받은 값으로 비트맵 인덱스&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;서버쿼리가 동시에 사용될경우는 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;첫 서브쿼리가 먼저 수행되어 비트맵 인덱스로 실행되어 제공자 역할을 한후 후 수행되는 서브쿼리가&lt;/p&gt;&lt;p&gt;제공자 역할을 하는 형태의 수행계획이 생성됨&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;스타 변형 조인 ; 모든 서브쿼리가 먼저 수행되어 처리 범위를 충분히 줄인 다음 팩트 테이블을 액세스 하는것&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT /*+ STAR_TRANSFORMATION */&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; I.ITEM_CD, SUM(S.AMOUNT) SAL_AMOUNTS&lt;/p&gt;&lt;p&gt;FROM&nbsp;&nbsp;&nbsp; SALES_SUM S,ITEMS I,COUNTRYS C&lt;/p&gt;&lt;p&gt;WHERE S.ITEM_CD = I.ITEM_CD&lt;/p&gt;&lt;p&gt;AND S.COUNTRY = C.COUNTRY_CD&lt;/p&gt;&lt;p&gt;AND I.CATEGORY_TYPE = &#039;Clothes&#039;&lt;/p&gt;&lt;p&gt;AND C.AREA=&#039;EUROPE&#039;&lt;/p&gt;&lt;p&gt;GROUP BY I.ITEM_CD;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;--------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATMENT Optimizer=ALL_ROWS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; SORT GROUP BY&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; HASH JOIN &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;HASH JOIN&lt;/b&gt; &lt;i&gt;&lt;-- 엑세스한 팩트 테이블과 디멘전 테이블 조인&lt;/i&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES_SUM&lt;/b&gt;&#039;&nbsp; &lt;i&gt;&lt;-- 비트맵들을 결합하여 액세스&lt;/i&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP AND&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP AND&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;BITMAP MERGE&lt;/b&gt;&nbsp;&lt;i&gt; &lt;-- ITEMS 서브쿼리로 팩트 테입ㄹ의 비트맵 액세스&lt;/i&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP KEY ITERATION&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;ITEMS&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (RANGE SCAN) OF &#039;ITEM_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;BITMAP MERGE&lt;/b&gt; &lt;i&gt;&lt;-- COUNTRY 서브쿼리로 팩트 테이블의 비트맵 액세스&lt;/i&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP KEY ITERATION&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;COUNTRYS&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (RANGE SCAN) OF &#039;COUNTRY_BIX&#039;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.2.4.3. B-tree 인덱스와의 연합(Combine) 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&#039;ITEM_CD&#039;; 비트맵 인덱스&lt;/p&gt;&lt;p&gt;&#039;PRICE&#039; ; B-Tree 인덱스&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT /*+ INDEX_COMBINE (SALES) */ *&lt;/p&gt;&lt;p&gt;FROM SALES&lt;/p&gt;&lt;p&gt;WHERE ITEM_CD = &#039;PA100&#039;&lt;/p&gt;&lt;p&gt;AND PRICE &gt;= 100000;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;----------------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;SALES&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP AND&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;ITEM_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (FROM ROWIDS)&nbsp; &lt;- BTREE를 비트맵으로 전환&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (ORDER BY)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;PRICE_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;B-TREE인덱스만 사용될경우도 &#039;INDEX_COMBINE&#039; 힌트를 적용하면 비트맵 액세스가능&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;테이블 액세스전 최대한 인덱스간의 머지를 통해 범위를 줄이는것이 가능하지만 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;인덱스 머지의 오버해드가 더 커다면 역효과가 나타날수도 있음&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;3.2.5. 기타 특수한 목적을 처리하는 실행계획&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;3.2.5.1. 순환(Recursive) 실행계획&lt;/p&gt;&lt;p&gt;&#039;CONNECT BY ... START WITH&#039; 문을 사용했을 때나타나는 실행계획&lt;/p&gt;&lt;p&gt;순전개&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT LPAD(&#039; &#039;,2* (LEVEL -1__ || ename, empno, sal,mgr, &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SYS_CONNECT_BY_PATH(last_name,&#039;/&#039;) &quot;Path&quot;&lt;/p&gt;&lt;p&gt;FROM emp&lt;/p&gt;&lt;p&gt;WHERE job=&#039;CLERK&#039;&lt;/p&gt;&lt;p&gt;CONNECT BY mgr= PRIOR empno&lt;/p&gt;&lt;p&gt;START WITH empno= :b1;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; FILETER&nbsp; --- 3&nbsp; where절 job=&#039;clerk&#039;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; CONNECT BY (WITH FILTERNING)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&nbsp; --- 1&nbsp; start with 에서 정한 초기 조건&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF &#039;PK_EMP&#039; (UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY USER ROWID) OF &#039;EMP&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;NESTED LOOPS&nbsp; ---2&nbsp;&nbsp; connect by 절의 prior 절뒤쪽을 가져와서 상대 컬럼을 조인비교&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;BUFFER (SORT)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;CONNECT BY PUMY&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;MGR_IDX&#039; (UNIQUE)&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;* 1,2,3 의 순서대로 수행&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;각 단계(level)별 정렬이 필요할경우 ORDER&nbsp; SIBLINGS BY ... 을 사용&lt;/p&gt;&lt;p&gt;connect by 의 연결에 사용할 인덱스가 없거나 테이블 크기가 적다면 해쉬조인으로 내측 루프를 수행&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;조인쿼리를 순환 전개 시킬경우&lt;/p&gt;&lt;p&gt;where 절의 조인을 수행한후 루트들을 선별 (조인한 결과 집합이 필요하기 때문)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;3.2.5.2. UPDATE 서브쿼리 실행계획&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;UPDATE 문은 SET절과 WHERE 절에서 서브쿼리 사용가능&lt;/p&gt;&lt;p&gt;&nbsp;SET 절의 서브쿼리를 스칼라 서브 쿼리 (하나의 로우에 하나의 컬럼값을 가짐)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;UPDATE emp e&lt;/p&gt;&lt;p&gt;SET sal = (SELECT AVG(sal) * 1.2&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM bouns b&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE b.empno=e.empno&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND b.pay_date between :b1 and :b2)&lt;/p&gt;&lt;p&gt;WHERE deptno IN (SELECT deptno FROM dept&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE loc=&#039;BOSTON&#039;);&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------&lt;/p&gt;&lt;p&gt;UPDATE STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; UPDATE OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;EMP&#039; &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;DEPT&#039;&nbsp; --- 서브쿼리를 수행 하여 메인쿼리와 조인&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;LOC_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;EMP_DEPTNO_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (AGGREGATE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;BONUS&#039;&nbsp; -- SET 절의 스칼라 쿼리 수행&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;BONUS_PK&#039; (UNIQUE)&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;UPDATE 문이라고해도 해쉬조인으로도 수행&lt;/p&gt;&lt;p&gt;* 메인쿼리에서 제공받은 값으로 수행된 서브쿼리의 결과가 &#039;No DATA FOUND&#039; 라면 &#039;NULL&#039;로 인정되어 갱신&lt;/p&gt;&lt;p&gt;* 에러: 쿼리가 정상적으로 수행되지 않은것&lt;/p&gt;&lt;p&gt;* 실패: 결과가 존재하지 않은것 ; NVL 등이 듣지 않음&lt;/p&gt;&lt;p&gt;* SUM,MIN,MAX,COUNT,AVG등의 그룹함수는 &#039;실패&#039;가 발생하지 않음&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;뷰의 UPDATE&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;CREATE OR REPLACE VIEW EMP_DEPT_VIEW AS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SELECT X.EMPNO, X.ENAME, X.JOB, &lt;u&gt;X.SAL&lt;/u&gt;, Y.LOC, Y.DNAME&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FROM &lt;u&gt;EMP&lt;/u&gt; X, &lt;i&gt;DEPT&lt;/i&gt; Y&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHERE X.DEPTNO = Y.DEPTNO;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; UPDATE EMP_DEPT_VIEW E&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SET &lt;u&gt;SAL&lt;/u&gt;= DECODE(&lt;i&gt;DNAME&lt;/i&gt;,&#039;SALES&#039;,1.2,1,1) * SAL&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; WHERE LOC LIKE &#039;AB%&#039;;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------------&lt;/p&gt;&lt;p&gt;UPDATE STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; UPDATE OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;b&gt;HASH JOIN&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;&lt;i&gt;DEPT&lt;/i&gt;&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;LOC_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;3.2.5.3. 특이한 형태의 실행계획&lt;/p&gt;&lt;p&gt;가) 서브쿼리 팩토링 실행계획&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&#039;WITH&#039; : 쿼리를 임시 테이블에 저장한후 사용 (INLINE 뷰와 유사하게 사용)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;WITH total_sal AS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; (SELECT D.deptno, D.loc, E.job, sum(E.sal) tot_sal&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM emp E, dept D&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE E.deptno=D.deptno&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND&nbsp;&nbsp;&nbsp; E.hiredate &gt; :b1&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GROUP BY D.deptno, D.loc, E.job)&lt;/p&gt;&lt;p&gt;SELECT e.empno, e.name, e.sal, e.sal/t.tot_sal sal_percent&lt;/p&gt;&lt;p&gt;FROM emp e,total_sal t&lt;/p&gt;&lt;p&gt;WHERE e.deptno = t.deptno&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; AND e.sal &gt; (SELECT max(tot_sal)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM total_sal&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE job=&#039;CLERK&#039;);&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;----------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; RECURSIVE EXECUTION OF &#039;SYS_LE_2_0&#039;&nbsp;&nbsp; --- WITH 절의 쿼리 수행&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;TEMP TABLE TRANSFORMATION&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;SYS_TEMP_0FD9D6616_165207A&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;EMP_DEPTNO_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (AGGREGATE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;SYS_TEMP_0FD9D6616_165207A&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;TEMP TABLE TRANSFORMATION ; 기존의 쿼리를 새로 생성된 임시 테이블로 변형&lt;/p&gt;&lt;p&gt;WITH절의 쿼리가 한번만 쓰임 인라인 뷰였다면 동일 쿼리를 두번수행&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;한번의 복잡한 가공을 여러번 재활용 할때 최적&lt;/p&gt;&lt;p&gt;WITH절의 하나이상을 사용가능&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;나) 특인한 DELETE 문 서브쿼리&lt;/p&gt;&lt;p&gt;DELETE FROM (SELECT * FROM EMP&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE JOB=&#039;CLERK&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND comm &gt; 10000&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND deptno IN (SELECT deptno FROM dept&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE loc=&#039;BOSTOM&#039;));&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-----------------------------------------&lt;/p&gt;&lt;p&gt;DELETE STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; DELETE OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;EMP&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF &#039;PK_EMP&#039; (UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;DEPT&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF &#039;PK_DEPT&#039; (UNIQUE)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;다)다중테이블 입력(Multi-table Insert)서브쿼리&lt;/p&gt;&lt;p&gt;INSERT ALL&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; WHEN ORDER_TOTAL &lt; 1000000&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; THEN&nbsp;&nbsp;&nbsp; INTO SMALL_ORDERS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; WHEN ORDER_TOTAL &gt; 1000000 AND ORDER_TOTAL&nbsp; &lt; 2000000&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; THEN &nbsp;&nbsp; INTO MEDIUM_ORDERS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; WHEN ORDER-TOTAL &gt; 2000000&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; THEN INTO LARGE_ORDERS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; SELECT ORDER_ID,ORDER_TOTAL,SALES_REP_ID,CUSTOMER_ID&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; FROM ORDERS;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;------------------&lt;/p&gt;&lt;p&gt;INSERT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; MULTI-TABLE INSERT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INTO OF &#039;SMALL_ORDERS&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INTO OF &#039;MEDIUM_ORDERS&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INTO OF &#039;LARGE_ORDERS&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;ORDERS&#039;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;시스템 데이터를 관계형 데이터베이스 구조로 이행할때 유용&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;라)HAVING 절 서브쿼리 실행 계획&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT department_id,manager_id&lt;/p&gt;&lt;p&gt;FROM employees&lt;/p&gt;&lt;p&gt;GROUP BY department_id,manager_id&lt;/p&gt;&lt;p&gt;HAVING (department_id, manager_id) IN (SELECT e.deptno, e.mgr&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM emp e,dept d&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE e.deptno = d.deptno&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND d.oc=&#039;BOSTON&#039;);&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; FILTER&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SORT (GROUP BY)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (FULL) OF &#039;EMPLOYEES&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;DEPT&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;LOC_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND-EQUAL&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;EMP_MGR_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;EMP_DEPTNO_IDX&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;마)ROLLUP,CUBE,GROUPING SETS 처리 실행계획&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;SELECT co.country_region,co.country_subregion,&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUM*s.amount_sold) &quot;Revenue&quot;,&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; GROUP_ID() g&lt;/p&gt;&lt;p&gt;FROM sales s,customers c, countries co&lt;/p&gt;&lt;p&gt;WHERE s.cust_id=c.cust_id&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; AND c.country_id=co.country_id&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;AND s.time_id= :b1&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;AND co.country_region IN (&#039;Americas&#039;,&#039;Europe&#039;)&lt;/p&gt;&lt;p&gt;GROUP BY ROLLUP (co.country_region, co.country_subregion);&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-----------------------------&lt;/p&gt;&lt;p&gt;SELECT STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; SORT (&lt;b&gt;GROUP BY ROLLUP&lt;/b&gt;)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; PARTITION RANGE (SINGLE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY LOCAL INDEX ROWID) OF &#039;SALES&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP CONVERSION (TO ROWIDS)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; BITMAP INDEX (SINGLE VALUE) OF &#039;SALES_TIME_BIX&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;TABLE ACCESS (BY INDEX ROWID) OF &#039;CUSTOMERS&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (UNIQUE SCAN) OF &#039;CUSTOMERS_PK&#039; (UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;INDEX (UNIQUE SCAN) OF &#039;COUNTRY_C_ID_PK&#039; (UNIQUE)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;CUBE 역시 동일 형태의 실행계획 생성&lt;/p&gt;&lt;p&gt;GROUPING SETS; GROUPING SETS( (DEPTNO,JON),(ENAME,DEPTNO) ) 의 형태로 사용되며&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 정의된 그룹별로 결과가 나타남&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;바)MERGE문 실행계획&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;조인에 성관한것은 UPDATE, 실패한것은 INSERT&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;MERGE INTO bonuses D&lt;/p&gt;&lt;p&gt;USING ( SELECT employee_id, salary, department_id&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM employees&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE department_id=80) S&lt;/p&gt;&lt;p&gt;ON (D.employee_id = S.employee_id)&lt;/p&gt;&lt;p&gt;WHEN MATCHED &nbsp;&nbsp;&nbsp; THEN UPDATE SET D.bonus = D.bonus + S.salary * .01&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; DELETE WHERE (S.salary &gt; 8000)&lt;/p&gt;&lt;p&gt;WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; VALUES (S.employee_id, S.salary * 0.1);&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;Execution Plan&lt;/p&gt;&lt;p&gt;-------------------------------------&lt;/p&gt;&lt;p&gt;MERGE STATEMENT&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp; MERGE OF &#039;BONUSES&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; VIEW &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NESTED LOOPS (OUTER)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;EMPLOYEES&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;EMPLOYEE_X1&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY INDEX ROWID) OF &#039;BONUSES&#039;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF &#039;BONUSES_X1&#039; (NON-UNIQUE)&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;/div&gt;]]></description>
						<pubDate>Sun, 23 Aug 2009 21:54:18 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[3.3. 실행계획의 제어]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=418</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=418</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=418#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;h3 style=&quot;font-weight: bold;&quot;&gt;3.3. 실행계획의 제어 
&lt;/h3&gt;&lt;div style=&quot;font-weight: bold;&quot;&gt;&lt;h3&gt;3.3.1. 힌트의 활용 기준&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;- 잘못을 바로 잡아 주는 용도보다 옵티마이져가 가지고 있지 못하는 정보를 우리가 더 많이 알고 있을 때나 특별한 목적을 관철하고자 할때 사용&lt;/div&gt;
&lt;div&gt;- 불필요한 힌트는 액세스 경로에 결정적 악영향을 미칠수도 있음&lt;/div&gt;
&lt;div&gt;&lt;br  /&gt;&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;&lt;h3&gt;3.3.2. 최적화 목표(Goal) 제어 힌트&lt;/h3&gt;&lt;/div&gt;

&lt;div&gt;옵티마이져 모드를 바꾸어서 그 결과를 살펴보는 목적&lt;br  /&gt;&lt;br  /&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ALL_ROWS&lt;/span&gt; ; 쿼리 전체를 최적화 할경우의 최저비용의 실행계획 수립&lt;/div&gt;
&lt;div&gt;&nbsp;ex) select /*+ ALL_ROWS */ ..&lt;/div&gt;
&lt;div&gt;&nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;CHOOSE&lt;/span&gt; ; 통계정보 유무에 따라 규칙기준이나 비용기준을 적용&lt;/div&gt;
&lt;div&gt;&nbsp;ex) SELECT /*+ CHOOSE */ ..&lt;/div&gt;
&lt;div&gt;&nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;FIRST_ROWS&lt;/span&gt; ; 최적 응답시간(Best response time)을 목표로 최저 비용의 실행계획을 수립하도록 유도&lt;br  /&gt;&nbsp;ex) SELECT /*+ FIRST_ROWS */ ...&lt;/div&gt;
&lt;div&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT /*+ FIRST_ROWS(10) */ ...&lt;/div&gt;
&lt;div&gt;&nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;RULE&lt;/span&gt; ; 규칙 기준 옵티마이져를 이용한 최적화를 요구&lt;/div&gt;
&lt;div&gt;&nbsp;ex) SELECT /*+ RULE */ ...&lt;/div&gt;
&lt;div&gt;&nbsp;&lt;/div&gt;
&lt;div style=&quot;font-weight: bold;&quot;&gt;&lt;h3&gt;3.3.3. 조인 순서 조정을 위한 힌트&lt;br  /&gt;&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;다수의 테이블을 조인하는 경우에 조인 순서에 혼선이 있을 때 적용&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;ORDERED&lt;/span&gt; ; FROM 절에 기술된 테이블 순서대로 조인을 수행하도록 유도&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; 조인 방법을 유도하기 위한 USE_NL, USE_MERGE 등의 힌트와 함계 사용&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ ORDERED */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM&nbsp;&nbsp;&nbsp; TAB1, TAB2, TAB3&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE ....&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT /*+ ORDERED USE_NL (A B C) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM TAB1&nbsp; a, TAB2 b, TAB3 c&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE ....&lt;br  /&gt;&lt;/div&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;LEADING&lt;/span&gt; ; FROM 절에 기술한 테이블의 순서와 상관없이 조인 순서를 제어&lt;br  /&gt;&lt;br  /&gt;ex) &nbsp;&nbsp;&nbsp; SELECT /*+ LEADING ( b c ) * / ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM CUST a, ORDER_DETAIL b, ITEM c&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE a.cust_no = b.cust_no&lt;br  /&gt;&nbsp;&nbsp;&nbsp; and&nbsp;&nbsp;&nbsp; b.item_no = c.item_no&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;&lt;br  /&gt;&lt;h3&gt;3.3.4. 조인 방법 선택용 힌트&lt;/h3&gt;&lt;p&gt;&lt;br  /&gt;조인 방식들에 대한 확실한 이해가 바탕이 되어야 함&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;USE_NL&lt;/span&gt; ; Nested Loops 방식을 사용하여 조인을 수행&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ USE_NL(a b c) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM TAB1 a, TAB2 b, TAB3 c&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE ...&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_USE_NL&lt;/span&gt; ; Nested Loops 방식을 제외한 다른 방식의 조인을 사용하도록 제시&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NO_USE_NL(l h) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM&nbsp;&nbsp;&nbsp; orders h, order)items l&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE&nbsp;&nbsp;&nbsp; l.order_id = h.order_id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND&nbsp;&nbsp;&nbsp; l.order_date &gt;= &#039;20050101&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;USE_NL_WITH_INDEX&lt;/span&gt; ; USE_NL과 INDEX 힌트를 하나로 통합한것 (NL 조인에서 외측루프의 주관 인덱스를 지정)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&lt;br  /&gt;ex) SELECT /*+ USE_NL_WITH_INDEX(l item_prod_ix) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM orders h, order_items l&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE l.order_id = h.order_id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND l.order_item like &#039;ADEN%&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND h.order_dt between &#039;20051001&#039; and &#039;20051015&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;USE_HASH &lt;/span&gt;; 해쉬 조인 방식으로 조인이 수행되도록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ USE_HASH(a b) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sale a, pre+order b&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE a.order_id=b.order_id&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND a.sale_dt like &#039;2005%&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_USE_HASH &lt;/span&gt;; 해쉬 조인을 제외한 다른 방식의 조인을 고려토록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NO_USE_HASH(m d) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM member m, dept d&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE m.deptid = d.deptid;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;USE_MERGE&lt;/span&gt; ; Sort Merge 방식으로 조인을 수행하도록 유도 , 필요시 &#039;ordered&#039; 힌트와 같이 사용&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ USE_MERGE(a b) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sale a, pre_order b&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE a.order_id = b.order_id&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND a.sale_dt BETWEEN &#039;20050701&#039; AND &#039;20050930&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND b.cust_no =&#039;101&#039;;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;NO_USE_MERGE&lt;/span&gt;; Sort Merge 방식을 제외한 다른 방식의 조이 고려토록 유도&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;h3&gt;3.3.5. 병렬처리 관련 힌트&lt;/h3&gt;&lt;p&gt;&lt;br  /&gt;시스템 자원을 최대한 사용하여 결과를 얻는 절대 시간을 줄이겠다는 목적&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;PARALLEL&lt;/span&gt; ; 대량의 DATA에 대한 TABLE을 액세스 할때와 DML을 처리할때 SQL의 병렬처리를 지시하는 힌트&lt;br  /&gt;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; PARALLEL THREADS를 나타내는 숫자(PARALLEL DEGREE)와 함께사용,
Parallel Degree를 지정하지 않으면 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PARALLEL_THREADS_PER_CPU 파라메터에 정의된 값을 이용&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; TABLE 정의시 PARALLEL 을 지정하였다면 힌트없이 적용 &lt;br  /&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; DML 문에 적용시는 ALTER SESSION ENABLE PARALLEL DML&#039; 을 지정해야함&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ FULL (sales) PARALLEL (sales) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SUBSTR(sale_dt,1,6),SUM(qty)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sales&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE sale_dt between &#039;20030101&#039; AND &#039;20051231&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GROUP BY SUBSTR(sale_dt,1,6);&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT /*+ FULL (sales) PARALLEL (sales, 8 ) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SUBSTR(sale_dt,1,6), SUM(qty)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sales&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE sale_dt&nbsp;&nbsp;&nbsp; BETWEEN &#039;20030101&#039; AND &#039;20051231&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GROUP BY SUBSTR(sale_dt,1,6);&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NOPARALLEL&lt;/span&gt; ; 해당 테이블의 PARALLEL&nbsp; 파라메터를 무시하고 병렬처리를 하지 않는 실행계획을 수립&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (버전에 따라 NO_PARALLEL)&lt;br  /&gt;ex) SELECT /*+ NOPARALLEL (m) */ member_name&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM members m;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;PQ_DISTRIBUTE&lt;/span&gt; ; 슬레이브 프로세스 ( 생산자(Producer)와 소비자(Consumer)프로세스) 사이에서 조인할 테이블 로우를 할당작업(Distribution)을 하는 방법을 정의하는 힌트&lt;br  /&gt;&lt;br  /&gt;expression) /*+PQ_DISTRIBUTE (table, outer_distribution,inner_distribution) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; - outer_distribution ; 외측 테이블에 대한 할당 방법을 기술&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; - inner_distribution ; 내측 테이블에 대한 할당 방법을 기술&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; - 할당 방법 :&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;- HASH: 해시 함수를 수행한 결과값을 이용하여 소비자 프로세스의 로우들을 할당&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; - BROADCAST : 외측 테이블 전체 로우를 모든 CONSUMER 프로세스로 보냄&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; - PARTITION : 조인 대상 테이블이 조인 키 칼럼으로 파티션되어있을 경우 파티션 키 값을 이용하여 로우들을 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 소비자 프로세스에 할당&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; - NONE ; 조인 대상 로우들을 랜덤하게 할당&lt;br  /&gt;&lt;br  /&gt;ex) &nbsp;&nbsp;&nbsp; SELECT /*+ ORDERED PQ_DISTRIBUTE (b HASH, HASH) USE_HASH(b) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM TAB1 a, TAB2 b&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHERE a.col1 = b.col2;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; SELECT /*+ PQ_DISTRIBUTE ( b BROADCAST, NONE) USE_HASH(b) */ ...&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM TAB1 a, TAB2 b&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE a.col1 = b.col2;&lt;br  /&gt;*** ????&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;PARALLEL_INDEX&lt;/span&gt; ; 파티션 인덱스에 대한 인덱스 범위 스캔을 병렬로 수행하기 위한 병렬도를 지정&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ PARALLEL_INDEX(table1,index1, 3) */ ...&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NOPARALLEL_INDEX&lt;/span&gt; ; parallel 파라메터를 무시하여 병렬 인덱스 범위 스캔을 하지 않음&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 버젼에 따라 NO_PARALLEL_INDEX&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+NOPARALLEL_INDEX (m mem_join_idx) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM members m&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE join_date BETWEEN &#039;20040101&#039; AND &#039;20051231&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;h3&gt;3.3.6. 액세스 수단 선택을 위한 힌트&lt;/h3&gt;&lt;p&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;FULL &lt;/span&gt;; 전체 테이블 스캔 방식으로 유도&lt;br  /&gt;ex) SELECT /*+ FULL (t) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM BIG_TAB T&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE cre-date &gt;=&#039;20050101&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;HASH&lt;/span&gt; ;&nbsp; 해쉬 스캔 방식으로 액세스 하도록 유도하는 힌트&lt;br  /&gt;ex) /*+ HASH(TABLE_NAME) */&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;CLUSTER&lt;/span&gt; ; 클러스터 인덱스를 통해 스캔하도록 유도&lt;br  /&gt;ex) /*+ CLUSTER(table_name) */&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX &lt;/span&gt;; 인덱스 범위 스캔을 유도 (뷰의 경우 뷰쿼리 내부의 테이블 인덱스 지정가능)&lt;br  /&gt;ex) SELECT /*+ INDEX(s sales_pk) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sales s&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE sale_date=&#039;20051015&#039;;&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT /*+ INDEX(VIEW_cust cust cname_idx_ */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM VIEW_cust&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE cust_name = &#039;TOMCAT&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_INDEX &lt;/span&gt;; 지정한 인덱스를 제외하고, 다른 액세스 방법을 고려하도록 유도&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; INDEX,INDEX_ASC,INDEX_DESC,INDEX_COMBINE,INDEX_FFS등을 함께사용하면 두 힌트 모두 무시&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NO_INDEX(m member_pk) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM members m&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE member_id &gt; 10200;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_ASC&lt;/span&gt; ; 지정한 인덱스를 인덱스 컬럼 값의 오름차순으로 범위 스캔하도록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_ASC(a idx01) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM tab1 a&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE col1 LIKE &#039;ABC%&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_DESC&lt;/span&gt; ; 지정한 이덱스를 인덱스 컬럼값의 내림차순으로 범위 스캔하도록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_DESC(a idx01) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM tab1 a&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE col1 LIKE &#039;ABC%&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_COMBINE&lt;/span&gt; ; 2개 이상의 인덱스를&nbsp; 비트맵 인덱스로 변경/결합하여 테이블을 액세스 하는 방식으로 유도하는 힌트&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_COMBINE (e sal_bix hiredate_bix) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM emp e&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE sal&gt;3000 AND hiredate &lt; &#039;20050715&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_FFS&lt;/span&gt; ; 인덱스 전체 범위를 스캔하는 방식으로 유도하는 힌트, 다중 블록을 스캔&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_FFS (table_name index_name) */ ...&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_INDEX_FFS&lt;/span&gt; ; 고속 전체 인덱스 스캔 방식을 제외한 다른 액세스 방법을 사용하도록 유도&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_JOIN&lt;/span&gt; ; 두개 이상의 인덱스들만으로 조인을 수행하도록 유도 ( 인덱스가 필요로 하는 모든 컬럼의 값을 가져야함)&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_JOIN(e SAL_BMP HIREDATE_IX) */sal,hiredate &lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM emp e&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE hiredate &lt; sysdate and sal &gt; 2000;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_SS &lt;/span&gt;; 인덱스 스킵 스캔 방식으로 인덱스를 액세스 하도록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_SS (e emp_idx_ */ ..&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM emp e&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE hiredate = sysdate;&lt;br  /&gt;&lt;br  /&gt;** 다시 한번더 확인&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_INDEX_SS&lt;/span&gt; ; 지정한 테이블의 인덱스에 대한 스킵스캔을 제외한 다른 액세스 방법을 사용하도록 유도&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_SS_ASC&lt;/span&gt; ; 인덱스 스킵 스캔 방식에서 오름차순으로 읽도록 유도&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;INDEX_SS_DESC &lt;/span&gt;; 인덱스 스캡 스캔 방식에서 내림차순으로 읽도록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ INDEX_SS_DESC(e ename_ix) */ ..&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM employees e&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE first_name = &#039;Steven&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;h3&gt;3.3.7. 쿼리형태 변형(Query Transformation)을 위한 힌트&lt;/h3&gt;&lt;p&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;USE_CONCAT &lt;/span&gt;; OR 이나 IN 연산자를 별도의 실행 단위로 분리하여 실행계획을 수립하고 연결하는 통합실행계획을 수립하도록 유도&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+USE_CONCAT */&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM emp&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE job =&#039;CLERK&#039; OR deptno=10;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_EXPAND &lt;/span&gt;; OR 이나 IN을 연결 실행계획으로 처리되지 않도록 사용 (USE_CONCAT의 반대)&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NO_EXPAND */ ..&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM CUSTOMER&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE CUST_TYPE IN (&#039;A&#039;,&#039;B&#039;);&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;REWRITE&lt;/span&gt; ; M-VIEW(실체뷰) 를 사용할때 뷰에 사용된 테이블을 직접액세스하거나 M-VIEW를 액세스하는 것중 유리한것을 석택하도록 쿼리 재작성작업을 함&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+REWRITE (sales_mv) */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; c.cust_id, MIN(c.cust_name), COUNT(distinct order_id)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sales s, order o, customer c&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE s.order_id=o.order_id&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND o.order_cust = c.cust_id&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GROUP BY c.cust_id;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NOREWRITE&lt;/span&gt; ; QUERY_REWRITE_ENABLED 파라메터가 TRUE로 정어되어있어도 이를 무시 &lt;br  /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M-view가 있어도 원 테이블로 직접 계산을 유도함으로 최신값으로 결과로 출력 할수있음&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NOREWRITE */ sum(s.amount_sold) AS dollars&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sales s, times t&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE s.time_id = t.time_id&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GROUP BY t.calendar_month_desc;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;MERGE&lt;/span&gt; ; 뷰쿼리 병합이 가능함에도 불고하고 뷰쿼리 병합이 일어나지 않을 경우&lt;br  /&gt;ex) SELECT /*+ MERGE(table_name) */ ...&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_MERGE&lt;/span&gt; ; 뷰쿼리 병합이 일어나지 않도록 요구 하는 힌트&lt;br  /&gt;ex) SELECT /*+ NO_MERGE(table_name) */ ..&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;STAR_TRANSFORMATION&lt;/span&gt; ; 소량의 데이터를 가진 여러개의 디멘전 테이블과 팩트 테이블의 개별 비트맵 인덱스를 이용하여 처리 범위를 줄이는 조인방식&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ STAR_TRANSFORMATION */&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; d.dept_name, c.cust_city, p.product_name, SUM(s.amount) sales_amount&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM SALES s, PRODUCTS t, CUSTOMERS c, DEPT d&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE s.product_cd = t.product_cd&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND s.cust_id = c.cust_id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND s.sales_dept = d.dept_no&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND c.cust_grade between &#039;10&#039; and &#039;15&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND d.location = &#039;SEOUL&#039;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND p.product_name IN (&#039;PA001&#039;,&#039;DR210&#039;)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; GROUP BY d.dept_name, c.cust_city, p.product_name;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_STAR_TRANSFORMATION&lt;/span&gt; ; 스타변형 조인을 하지 않도록 유도&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;FACT&lt;/span&gt; ; 스타 변형 조인에서 팩트 테이블을 지정하기 위하 사용&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_FACT&lt;/span&gt; ; 지정한 테이블을 팩트 테이블로 인정하지 말아 달라고 요구&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;UNNEST&lt;/span&gt; ; 서브 쿼리와 메인쿼리를 합쳐 조인 형태로 변형하도록 하는 실행계획을 생성하도록 유도하는 힌트&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ UNNEST (@qb) */ ..&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM emp e&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE e.deptno IN (SELECT /*+ QB_NAME(qb) */ d.dept no&nbsp;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;FROM dept d&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE d.oc=&#039;DALLAS&#039;);&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_UNNEST &lt;/span&gt;; UNNESTING 을 하지 않도록 유도&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;h3&gt;3.3.8. 기타 힌트&lt;/h3&gt;&lt;p&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;APPEND &lt;/span&gt;; INSERT문에서 사용, SGA를 거치지 않고 &#039;DIRECT-PATH&#039;방식으로 직접 저장공간으로 입력 (최고 수위점 다음위치에 저장)&lt;br  /&gt;ex) INSERT /*+ APPEND */ INTO TAB2&lt;br  /&gt;&nbsp;&nbsp;&nbsp; SELECT *&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM TAB1&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE COL1 &gt;= &#039;20050101&#039; ;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NOAPPEN&lt;/span&gt;D ; INSERT시 &#039;CONVENTIONAL-PATH&#039;방식으로 수행 (직렬모드)&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;CACHE &lt;/span&gt;; FULL 스캔 방식으로 읽혀진 블록을 LRU 리스트의 최근 사용위치에 머물도록 하여 계속 메모리에 머물수 있도록 처리&lt;br  /&gt;ex) SELECT /*+ FULL (t) CACHE(t) */ last name&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM tech_spec t;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NOCACHE&lt;/span&gt; ; FULL 스캔방식으로 읽혀진 블록을 LRU 리스틔 끝에 위치하도록 유도(메모리에서우선제거), 옵티마이져가 블록을 관리하는 일반적방법&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ FULL(m) NOCACHE (m) */ member_name&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM members m;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;CARDINALITY&lt;/span&gt; ; 옵티마이져에게 해당쿼리나 일부구성에 대한 카디널리티 에상값을 제시하여 실행계획수립에 참조토록 함 &lt;br  /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 테이블을 지정하지 않으면 전체 쿼리를 수행한 결과로 얻어진 총건수로 간주&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ CARDINALITY ( s 9999 ) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sale s, prod p&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE s.sale_date &gt;= &#039;20050901&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND p.prod_id LIKE &#039;ABEC%&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;CURSOR_SHARING_EXACT&lt;/span&gt; ; CURSOR_SHARING 초기화 파라메터가 &#039;EXACT&#039; 일경우와 동일한 결과 , 리터럴 값을 바인드 변수로 변경하지 않음&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ CURSOR_SHARING_EXACT */ *&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM EMP&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE ENAME = &#039;SCOTT&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;DRIVING_SITE&lt;/span&gt; ; 원격 테이블과 조인을 수행할 사이트를 지정하여 분산 쿼리를 최적화 하는데 적용&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ DRIVING_SITE(b) */&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM cust a, order@ord_svr b&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE a.join_date &gt;=&#039;20050101&#039;&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND b.order_date &gt;= TO_CHAR(SYSDATE-7,&#039;YYYYMMDD&#039;);&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;DYNAMIC_SAMPLING&lt;/span&gt; ; 통계정보를 가지고 있지 않거나 ,에러등의 문제로 사용할수 없게되거나, 너무 오래되어 신뢰할수 없을 때 적용&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 통계정보가 있는 하나의 테이블에 사용할경우 무시됨&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ DYNAMIC_SAMPLING(e 1) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM EMP&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE ENAME = &#039;SCOTT&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;PUSH_PRED&lt;/span&gt; ; 뷰나 인라인뷰의 외부에 있는 조인 조건을 뷰 쿼리 내로 삽입하는 힌트&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NO_MERGE(v) PUSH_PRED(v) */ ...&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM member m,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; ( SELECT carrier_name, carrier_duration&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; FROM member_carrier&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; WHERE carrier_type IN (&#039;1&#039;,&#039;2&#039;,&#039;4&#039;) ) v&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE m.member_id = v.member_id(+)&lt;br  /&gt;&nbsp;&nbsp;&nbsp; AND&nbsp;&nbsp;&nbsp; m.member_type = &#039;1001&#039;;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;NO_PUSH_PRED&lt;/span&gt; ; 뷰나 인라인 뷰의 외부에 있는 조인 조건을 뷰쿼리 내료 삽입하지 않도록 하는 힌트&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ NO_MERGE(v) NO_PUSH_PRED(v) */ *&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM employees e,&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; (SELECT manager_id&nbsp;&nbsp; &nbsp;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; FROM employees) v&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE e.manager_id = v.manager_id(+)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND e.employee_id = 100;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;PUSH_SUBQ&lt;/span&gt; ; 머지 되지않는 서브 쿼리를 최대한 먼저 수행할 수 있도록 실행계획을 수립하기를 요구 &lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ PUSH_SUBQ(@qb) */ ..&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM sales&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE item = :b1&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND saltype IN (SELECT /*+ QB_NAME(qb) */ code_id&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; FROM code_table&nbsp;&nbsp; &nbsp;&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; WHERE code_type=&#039;SALTYPE&#039;)&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; AND saldate between :b2 and :b3;&lt;br  /&gt;&lt;br  /&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;QB_NAME&lt;/span&gt; ; 쿼리 블록에 이름을 부여하여 외부의 다른 힌트에서 참조할수 있도록 함&lt;br  /&gt;&lt;br  /&gt;ex) SELECT /*+ UNNEST (@qb) */&lt;br  /&gt;&nbsp;&nbsp;&nbsp; FROM emp e&lt;br  /&gt;&nbsp;&nbsp;&nbsp; WHERE e.deptno IN (SELECT /*+ QB_NAME(qb) */ d.deptno&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; FROM dept d&lt;br  /&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; WHERE d.loc = &#039;DALLAS&#039;);&lt;br  /&gt;&lt;br  /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;REWRITE_ON_ERROR&lt;/span&gt; ; 적합한 M-VIEW가 존재하지 않아 쿼리 재생성을 할수 없을 경우 &lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORA-30393 에러를 유발하여 쿼리 수행을 중단&lt;br  /&gt;
&lt;br  /&gt;
&lt;br  /&gt;&lt;br  /&gt;&lt;/p&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;blockquote class=&quot;q2&quot;&gt;&lt;p&gt;역시 옵티마이져에 대한 전체 적인 지식이 받힘이 안되면 사용하는것도 이해하는것도 힘들거 같습니다.&lt;/p&gt;&lt;p&gt;또 실제로 적용해보고 사용해보고 각 건의 경험이 꽤 중요할꺼같습니다.&lt;br  /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Tue, 18 Aug 2009 00:50:36 +0900</pubDate>
									<slash:comments>1</slash:comments>
					</item>
				<item>
			<title><![CDATA[4.1. 인덱스 선정기준(4.1.1.-4.1.5.)]]></title>
			<dc:creator><![CDATA[balto]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=402</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=402</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=402#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p&gt;(편집이 잘 안될 수도 있어 파일 첨부했습니다.) &lt;/p&gt;
&lt;p&gt;&nbsp;
&lt;a name=&quot;[문서의 처음]&quot;&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4장 인덱스 수립전략&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;(무엇을 배우는가?)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 최소의 인덱스로 최대의 액세스 형태를 만족시켜야 한다. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 구성을 위한 종합적인 전략을 수립하는 절차를 설명한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4.1. 인덱스의 선정 기준&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4.1.1. 테이블 형태별 적용기준&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;가) 적은 데이터를 가진 소형 테이블&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 적은 데이터란 DB_FILE_MULTIBLOCK_READ_COUNT 값 보다 크기가 작은 블럭을 가진 테이블이라 가정하자.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 유무가 성능에 영향을 미치지 않으므로 인덱스를 안 만들 수도 있다&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;(인덱스를 생성하는 것이 나쁘다는 애기는 아니다.)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 기본키에는 인덱스를 생성하는 것을 권장한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 존재 여부는 조인의 실행 계획이나 무결성에 영향을 미친다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 일체형 테이블을 구성하는 것도 좋은 방법이다.(IOT)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 대량의 반복이 발생할 때는 인덱스가 조금이라도 효과가 있을 수 있다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;나) 참조되는 역할을 하는 중대형 테이블&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 고객테이블 같이 참조 위주 테이블, 데이터는 많고 액세스 조건이 일정하며, 랜덤액세스되며 데이터증감이 적다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 좁은 범위만 필요하거나 조인때 내측루프에 기본키에 의해 연결&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스를 많이 만들어 두는 것이 효과적이며, PCTFREE를 0으로 만들어도 좋음.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 간혹 인덱스 재생성하면 된다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;다) 업무의 구체적인 행위를 관리하는 중대형 테이블&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 매출정보테이블 같이 액세스 조건이 다양하고, 데이터가 꾸준히 증가한다. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- B-tree 인덱스가 유리하고 결합인덱스가 많이 사용되며 결합인덱스 컬럼 구성에 따라 영향을 받는다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 전략 수립에 신중해야 한다. 액세스 유형을 잘 수집하고 인덱스 조합을 잘 찾는다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 추가시 데이터 증감에 따른 속도 저하도 가능하므로 주의한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 비트맵인덱스를 고려해볼 수도 있다.(배치처리로 다량의 데이터가 추가되고, 다양한 액세스가 발생한다면) ?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;라) 저장용 대형 테이블&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 로그기록처럼 대량의 테이블에 지속적으로 데이터가 입력된다. 저장이 목적이며 액세스 형태가 다양하지 않다. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 삭제나 갱신이 거의 없기 때문에 PCTFREE를 0으로 둘 수 있다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- PRIMARY KEY를 두지 않을 수 있으며 필요시 UNIQUE INDEX를 생성해 준다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 파티션을 고려할 수 있다.(오래된 데이터는 참조 가능성이 줄어듦으로 최근의 파티션에 많은 인덱스를 생성하고 그렇지 않은 경우는 최소한의 인덱스를 생성한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 특정파티션에 인덱스를 만들기 위해 USQBLE/UNUSABLE 기능을 사용한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;(UNUSABLE 파티션에 질의를 하면 오류이므로 FROM 절에 특정 파티션을 지정한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4.1.2. 분포도와 손익분기점&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스가 처리범위를 줄이는데 얼마나 효율적인가(충실한가는) 분포도와 관련있다. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 보통은 컬럼의 분포도가 10-15%를 넘지 않아야 효과가 있다(왜?) &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;(넘으면 전체 테이블 스캔이 더 유리하다)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;비교 : 전체테이블 100 블록 vs 인덱스 1블록 + 0.1 * ...&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 각 컬럼의 분포도는 높아도 결합인덱스의 분포도는 낮아진다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 클러스터링을 할 경우 클러스터링 팩터의 향상은 인덱스 액세스 비용을 낮춘다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 손익분기점을 넘는 경우라도 부분범위를 액세스할 경우 손익이 생긴다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;(예, 30% 손익분기점이라도 1/100만 액세스했을 경우 이익이다)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;.1.3. 인덱스머지와 결합인덱스 비교&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 검색조건이 한개의 테이블에 2개 속성인 경우 비교&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;(인덱스머지)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스머지는 INDEX1과 INDEX2에서 검색하여 인덱스에 저장된 ROWID를 비교하여 검색(&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;테이블 액세스하기 전에 ROWID를 모두 알아낸다&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;) &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 그러나, 두 인덱스가 비슷한 분포도를 가질때 유리, 많이 차이나면 적은쪽 인덱스만 이용하여 테이블을 직접액세스하는 것이 유리(한쪽이 = 조건이 아닐 경우)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;x1 + x2 + selected blocks(c1,c2) &gt; x1 + selected blocks(c1)&nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;예를들면 : 1 + 3 + 1 &gt; 1 + 2 (?)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;(결합인덱스)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 결합인덱스로부터 ROWID를 모두 찾아낸다)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4.1.4 결합인덱스의 특징&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 결합인덱스의 단점&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;컬럼 중 일부만 조건을 받거나 = 아닌 연산자가 많을 경우&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;가) 분포도와 결합순서의 상관관계&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 인덱스 결합시 분포도가 좋은 컬럼이 앞에 있는 것이 좋은가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;=로 비교되면 순서는 별 영향이 없다. B-tree 검색시 영향을 받지 않는다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;나) = 이 결합순서에 미치는 영향&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 첫번째 조건이 = 이면 첫번째 조건을 만족하는 것들 중 두번째 조건의 범위를 액세스 한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 첫번째 컬럼이 = 이 아닌 범위 조건이 오면 첫번째 조건의 범위를 모두 검색하여 두번째 조건을 만족하는 것을 찾는다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 결론적으로 결합인덱스에서는 = 조건인 컬럼이 먼저 있어야하므로 분포도 보다 컬럼의 순서가 중요하다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;다) IN 연산자를 이용한 징검다리 조건&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 속성1이 = 검색이 주이고 속성2가 =이 아닌 경우가 많다면 (속성2, 속성1) 결합인덱스를 생성한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 그러나 가끔씩 속성1이 LIKE나 BETWEEN을 사용하고 속성2가 =을 사용한다면 결합인덱스 (속성2, 속성1)을 또 만든다.(?)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 결합인덱스에서 IN과 BETWEEN 연산자 차이 -&gt; 결합인덱스에서 필요한 부분만 검색&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 결합인덱스에서 IN 연산자의 징검다리 효과(그림 1-4-5)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;WHERE col2 IN (111,112) AND col1 =&#039;A&#039; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; WHERE (col2=111 AND col1=&#039;A&#039;) OR (col2=112 AND col1=&#039;A&#039;)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;라) 처리범위에 직접적인 영향을 주지 못하는 컬럼의 추가 기준&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- = 비교가 아니지만 결합인덱스에 포함을 시킬지 여부&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- = 비교가 아니어도 결합인덱스에 있으면 인덱스에서 검색을 시도하므로 ROWID를 직접 찾을 수 있다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- SELECT 리스트에만 사용되는 컬럼도 경우에 따라서는 필요하다 - 인덱스조인을 유도(?)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;4.1.5. 결합인덱스의 컬럼 순서 결정 기준&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 결합인덱스 컬럼 순서 결정 우선순위&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1단계 : 항상 사용하는가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2단계 : 항상 = 로 사용하는가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3단계 : 어느 것이 더 좋은 분포도를 갖는가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4단계 : 자주 정렬되는 순서는 무엇인가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5단계 : 부가적으로 추가시킬 컬럼은 어떤 것으로 할 것인가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;- 예) 다음 예에서 1개의 인덱스를 생성한다면?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;① c1(=), c2(between), c3(=)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;② c2(=), c3(between), c4(&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;③ c1(=), c2(=), c3(like)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;④ c1(=), c2(=), c4(&gt;)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1단계 : 항상 사용하는가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; c2(4번), c1(3번), c3(2번), c4(2번) &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c2가 가정 먼저.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;그렇지만 c2이 카디널리티가 높지 않아 인덱스스킵스캔으로한다면 ②번은 c1(=)이 있다고 본다. 정답은 c1이 가장 먼저.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;아니면 ② 번을 따로 만족하는 인덱스를 만든다면 c1=c2=3번이 된다. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2단계 : 항상 = 로 사용하는가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; c1=c2=3회라고 가정하면 c1은 항상 =를 사용하므로 정답은 c1+c2&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3단계 : 어느 것이 더 좋은 분포도를 갖는가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; ①번의 c2를 BETWEEN을 IN으로 바꾸면 = 처리가 가능하므로 c1+c2, c2+c1 2개의 정답이고, c1과 c2 중 분포도가 좋은 것을 앞으로한다.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;주의 : 액세스 형태가 바뀌면 인덱스도 바뀌어야하므로 액세스형태를 예측하여 바꾼다. 예를 들면 =가 아닌 다른 연산자 사용 가능성을 검토한다. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4단계 : 자주 정렬되는 순서는 무엇인가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 정렬이 필요한 속성을 감안한다. 정렬이 필요한 속성을 인덱스로 했을 경우 부분범위처리에도 유리하다.&nbsp; &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5단계 : 부가적으로 추가시킬 컬럼은 어떤 것으로 할 것인가?&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; c3과 c4는 체크기능을 담당한다. c3가 앞에오면 유리한 경우는 ①③번, c4가 앞에오면 유리한 경우는 ④번, 같은 경우는 ②번 경우이므로 c1+c2+c3+c4로 생성.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;span style=&quot;font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;&lt;font size=&quot;2&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;만약 ④가 빈번하게 사용된다면 c1+c2+c4로 생성.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;바탕&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font-family: &quot;굴림&quot;; text-align: justify;&quot;&gt;
&lt;br  /&gt;
&lt;/p&gt;&lt;br  /&gt;&lt;/div&gt;]]></description>
						<pubDate>Mon, 17 Aug 2009 10:35:23 +0900</pubDate>
									<slash:comments>3</slash:comments>
					</item>
				<item>
			<title><![CDATA[3.2.2. 데이터 연결을 위한 실행 계획]]></title>
			<dc:creator><![CDATA[balto]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=68</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=68</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=68#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;* 한글문서를 복사하다보니 편집대로 복사가 안되었습니다. &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp;&nbsp; (첨부파일에 한글 문서 첨부하였습니다. WIKI 쪽에 붙일떄는 제대로 옮기죠)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp;&nbsp; &lt;a href=&quot;./?module=file&amp;act=procFileDownload&amp;file_srl=379&amp;sid=1c0f402be6d8e82a7aae69578f715028&quot;&gt;3-2-2-데이터연결을위한실행계획-4.hwp&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;&lt;/span&gt;&nbsp;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2. 데이터 연결을 위한 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;* 주요 내용은 조인, 서브쿼리 등 여러 개의 테이블이 연결될 때 실행계획에 대한 설명&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp; (일반 조인연산) Nested Loop Join, Sort Merge Join, Hash Join&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp; (특별 조인연산) Semi Join, Cartesian Join, Outer Join, Index Join&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;* 조인을 위한 힌트절&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&nbsp;&nbsp; 조인 알고리즘힌트문&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&nbsp; &nbsp;Nested LoopUSE_NL(table1, table2)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&nbsp; Sort MergeUSE_MERGE(table1, table2)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&nbsp; Hash JoinUSE_HASH(table1, table2)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&nbsp;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.1. Nested Loop Join (내포 조인, 중첩루프 조인)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 기본적인 조인 형태이다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 프로그램 구조&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&nbsp; NestedLoops&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&nbsp;&nbsp;&nbsp; { (outer loop) - 선행테이블(Driving Table)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (inner loop) - 후행테이블(Driven Table)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (process join)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp; }&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 분석&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&nbsp; SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;&nbsp;&nbsp;&nbsp; NESTED LOOPS&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (CLUSTER) OF table1 (outer loop)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF table1index.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS (BY ROWID) OF table2(inner loop)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INDEX (RANGE SCAN) OF table2index&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Advanced Nested Loop Join &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;1:M 테이블의 M쪽 테이블의 ROWID를 찾아 테이블을 한 번에 접근하는 방법.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF table1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;NESTED LOOPS&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF table2(outer loop)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;INDEX (RANGE SCAN) OF table2index(NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF table1(inner loop)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot; style=&quot;TEXT-ALIGN: left&quot;&gt;INDEX (RANGE SCAN) OF table1index(NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.2. Sort Merge Join(정렬병합조인)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Nested Loop 조인에서 적절한 인덱스가 존재하지 않아서 조인의 대상 범위가 넓을 때는 랜덤 액세스로 인해 비효율적인 점을 개선하기 위한 방법이다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 두 집합을 스캔하여 정렬한 후 머지한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 대용량을 처리해야하는 경우는 정렬의 부담이 크기 때문에 이 방법보다는 해시조인 방법을 사용한다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인 연결고리 연산자가 ‘=’이 아닌 경우(LIKE, BETWEEN, 부등호)일 경우 Nested Loop 조인 보다 유리하며 해시조인은 이 경우 사용할 수 없다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 정렬된 집합이 준비되어있거나 인덱스를 이용하여 정렬이 가능할 때 유리하다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Sort Merge 조인의 실행계획 예(한쪽을 인덱스 정렬)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;MERGE JOIN&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;SORT(JOIN)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY ROWID) OF table1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF table1index&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;SORT(JOIN)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULL) OF table2&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Sort Merge 조인의 실행계획 예(한쪽을 정렬된 인덱스 사용) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;MERGE JOIN&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY ROWID) OF table1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF table1index&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;SORT(JOIN)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULEE) OF table2index&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.3. Hash Join(해시 조인)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 해싱함수를 이용한 조인, 동등조인(=)일 경우만 사용 가능&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Hash Join의 실행계획 예(인덱스 처리된 스캔과 전체테이블 스캔) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF table1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF table1index&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULEE) OF table2&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Hash Join의 실행계획 예(인라인뷰와 전체테이블을 해시조인한 후 다른 테이블 해시조인) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN(outer)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(GROUP BY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF BPM01T_index(NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(FULEE) OF BPM50T&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF BPM38T_index(NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.4. Semi Join(세미 조인)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인의 정의에서 자연조인에서 한쪽 릴레이션의 속성은 제거되고 다른 한쪽의 속성만 나타나는 조인연산으로 주로 서브질의에 의한 조인을 말한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 세미조인의 관계대수 정의 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;R(X), S(Y)의 조인 애트리뷰트를 Z=X∩Y라 하면, &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt&quot;&gt;R?S= R?&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt; VERTICAL-ALIGN: sub&quot;&gt;N&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt&quot;&gt;(∏&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt; VERTICAL-ALIGN: sub&quot;&gt;X∩Y&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt&quot;&gt;(S) = ∏&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt; VERTICAL-ALIGN: sub&quot;&gt;X&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 11pt&quot;&gt;(R?S)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 1:M의 조인에서 서브질의의 결과가 1인 경우 예 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL 문)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT EMP_ID, EMP_NM, AMT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM BPM01T&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE ORG_CD=:org_cd&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;AND PAY_CD IN ( SELECT PAY_CD FROM BPM40T WHERE ...) (실행계획)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;NESTED LOOPS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(unique)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY ROWID) OF BMP40T&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF ..&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS(BY ROWID) OF BPM01T.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF ..&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.5 Cartesian Join(카티젼조인)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인되는 2 테이블간에 공통 속성이 없어서 조인연산이 카티젼곱으로 계산되는 경우이다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- (실행계획의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;MERGE JOIN(&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;CARTESIAN&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(GROUP BY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF table1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(JOIN)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF tableindex (UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 카티젼 조인이 나타나는 경우 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 2개의 테이블을 합하기 위하여 고의적으로 카티젼조인을 할 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 스타조인을 하기 위하여 디멘전 테이블을 조인하는 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(3) 3개 이상 테이블 조인시 조인 순서 잘못으로 나타난다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.6. Outer Join(아우터 조인)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 아우터조인은 조인에 참여하지 못하는 테이블도 결과에 포함시킬 경우 사용하는 조인이다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;[1] Nested Loop 아우터조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 아우터 조인의 아우터루프가 결정되기 때문에 조인시 신중해야 한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 힌트는 USE_NL(table1, table2)와 동일하지만 실행계획에는 NESTED LOOPS(OUTER)로 나타난다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;[2] Hash 아우터조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Nested Loop 조인으로는 용량이 많아 부담되는 경우 사용한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 내측 조인 집합이 해시테이블로 생성되어 연결된다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- (실행계획 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH(GROUP BY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN(OUTER)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF table1 (outer table)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX(RANGE SCAN) OF tableindex (inner table)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인뷰와 조인인라인뷰와 아우터조인 수행 - 뷰의 병합이나 조건절 진입이 허용되지 않고 뷰의 전체 집합이 독립적으로 수행된 결과와 아우터조인을 수행한다(실행 예 참조) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;[3] SORT Merge 아우터조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- Nested Loop 조인으로 문제가 있을 때 사용&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;[4] 전체 아우터조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 양쪽 데이블 모두에 아우터 조인을 실행할 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획의 예&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;UNION-ALL&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN(OUTER)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF emp&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF employee&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;HASH JOIN(ANTI)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF employee&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF emp&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;(주의)&lt;/span&gt; : (+) 연산자를 사용하여 아우터조인시 주의할 점 - 내측테이블에 조건을 기술할 경우(p230 참조)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.2.7 인덱스조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 인덱스간의 해시조인을 통하여 액세스하는 방법이다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3. 연산 방식에 따른 해시조인&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3.1. IN-List 탐침 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- IN 사용예(WHERE 조건)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT order_id, order_type, order_amount&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM orders&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE order_type IN (1,2,3)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- IN 실행계획 예 - IN 조건에 있는 비교만큼 반복한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INLIST ITERATOR&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;table&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;tableindex&lt;/span&gt; (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- IN을 사용해도 비교값이 하나인 경우 ITERATOR가 안나타난다(그런경우가 있을까요?)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 조인에서 나타나는 INLIST 실행계획 - table2의 속성에 IN 조건이 있을 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;NESTED LOOPS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF table1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF tabelindex (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;INLIST ITERATOR&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF table2&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF table2index (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3.2. Concatenation(연쇄) 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- OR 조건으로 연결된 경우(WHERE 조건)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예(1개의 테이블에 OR 조건이 있을 경우)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;CONCATENATION&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;table1&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF table1index1 (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;table1&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF table1index2 (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예(조인의 연결고리에 OR 조건이 있을 경우)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT o.header_id, i.line_id, i.revenue_amount&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM order_item i, orders o&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE i.item_group = :b1 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;AND (o.s_order_id=i.order_id OR o.m_order_id=i.order_id)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예 1 : USE_CONCAT 힌트를 사용한 경우)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;CONCATENATION&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;NESTED LOOPS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;order_item&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_item_index (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (UNIQUE SCAN) OF order_index (UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;NESTED LOOPS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;order_item&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_item_index (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (UNIQUE SCAN) OF order_index (UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예 2 : NO_EXPAND 힌트를 사용한 경우)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;HASH JOIN&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;order_item&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_item_index (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- OR 조건이 사용될 경우 CONCAT 실행계획이 불리한 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) 조인의 연결고리가 OR 조건이고 조인의 상대방이 넓은 처리범위를 가질 때&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) 동일조건의 OR 조건 : IN-List 탐침이 더 유리&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(3) 처리범위를 줄일 수 있는 다른 액세스 경로가 있을 때&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(4) OR 조건들 중 너무 많은 처리범위를 가진 것들이 존재할 때&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3.3. Remote(원격) 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 분산되어 있는 테이블을 액세스 할 때 실행계획&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예(원격 테이블 접근)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT c.customer_name, count(*)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM customers c, orders@crm_db o&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE c.cust_id=o.cust_id AND o.order_number=:b1&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;GROUP BYc.customer_name;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예 : REMOTE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(GROUP BY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;NESTED LOOPS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;REMOTE&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;customers&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF customer_index (UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 원격테이블 액세스에서 문제는 원격테이블을 랜덤액세스하거나 원격테이블이 조인의 내측에 있어서 액세스를 빈번히 해야하는 경우이다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3.4. Sort Operation(정렬처리) 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 정렬작업의 종류&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(UNIQUE), SORT(AGGREGATE), SORT(GROUP BY), SORT(JOIN), SORT(ORDER BY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(1) SORT UNIQUE&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- SELECT 문에서 DISTINCT를 사용했을 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- subqyery에서 IN 다음에 사용되는 부속질의 결과&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(2) SORT AGGREGATE&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- GROUP BY 문을 사용하지 않은 상태에서 SUM, COUNT, MIN, MAX, SUM을 사용했을 때&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실제 SORT를 하지는 않고 결과 값을 구한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(3) SORT(GROUP BY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- GROUP BY 계산을 위하여 정렬을 수행한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 데이터 용량이 많을 경우 HASH(GROUP BY)를 사용한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 인덱스가 키값으로 정렬되어있는 경우 정렬이 필요없으므로 SORT(GROUP BY NOSORT)로 나타난다. &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3.5. Set Operation(집합처리) 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;(1) 합집합(UNION 연산자)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- UNION과 UNION ALL (UNION은 최소공배수 집합을 구한다) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예 1(OR를 사용할 경우 비효율적인 사례)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT order_id, order_date, status&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM orders o&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE order_date &gt; :b1 OR &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;order_id IN (SELECT order_id FROM order_item &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE item_group=&#039;A&#039;); &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예 : full table 스캔이 일어난다)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FILTER&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (FULL) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;order_item&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_item_index (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 1을 UNION 연산자를 사용하여 개선한 경우&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT order_id, order_date, status&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM orders &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE order_date &gt; :b1 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;UNION&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT order_id, order_date, status&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM orders &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE order_id IN &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SELECT order_id FROM order_item WHERE item_group=&#039;A&#039;); &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예 2 : UNION-ALL 사용)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;UNION-ALL&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_index &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;NESTED LOOPS&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;order_item&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_item_index (NON-UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (UNIQUE SCAN) OF order_pk_index (UNIQUE)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;(2) 교집합(INTERSECTION 연산자)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 2집합을 정렬하여 머지한다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT resist_noFROM employees &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE dept_no=:b1 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;INTERSECT&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT social_noFROM billboard &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE cre_date=:b2 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;INTERSECTION&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;UNIQUE&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;employees&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF employee_index(NON-UNIQUE) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;UNIQUE&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;billboard&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF billboard_index(NON-UNIQUE) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;(3) 차집합(MINUS 연산자)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT resist_noFROM employees &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE dept_no=:b1 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;MINUS&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT social_noFROM billboard &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE cre_date=:b2 &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;MINUS&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;UNIQUE&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;employees&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF employee_index(NON-UNIQUE) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;UNIQUE&lt;/span&gt;)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;billboard&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF billboard_index(NON-UNIQUE) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;3.2.3.6. COUNT(STOP) 실행계획&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- ROWNUM을 사용했을 때 나타난다.(2부의 부분처리 내용 참조)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- ROWNUM은 SQL 문을 수행한 결과에 사용되는 가상의 일련번호이다.&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- (*) 가상컬럼 : SYSDATE, USER, ROWID, LEVEL(connect by 사용시)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예 1: ROWNUM을 이용한 결과 튜플 수 20개로 제한&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT *&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM orders &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE order_date=:b1 AND acc_deptno=:b2 AND ROWNUM &lt;=20; &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT STATEMENT&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;COUNT(STOPKEY)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;orders&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF order_index(NON-UNIQUE) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예 2: ROWNUM을 이용한 결과 튜플 수 1개로 제한&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT /*+ index-desc(s, subject_prgs_pk) */ subject_seq&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM subject_prgs s &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE subject_id=:b1 AND subject_id &lt;= :b2 AND ROWNUM=1;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;COUNT(STOPKEY)&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN DESCENDING) OF subject_prgs_pk(UNIQUE) &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;- 실행계획 예 3: 복잡한 ROWNUM 예 /*?*/는 SQL문의 해당되는 처리 위치&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(SQL문의 예)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SELECT MIN(DECODE(ROWNUM,1,rnum2)), plan_time&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM (SELECT rnum * - 1 rnum2, MIN(plan_time) plan_time&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM (SELECT ROWNUM rnum1, plan_time/*1*/&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;FROM subjects&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE role_cd=&#039;1007&#039; &lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;GROUP BY plan_time, ROWNUM&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;GROUP BY rnum * -1)/*2*/&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;WHERE ROWNUM &lt;= 10;/*3*/&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;(실행계획)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;COUNT(STOPKEY)&lt;/span&gt;/*3*/&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(GROUP BY STOPKEY)&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;VIEW&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;SORT(GROUP BY)/*2*/&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;COUNT/*1*/&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;TABLE ACCESS (BY INDEX ROWID) OF &lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: bold&quot;&gt;subjects&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;바탕글&quot;&gt;INDEX (RANGE SCAN) OF subject_index(NON-UNIQUE)&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Thu, 06 Aug 2009 12:43:37 +0900</pubDate>
									<slash:comments>2</slash:comments>
					</item>
				<item>
			<title><![CDATA[3.2. 실행계획의 유형 (1/3) - 3.2.1. 스캔의 기본유형]]></title>
			<dc:creator><![CDATA[휘휘]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=66</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=66</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=66#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;blockquote class=&quot;q1&quot;&gt;
&lt;blockquote class=&quot;q2&quot;&gt;
&lt;p&gt;이번장은 이론적인 내용보다는 옵티마이져의 세부 형태에대한 소개라&lt;br  /&gt;한번씩 책을 정독하시고 실습을 병행해보는게 좋을꺼같습니다. ^^&lt;br  /&gt;지겨운 내용..&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br  /&gt;3.2. 실행 계획의 유형&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;실행계획은 크게 나누어 네가지로 구분&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;스캔을 위한 실행계획&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;데이터 연결을 위한 실행계획&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;각종 연산을 위한 실행계획&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;기타 특수한 목적을 처리하는 실행계획&lt;/div&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;h3&gt;3.2.1. 스캔(Scan) 의 기본유형&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;스캔의 기본유형&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;전체 테이블 스캔(Full Table Scans)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;로우실별자 스캔(Rowid Scans)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;인덱스 스캔(Index Scans)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;클러스터 액세스(Cluster Access)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;해쉬 액세스(Hash Access)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;표본 테이블 스캔 (Sample Table Scans)&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;h3&gt;3.2.1.1. 전체테이블 스캔&lt;/h3&gt;
&lt;p&gt;&lt;br  /&gt;&lt;strong&gt;&lt;u&gt;High Water Mark(최고 수위선)&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;사용된 저장공간의 총합계나 데이터를 넣기 위해 포맷된 영역을 표시하는 것&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;전체 테이블 스캔은 다중 블록 단위(한번의 I/O)로 메모리에 옮겨진후 순차적으로 읽힘&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;DB_FILE_MULTIBLOCK_READ_COUNT ; 한번에 액세스하는 블록의 양을 정의&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q1&quot;&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;EX)&lt;br  /&gt;&lt;/em&gt;&lt;/strong&gt;소형은 인덱스를 경유하더라도 인덱스를 통한 랜덤 엑세스한 자료가 대부분 비슷한 블록이기 때문에&lt;/p&gt;
&lt;p&gt;&nbsp;FULL스캔이 유리할수도있음&lt;/p&gt;
&lt;p&gt;&lt;br  /&gt;대형은 이미 액세스한 블록을 공유할 확률이 낮아지므로 랜덤에 대한 부하가 증가 , &lt;/p&gt;
&lt;p&gt;DISK의 ACCESS ARM의 이동이 많아질수 있음&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;전체 테이블 스캔을 선택하게 되는 경우&lt;/strong&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;u&gt;적용가능 인덱스의 부재&lt;/u&gt;: 인덱스가 없을경우, 결합인덱스의 선두 컬럼이 존재 하지 않을때, 인덱스가 가공될경우&lt;br  /&gt;(경우에 따라 인덱스 스킵 스캔이 적용되면 인덱스 사용이 가능)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;u&gt;넓은 범위의 데이터 액세스&lt;/u&gt;: 인덱스 사용시의 비용이 클 경우&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;u&gt;소량의 테이블 액세스&lt;/u&gt;: 최고수위내의 블록이 db_file_multiblock_read_count 내에 있을 경우&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;u&gt;병렬처리 액세스&lt;/u&gt;: 병릴처리는 전체테이블 스캔이 더욱효과적&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;u&gt;&#039;Full&#039;힌트를 적용&lt;/u&gt;: &#039;full(table_alias)&#039; 힌트 사용&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote class=&quot;q2&quot;&gt;
&lt;p&gt;실행계획상 oracle 9i 이전에는 해당단계에서 액세스한 로우수가 표기 됬지만 그이후부터는 최종결과만 표기&lt;br  /&gt;trace 관련 참고&lt;br  /&gt;&lt;a href=&quot;http://develop.sunshiny.co.kr/130?category=10&quot;&gt;http://develop.sunshiny.co.kr/130?category=10&lt;/a&gt;&lt;br  /&gt;&lt;a href=&quot;http://blog.naver.com/themisoo/110004154686&quot;&gt;http://blog.naver.com/themisoo/110004154686&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;br  /&gt;3.2.1.2. Rowid 스캔&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;Rowid 스캔은 인덱스를 경유하여 테이블을 액세스하는 과정에서 발생&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;h3&gt;3.2.1.3. 인덱스 스캔&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;분류&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote class=&quot;q1&quot;&gt;
&lt;p&gt;인덱스 유일 스캔 (Index Unique Scan)&lt;br  /&gt;인덱스 범위 스캔 (Index Range Scan)&lt;br  /&gt;인덱스 역순 범위 스캔(Index Range Scans Descending)&lt;br  /&gt;인덱스 스킵 스캔(Index Skip Scan)&lt;br  /&gt;인덱스 전체 스캔 (Full Scan)&lt;br  /&gt;인덱스 고속 전체 스캔(Fast Full Index Scan)&lt;br  /&gt;인덱스 조인(index Join)&lt;br  /&gt;비트맵 인덱스 (Bitmap Index)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;가) 인덱스 유일 스캔(Index Unique Scan)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&nbsp;인덱스가 기본키나 유일 인덱스(Unique Index)로 생성되어야 함 (조건절에서 = 비교)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Index(table_alias index_name) hint 를적용하면 사용&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;나)인덱스 범위 스캔 (Index Range Scan)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;브랜치 블록을 경유하여 시작 리프 블록을 찾은후 계속해서 연결된 리프 블록을 스캔하다가 종료점에서 멈춤&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;= , &lt; , &lt;=, &gt;, &gt;=, BETWEEN, LIKE (%가 선두일경우 불가능)&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다) 인덱스 역순 범위 스캔(Index Range Scan Descending)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;역순으로 데이터를 액세스 (최대값으로 시작하여 최소값이 될때까지 수행)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;가장최근의 자료를 먼저검색하는 등의 경우&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Orderby .. Desc를 할대 옵티마이저의 판단에 따르거나 &#039;Index_desc (table_alias index_name)&#039; 힌트 사용&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;라) 인덱스 스킵 스캔 (Index Skip Scan)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;인덱스의 선행컬럼이 사용되지않아도 후행인덱스를 사용하여 스캔&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;결합인덱스일때 상위에 카디널리티가 낮은 컬럼들이 위치할 경우 상위 값들로 브랜치 블록이 구성될수 있음&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote class=&quot;q1&quot;&gt;
&lt;p&gt;&lt;br  /&gt;ex) col1,col2,col3 ||로 연결하여 col4 인덱스를 만들경우&lt;/p&gt;
&lt;p&gt;&nbsp;col1,col2가 낮은 카디널리티를 가지고&lt;/p&gt;
&lt;p&gt;&nbsp;col3이 높다면 브랜치 블록은 col1,과 col2가 차지&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q2&quot;&gt;
&lt;p&gt;&lt;br  /&gt;- sal_typ(매출유형) + item_cd(상품코드) + sal_dt(매출일자)&#039; 로 구성되어있을때 조건으로&lt;/p&gt;
&lt;p&gt;&nbsp;item_cd와 sal_dt만 사용되고 sal_typ가 (D,E,L) 세종류일경우&lt;br  /&gt;조건절에 SAL_TYP IN (&#039;D&#039;,&#039;E&#039;,&#039;L&#039;) 을 추가한것과 동일한 효과를 볼수 있음&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;논리적 서브 인덱스&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;결합인덱스에서 실제 조건절에 사용되지 않은 컬럼을&lt;u&gt; 논리적으로 인덱스를 사용한 형태로 만들어진 &lt;/u&gt;INDEX_SS&#039;, &#039;INDEX_SS_ASC&#039;, &#039;INDEX_SS_DESC&#039; _ 인덱스 스킵스캔사용 흰트 (정상,역순스캔) &lt;u&gt;사용이 필요없을경우 &#039;NO_INDEX_SS&#039;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;마) 인덱스 전체 스캔(INDEX FULL SCAN)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;테이블을 대체&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;쿼리 내에 사용된 어떤 테이블들의 모든 컬럼들이 그 인덱스에 모두 존재하고&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;인덱스 컬럼 중에서 최소한 NOT NULL 인 컬럼이 하나는 존재할때&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;
&lt;p&gt;ex) select count(*) from user_table 수행시 not null인컬럼이 있을경우 그 컬럼의&lt;/p&gt;
&lt;p&gt;&nbsp;인덱스를 전체스캔하여 결과 도출&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;바) 인덱스 고속 전체 스캔 (Index Fast Full Scans)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;쿼리를 위해 사용된 모든 컬럼이 인덱스에 포함되어있을 경우&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;인덱스만 스캔하고 테이블 액세스는 하지 않음&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;table과 같이 I/O에 다중 블록 액세스를 함&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;비트맵 인덱스에서는 적용 불가&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;INDEX_FFS(TABLE_ALIAS INDEX_NAME) 힌트 사용&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;NO_INDEX_FFS( table_alias index_name) 힌트로 해제&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;br  /&gt;3.2.1.4. B-tree 클러스터 액세스 (Cluster access)&lt;/h3&gt;
&lt;p&gt;단일 컬러스터링 : 대량의 범위 처리의 효율화조인의 효율적인 연결: 두개 이상의 테이블을 하나의 클러스터에 저장하는 방법&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q1&quot;&gt;
&lt;p&gt;1:M 관계를 가진 두 테이블을 클러스터링&lt;br  /&gt;1쪽의 테이블을 클러스터 키로 액세스하면 하나의 로우가 나타 나고&lt;br  /&gt;M쪽을 액세스하면 여러개의 로우가 나타남&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;h3&gt;3.2.1.5. 해쉬 클러스터 액세스 (Hash cluster access)&lt;/h3&gt;
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;해쉬 함수를 통하여 데이터를 액세스 &#039;like,&lt;&gt;,&gt;,&gt;=,&lt;,&lt;=&#039;등을 사용했다면 함수에 적용이 불가능&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;= 이나 &#039;between&#039; ,&#039;in&#039;으로 적용가능한 테이블에 적용&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;자주 갱신이 없는 자료&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;로우의 길이의 편차가 심하지 않고 크기에 대한 예측이 가능한 테이블&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;인덱스를 경유 하지 않기 때문에 바로 테이블을 해쉬로 액스스&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q1&quot;&gt;
&lt;p&gt;사용예&lt;br  /&gt;-우편번호 테이블&lt;br  /&gt;-시스템&lt;br  /&gt;-시스템 사용자 정보&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br  /&gt;3.2.1.6. 표본 테이블 액세스 (Sample Table scan)&lt;/h3&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;테이블의 데이터 중에서 사용자가 부여한 비율 만큼의 데이터를 익고 그중에서 조건을 만족하는 로우를 리턴&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;자료 분석등의 작업에서 표본 자료가 필요할 경우 사용&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q6&quot;&gt;
&lt;p&gt;select ....&lt;br  /&gt;from table_name sample { block option} (sample percent)&lt;br  /&gt;where ....&lt;br  /&gt;group by ....&lt;br  /&gt;having ....&lt;br  /&gt;order by ....&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q1&quot;&gt;
&lt;p&gt;sample block (sample percent) : 전체 액세스 대상 블록에서 지정하 비율 만큼 읽은후 조건을 확인&lt;br  /&gt;sample (sample percent) : 모든 블록을 액세스하여 지정한 비율만큼의 로우를 읽음&lt;br  /&gt;sample percent 는 0,100을 제외한 0.000001 에서 99.999999 까지&lt;br  /&gt;CBO에서 지원 &#039; role&#039;힌트를 사용해도 비용기준으로 수행&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;SELECT STATEMENT&lt;br  /&gt;TABLE ACCESS (SAMPLE) OF &#039;EMP&#039;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;데이터 마이닝에서 활용 &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 데이터 정재를 위해 데이터의 오류 패턴을 찾을 경우 활용&lt;br  /&gt;- 테스트를 위한 표본 데이터를 생성할때 적용&lt;/p&gt;
&lt;p&gt;&lt;br  /&gt;&lt;strong&gt;데이터 마이닝&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;- 숨겨진 패턴과 관계를 찾아내어 의미 있는 정보를 발견해 내는 것&lt;br  /&gt;- 신뢰도가 높은 충분한 자료를 사용&lt;br  /&gt;- 너무 많을 경우 분석이 어려울수 있으므로 사용&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;blockquote class=&quot;q2&quot;&gt;
&lt;p&gt;옵티마이져의 실행계획을 보는 방법에 대한 내용들입니다.&lt;br  /&gt;CBO가 어떤 인덱스로 어떻게 액세스를 진행하느냐를 바로 해설할수 있도록&lt;br  /&gt;꾸준한 연습과 분석을 해야할거같습니다.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;br  /&gt;&lt;/p&gt;
&lt;blockquote class=&quot;q5&quot;&gt;
&lt;p&gt;작성자: tofriend(남송휘)&lt;br  /&gt;작성일: 2009년 08월 02일&lt;br  /&gt;참고문헌 : 새로쓴 대용량데이터 베이스 1 - 이화식 , 기타 문서 &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/div&gt;]]></description>
						<pubDate>Sun, 02 Aug 2009 20:10:32 +0900</pubDate>
								</item>
				<item>
			<title><![CDATA[3.1 SQL의 실행계획 (2/3)]]></title>
			<dc:creator><![CDATA[운영자]]></dc:creator>
			<link>http://bysql.net/index.php?mid=d200907&amp;document_srl=62</link>
			<guid isPermaLink="true">http://bysql.net/index.php?mid=d200907&amp;document_srl=62</guid>
						<comments>http://bysql.net/index.php?mid=d200907&amp;document_srl=62#comment</comments>
									<description><![CDATA[&lt;div class=&quot;xe_content&quot;&gt;&lt;div class=&quot;postbody&quot;&gt;&lt;strong&gt;3.1.2.3. 옵티마이져 목표(Goal)의 선택&lt;/strong&gt;&lt;br  /&gt;&lt;strong&gt;가) 옵티마이져 모드의 종류&lt;/strong&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;초기 결과 최적화(First_rows)&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;일부라도 우선 수행&lt;/li&gt;&lt;li&gt;비용기준과 경험적 방법(Heuristic method)을 혼합한 접근 방법&lt;/li&gt;&lt;li&gt;주어진 상황에 따라 선택하여 최적화를 수행&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;전체결과 최적화(All_rows)&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;전체가 모두 수행&lt;/li&gt;&lt;li&gt;CBO의 기본모드&lt;/li&gt;&lt;li&gt;사용자 입장에서는 전체를 모두 처리하는것보다 First_Rows 모드가 일반적일수 있음&lt;/li&gt;&lt;li&gt;부분처리를 원하는 SQL을 All_rows모드로 처리하면 심각한 속도 저하가 올수 있음&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;First_Rows_n&nbsp;&nbsp;??&lt;br  /&gt;&lt;ul&gt;&lt;li&gt; n 은 처리를 원하는 범위&lt;/li&gt;&lt;li&gt;비용기준으로 최적화를 접근&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;strong&gt;나) 옵티마이져 모드의 결정 기준&lt;/strong&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;기존 시스템이 있다면&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;&#039;CHOOSE&#039;모드가 있던 버전 - FIRST_ROW&lt;/li&gt;&lt;li&gt;신버전에서 개발된 버전 - FIRST_ROWS_N&lt;/li&gt;&lt;li&gt;배치처리 위주 - ALL_ROWS&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;옵티마이져 모드 변경&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;충분한 준비후 작업&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;모드 변경후 기존 SQL 을 위한방법&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;파라메터 수정&lt;/li&gt;&lt;li&gt;옵티마이져 버전을 지정하는 파라메터를 과거 버전으로 지정&lt;/li&gt;&lt;li&gt;OPTIMIZER_FEATURES_ENABLE (옵티마이져 버전 지정)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;기존 방법에서 안정화를 하려는것보다 신기술에대한 적용이 바람직&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;OUTLINE 이용&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;요약본을 생성하여 이를 참조&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;strong&gt;다) 옵티마이져 모드와 관련된 파라메터 지정&lt;/strong&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;CURSOR_SHARING&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;SQL문내의 상수값을 변수로 전환하여 파싱&lt;/li&gt;&lt;li&gt;옵션&lt;/li&gt;&lt;li&gt;FORCE ; 상수로 입력되어도 변수로 인정 (SIMILAR보다 등급이 높음)&lt;/li&gt;&lt;li&gt;SIMILR ; 상수로 입력되어도 변수로 인정&lt;/li&gt;&lt;li&gt;EXACT(default) ; 대,소문자,공백,비교 상수값이 달라도 공유 불가&lt;/li&gt;&lt;li&gt;OUTLINE 적용하려면 FORCE,SIMILAR적용 필수&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;DB_FILE_MULTIBLOCK_READ_COUNT&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;전체 테이블 스캔이나 인덱스 고속전체스캔을 할때 한번의 I/O로 읽어야하는 블록수 지정에 사용&lt;/li&gt;&lt;li&gt;Default 8 (대용량의 배치 위주라면 수치증가 시키는 것이 유리)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;OPTIMIZER_INDEX_CACHING&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;인덱스를 통해 반복 랜덤액세스할때 블럭들이 버퍼에 캐쉬되어있을 확률을 지정 (Nested Loops 조인이나 IN-List 탐침수행시)&lt;/li&gt;&lt;li&gt;Default 0 (반복랜덤엑세스가 빈번한 인덱스 블록이 많다면 값 증가)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;OPTIMIZER_INDEX_COST_ADJ&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;비용계산시 인덱스의 액세스 비중을 조정하는 역할&lt;/li&gt;&lt;li&gt;(Default) 100 (정상인 비용을 그대로 적용)&lt;/li&gt;&lt;li&gt;10 (1/10으로 계산)&lt;/li&gt;&lt;li&gt;인덱스액세스 경우가 전체 테이블 스캔으로 자주 일아날경우 조정할 필요있음&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &#039;choose&#039;모드&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;옵티마이져의 비용기준으로 이전 과도기에 사용&lt;/li&gt;&lt;li&gt;통계정보가 없을경우 규칙으로 전환&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Optimizer_dynamic_sampling&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;동적 표본화 (Dynamic Sampling)&lt;/li&gt;&lt;li&gt;기존 choose모드의 대체 개념&lt;/li&gt;&lt;li&gt;소량의 표본을 동적으로 자동으로 추출하여 통계정보로 활용 (소량이나 자주 수행될경우 적용하지 않아야함)&lt;/li&gt;&lt;li&gt;통계정보 미보유,사용불능(에러등),너무오래된경우 적용&lt;/li&gt;&lt;li&gt;파라메트값: 0 사용하지 않음&lt;/li&gt;&lt;li&gt;기본블록수 32, 레벨증가시 2의 제곱만큼 증가&lt;/li&gt;&lt;li&gt;전체 테이블 표본으로 할경우 10레벨&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;div class=&quot;quotewrapper&quot;&gt;&lt;div class=&quot;quotetitle&quot;&gt;인용:&lt;/div&gt;&lt;div class=&quot;quotecontent&quot;&gt;옵티마이져 모드 변경시 상황을 깊히 고려해야하며 필요에따라 세션만 적용하는 등의 방법으로 사용하여야한다&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;strong&gt;3.1.2.4. 실행계획의 고정화(Stability)&lt;/strong&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;아우트라인(Outline)&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;동일한 실행계획을으로 재현할수 있도록 도와주는 최소한의 참조정보를 보유&lt;/li&gt;&lt;li&gt;범용적,개별적으로 관리 하거나 적용,금지 시킬수 있으며 필요시 편집과 익스포트와 임포트역시 가능&lt;/li&gt;&lt;li&gt;필요 조건에 따른 카테고리 별로 관리하는것도 좋음&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;strong&gt;가) 아우트라인의 생성과 조정&lt;/strong&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;패키지 &lt;br  /&gt;&lt;ul&gt;&lt;li&gt;DBMS_OUTLN 과 DBMS_OUTLN_EDIT&lt;/li&gt;&lt;li&gt;CREATE_OUTLINE:&nbsp;&nbsp;지정된 건을 공유 커서에서 찾아 아우트라인을 생성&lt;/li&gt;&lt;li&gt;CLEAR_USED: 지정한 아우트라인을 제거&lt;/li&gt;&lt;li&gt;DROP_BY_CAT: 지정한 카테고리에 속한 아우트라인을 제거&lt;/li&gt;&lt;li&gt;DROP_UNUSED: SQL파싱에 사용된적이 없는 아우트라인을 제거&lt;/li&gt;&lt;li&gt;UPDATE_BY_CAT : 어떤카테고리를 새로운 카테고리로 변경&lt;/li&gt;&lt;li&gt;GENERATE_SIGNATURE: 지정한 SQL문에 대한 식별자 생성&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;생성&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;CREATE_STORED_OUTLINES (파리메터) 를 특정세션에 지정하여 생성 시작,종료 하는것이 일반적임&lt;/li&gt;&lt;li&gt;TRUE나 FALSE를 지정하거나 카테고리 명 직접 지정가능&lt;/li&gt;&lt;li&gt;TRUE; &#039;DEFAULT&#039; 카테고리로 생성&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;사용&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;USE_STORED_OUTLINES 를 지정하여 사용&lt;/li&gt;&lt;li&gt;TRUE나 FALSE, 카테고리 명지정가능&lt;/li&gt;&lt;li&gt;ALTER OUTLINE 으로 아우트라인 이름이나 카테고리 변경, 재생성도 가능&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;PRIVATE 아우트 라인&lt;br  /&gt;&lt;ul&gt;1) 기존 아우트 라인 복제&lt;br  /&gt; CREATE PRIVATE OUTLINE prv_ol_1 From outln_1;&lt;br  /&gt;2) 아우트라인 수정가능 툴이나 DBMS_OUTLN_EDIT 패키지의 프로시져를 이용해 갱신&lt;br  /&gt;&nbsp;&nbsp; REFRESH_PRIVATE_OUTLINE- (수작업으로 갱신하였을경우 사용)&lt;br  /&gt;3) 검정&lt;br  /&gt;&nbsp;&nbsp;USE_PRIVATE_OUTLINES를 TRUE로 지정후 검증&lt;br  /&gt;4) 적용&lt;br  /&gt; CREATE OR REPLACE OUTLINE outln_1 From PRIVATE prv_ol_1;&lt;br  /&gt;5) 수행종료&lt;br  /&gt; USE_PRIVATE_OUTLINES 를 FALSE로 지정&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;strong&gt;나) 아우트라인의 관찰&lt;/strong&gt;&lt;br  /&gt;&lt;ul&gt;뷰를 통해 내용 확인 가능&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;USER_OUTLINES&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;USER_OUTLINE_HINTS&lt;/li&gt;&lt;li&gt;권한이 허용하면 DBA나 ALL로도 가능&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;div class=&quot;codewrapper&quot;&gt;&lt;div class=&quot;codetitle&quot;&gt;&lt;b&gt;코드:&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codecontent&quot;&gt;수행 SQL&lt;br  /&gt;SELECT empno,ename,job,loc&lt;br  /&gt;from emp e,dept d&lt;br  /&gt;where e.deptno=d.deptno and e.empno=7856&lt;br  /&gt;order by loc&lt;br  /&gt;&lt;br  /&gt;NAME : SYS&nbsp;&nbsp;&nbsp;&nbsp;SYS_OUTLINE_050921102126523 -------------(A)&lt;br  /&gt;CATEGORY : LHS001 ---------------------------------------(B)&lt;br  /&gt;USED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: UNUSED&lt;br  /&gt;TIMESTAM : 05 / 09 /16&lt;br  /&gt;VERSION : 9.2.0.1.0&lt;br  /&gt;SQL_TEXT : SELECT EMPNO, ENAME, JOB LOC FROM EMP E,DEPT D WHERE&lt;br  /&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.deptno=d.deptno and e.empno=:&quot;SYS_B_0&quot; order b loc ----(C)&lt;br  /&gt;SIGNATURE : 2E945C676F84B939E862C3F6D8A4E7CF -----------------(D)&lt;br  /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;A) 아우트라인의 명칭(자동으로 생성된것)&lt;/li&gt;&lt;li&gt;B) 생성시 부여한 카테고리&lt;/li&gt;&lt;li&gt;C) CURSOR_SHARING 값이 SIMILAR로 지정, 조건절의 상수값은 바인드 변수로 변경되어 생성&lt;/li&gt;&lt;li&gt;D) RAW 타입으로 생성된 SQL 식별자 , 동일 SQL을 다른 카테고리에 생성하면 값은 동일 A의 명칭은 변경됨&lt;/li&gt;&lt;/ul&gt;&lt;div class=&quot;codewrapper&quot;&gt;&lt;div class=&quot;codetitle&quot;&gt;&lt;b&gt;코드:&lt;/b&gt;&lt;/div&gt;&lt;div class=&quot;codecontent&quot;&gt;create outline emp_j_otl&lt;br  /&gt;on SELECT emp.empno,emp.deptno,dept.loc FROM emp,dept&lt;br  /&gt;&nbsp;&nbsp;WHERE emp.deptno=dept.deptno;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;SELECT * FROM USER_OUTLINES WHERE name=&#039;EMP_J_OTL&#039;;&lt;br  /&gt;&lt;br  /&gt;NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CATEGORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TIMESTAMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VERSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL_TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SIGNATURE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMPATIBLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENABLED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FORMAT&lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNUSED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2009.07.21
21:42:14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.2.0.1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT emp.empno,emp.deptno,dept.loc FROM
emp,dept WHERE
emp.deptno=dept.deptno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AF8B1B1EB1ED3CD0C9523EF77C200ACA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COMPATIBLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENABLED&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NORMAL&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;실테이블에서 확인&lt;br  /&gt;OUTLN.OL$HINTS&lt;br  /&gt;SELECT * FROM OUTLN.OL$HINTS;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINT#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CATEGORY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINT_TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HINT_TEXT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TABLE_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;COST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CARDINALITY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOIN_PRED&lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USE_NL(@&quot;SEL$1&quot;
&quot;EMP&quot;@&quot;SEL$1&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.00691534303308&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMP.DEPTNO =
DEPT.DEPTNO&lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEADING(@&quot;SEL$1&quot; &quot;DEPT&quot;@&quot;SEL$1&quot; &quot;EMP&quot;@&quot;SEL$1&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INDEX(@&quot;SEL$1&quot;
&quot;EMP&quot;@&quot;SEL$1&quot;
(&quot;EMP&quot;.&quot;DEPTNO&quot;))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.000160523044559189&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FULL(@&quot;SEL$1&quot; &quot;DEPT&quot;@&quot;SEL$1&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.0046162831899&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OUTLINE_LEAF(@&quot;SEL$1&quot;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ALL_ROWS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;109&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPTIMIZER_FEATURES_ENABLE(&#039;10.2.0.1&#039;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;EMP_J_OTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IGNORE_OPTIM_EMBEDDED_HINTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br  /&gt;&lt;br  /&gt;실행계획&lt;br  /&gt;Execution Plan&lt;br  /&gt;----------------------------------------------------------&lt;br  /&gt;Plan hash value: 1619650520&lt;br  /&gt;&lt;br  /&gt;---------------------------------------------------------------------------------------&lt;br  /&gt;| Id&nbsp;&nbsp;| Operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Name&nbsp;&nbsp;&nbsp;&nbsp;| Rows&nbsp;&nbsp;| Bytes | Cost (%CPU)| Time&nbsp;&nbsp;&nbsp;&nbsp; |&lt;br  /&gt;---------------------------------------------------------------------------------------&lt;br  /&gt;|&nbsp;&nbsp; 0 | SELECT STATEMENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp;&nbsp;92 |&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp; (0)| 00:00:01 |&lt;br  /&gt;|&nbsp;&nbsp; 1 |&nbsp;&nbsp;TABLE ACCESS BY INDEX ROWID| EMP&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp;&nbsp;24 |&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp; (0)| 00:00:01 |&lt;br  /&gt;|&nbsp;&nbsp; 2 |&nbsp;&nbsp; NESTED LOOPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp;&nbsp;92 |&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp; (0)| 00:00:01 |&lt;br  /&gt;|&nbsp;&nbsp; 3 |&nbsp;&nbsp;&nbsp;&nbsp;TABLE ACCESS FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| DEPT&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp;&nbsp;22 |&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp; (0)| 00:00:01 |&lt;br  /&gt;|*&nbsp;&nbsp;4 |&nbsp;&nbsp;&nbsp;&nbsp;INDEX RANGE SCAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | EMP_IDX |&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; (0)| 00:00:01 |&lt;br  /&gt;---------------------------------------------------------------------------------------&lt;br  /&gt;&lt;br  /&gt;Predicate Information (identified by operation id):&lt;br  /&gt;---------------------------------------------------&lt;br  /&gt;&lt;br  /&gt;&nbsp;&nbsp; 4 - access(&quot;EMP&quot;.&quot;DEPTNO&quot;=&quot;DEPT&quot;.&quot;DEPTNO&quot;)&lt;/div&gt;&lt;/div&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;br  /&gt;완벽한 실행계획의 모습은 아니지만 조인방법과 조인순서,인덱스,비용,카디널리티 까지 보유하고 있으며&lt;br  /&gt;테이블을 수정하여 변경하는것도 가능&lt;/ul&gt;&lt;div class=&quot;quotewrapper&quot;&gt;&lt;div class=&quot;quotetitle&quot;&gt;인용:&lt;/div&gt;&lt;div class=&quot;quotecontent&quot;&gt;아웃라인 참고&lt;br  /&gt;&lt;!-- m --&gt;&lt;a class=&quot;postlink&quot; href=&quot;http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_6005.htm#i2119940&quot;&gt;http://stanford.edu/dept/itss/docs/orac ... m#i2119940&lt;/a&gt;&lt;!-- m --&gt;&lt;/div&gt;&lt;/div&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;strong&gt;다) 옵티마이져 업그레이드 시의 적용&lt;/strong&gt;&lt;br  /&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;규칙기준-&gt; 비용기준&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt; 기존 실행계획을 유지하면서 점차적으로 비용기준에 맞추어 가도록 하는전략&lt;/em&gt;&lt;br  /&gt;&lt;ul&gt;&lt;li&gt;1) 특정 카테고리를 주고 아우트 라인을 생성&lt;br  /&gt; &lt;/li&gt;&lt;li&gt;alter session set create_stored_outlines = category_name;&lt;br  /&gt; &lt;/li&gt;&lt;li&gt;전체적으로 적용시 alter system&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;2) 대부분의 SQL대해 아우트 라인이 생성되도록 충분한 기간을 두고 수집&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;3)아우트 라인 종료 &#039; create_stored_outlines&#039; 파라메터를 &#039;false&#039;로 지정&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;4) dbms_stats 패키지를 이요하여 통계정보를 생성&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;5) 옵티마지여 모드를 Rule에서 Choose로 변경&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;6) 현세션만적용시 Alter Session ,전체 Alter system 을 이용&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;/li&gt;&lt;li&gt;옵티마져의 버전업등의 각 상황에 맞게 아웃라인을 생성해서&nbsp;&nbsp;단계적으로 적용하며&lt;/li&gt;&lt;li&gt;생성시 작업의 성격, 테이블의 성격등 업무특성에 맞게 카테고리 별로 생성시켜 두고 활용하는게 좋다&lt;/li&gt;&lt;/ul&gt;&lt;br  /&gt;&lt;strong&gt;3.1.2.5. 옵티마이져의 한계&lt;/strong&gt;&lt;br  /&gt;&lt;div class=&quot;quotewrapper&quot;&gt;&lt;div class=&quot;quotetitle&quot;&gt;인용:&lt;/div&gt;&lt;div class=&quot;quotecontent&quot;&gt;비용기준 옵티마이져는 완벽할수 없는통계정보를 토대로 정확한 처리범위를 예측할수 없다는 것&lt;br  /&gt;다양한 사용 형태를 만족할 수 있도록 종합적이고 전략적인 차원에서 적절한 인덱스나 클러스터링을 결정하고, 수준높은 sql을 구사하는것이 반드시 필요하다는 것&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;

					&lt;br  /&gt;&lt;/div&gt;]]></description>
						<pubDate>Fri, 24 Jul 2009 20:53:49 +0900</pubDate>
								</item>
			</channel>
</rss>
