4.1. 인덱스의 선정 기준 (1/2) (4.1.1.~4.1.5.)

조회 수 7567 추천 수 0 2010.11.30 20:22:46
노랑배 *.159.170.47
제목 작성자 날짜
4.1. 인덱스의 선정 기준 (1/2) (4.1.1.~4.1.5.) (current) 노랑배 2010.11.30 20:22:46
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<ul>
<li>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</li>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; <strong>∵</strong>기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델링에서 주로 키 엔터키(Key Entity)로 구성된 테이블. 대표적인 예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p dir="ltr">&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p>
<ul>
<li>데이터가 지속적으로 증가하고 있기에 비트맵 인덱스 보다 <strong>B-Tree 인덱스가 주로 사용</strong></li>
<li>테이블 구조에 따라 인덱스 전략에 영향을 받음</li>
<li>예) 매출정보 테이블</li></ul>
<p>&nbsp;</p></blockquote>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라)&nbsp;저장용 대형&nbsp;테이블</p>
<ul>
<li>갱신이 거의 없어 여유공간(PCTFREE)을 전혀 부여하지 않을 수 있다.</li>
<li>파티션을 고려할 수 있다.</li>인덱스 전략 수립시 절차 중요</ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p># 최선의 방법</p>
<p>* 처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>* 처리범위가 적다는 것은 분포가 적다는 것을 의미</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① <u>COL1 인덱스에서 'ABC'인 첫번째 로우</u>와 <u>COL2 인덱스에서 123인 첫번째 로우</u>를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 <u>인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스</u> 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는</p>
<p>두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는</p>
<p>각 인덱스 컬럼 값들과 ROWID로 정렬을 한다. =&gt;&nbsp;이미 머지된 결과에서 rowid를 액세스 한다.&nbsp;=&gt;&nbsp;<span style="COLOR: #0000ff">인덱스 머지보다 처리범위를 줄임</span></p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하<br />즉, 어떤 컬럼들로 인덱스를 구성할지 고민, 어떤 순서로 할지, 치밀한 전략이 필요</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">다음</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p>많은 사람들은 분포도가 좋은 컬럼이 인덱스 컬럼의 순서 결정에 최우선이 된다라고 생각함.&nbsp; =&gt;&nbsp; <span style="COLOR: #ef007c">막연한 생각일 뿐이다</span></p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p>
<p align="left">분포도보다 더 중요한 요소는 '='의 사용여부 이다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">..</span></span></span></p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p dir="ltr" align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>..</p>
<p><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-5</p></td></tr></tbody></table>
<p></p></span></span></span>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 좌측 그림 설명</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2와 COL1이 모두 '='을 가지게 된다.</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">라) 처리범위에 직접적인 영향을 주지 못하는 컬럼의 추가 기준</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></span></span></span></p>
<ul dir="ltr">
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">결합 인덱스의 컬럼 순서를 결정하는 우선순위</span></span></span></span></span></span></div></li>
<ul>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">1단계 : 항상 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">2단계 : 항상 '='로 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">3단계 : 어느 것이 더 좋은 분포도를 가지는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">4단계 : 자주 정렬되는 순서는 무엇인가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">5단계 : 부가적으로 추가시킬 컬럼은 어떤 것으로 할 것인가?</span></span></span></span></span></span></div></li></ul></ul>
<p align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">&nbsp;
<p align="left">&nbsp;</p></span></span></span>
<p></p></span></span></span>
<p></p>
<p></p>
<p></p>
<p></p></p>
노랑배 2010.11.30 19:11:34
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<ul>
<li>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</li>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; <strong>∵</strong>기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델링에서 주로 키 엔터키(Key Entity)로 구성된 테이블. 대표적인 예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p dir="ltr">&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p>
<ul>
<li>데이터가 지속적으로 증가하고 있기에 비트맵 인덱스 보다 <strong>B-Tree 인덱스가 주로 사용</strong></li>
<li>테이블 구조에 따라 인덱스 전략에 영향을 받음</li>
<li>예) 매출정보 테이블</li></ul>
<p>&nbsp;</p></blockquote>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라)&nbsp;저장용 대형&nbsp;테이블</p>
<ul>
<li>갱신이 거의 없어 여유공간(PCTFREE)을 전혀 부여하지 않을 수 있다.</li>
<li>파티션을 고려할 수 있다.</li>인덱스 전략 수립시 절차 중요</ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p># 최선의 방법</p>
<p>* 처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>* 처리범위가 적다는 것은 분포가 적다는 것을 의미</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① <u>COL1 인덱스에서 'ABC'인 첫번째 로우</u>와 <u>COL2 인덱스에서 123인 첫번째 로우</u>를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 <u>인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스</u> 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는</p>
<p>두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는</p>
<p>각 인덱스 컬럼 값들과 ROWID로 정렬을 한다. =&gt;&nbsp;이미 머지된 결과에서 rowid를 액세스 한다.&nbsp;=&gt;&nbsp;<span style="COLOR: #0000ff">인덱스 머지보다 처리범위를 줄임</span></p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하<br />즉, 어떤 컬럼들로 인덱스를 구성할지 고민, 어떤 순서로 할지, 치밀한 전략이 필요</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">다음</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p>많은 사람들은 분포도가 좋은 컬럼이 인덱스 컬럼의 순서 결정에 최우선이 된다라고 생각함.&nbsp; =&gt;&nbsp; <span style="COLOR: #ef007c">막연한 생각일 뿐이다</span></p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p>
<p align="left">분포도보다 더 중요한 요소는 '='의 사용여부 이다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">..</span></span></span></p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p dir="ltr" align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>..</p>
<p><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-5</p></td></tr></tbody></table>
<p></p></span></span></span>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 좌측 그림 설명</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2와 COL1이 모두 '='을 가지게 된다.</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">라) 처리범위에 직접적인 영향을 주지 못하는 컬럼의 추가 기준</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></span></span></span></p>
<ul dir="ltr">
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">결합 인덱스의 컬럼 순서를 결정하는 우선순위</span></span></span></span></span></span></div></li>
<ul>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">1단계 : 항상 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">2단계 : 항상 '='로 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">3단계 : 어느 것이 더 좋은 분포도를 가지는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">4단계 : 자주 정렬되는 순서는 무엇인가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">5단계 : 부가적으로 추가시킬 컬럼은 어떤 것으로 할 것인가?</span></span></span></span></span></span></div></li></ul></ul>
<p align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">&nbsp;
<p align="left">&nbsp;</p></span></span></span>
<p></p></span></span></span>
<p></p>
<p></p>
<p></p></p>
노랑배 2010.11.30 17:58:37
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<ul>
<li>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</li>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; <strong>∵</strong>기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델링에서 주로 키 엔터키(Key Entity)로 구성된 테이블. 대표적인 예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p dir="ltr">&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p>
<ul>
<li>데이터가 지속적으로 증가하고 있기에 비트맵 인덱스 보다 <strong>B-Tree 인덱스가 주로 사용</strong></li>
<li>테이블 구조에 따라 인덱스 전략에 영향을 받음</li>
<li>예) 매출정보 테이블</li></ul>
<p>&nbsp;</p></blockquote>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라)&nbsp;저장용 대형&nbsp;테이블</p>
<ul>
<li>갱신이 거의 없어 여유공간(PCTFREE)을 전혀 부여하지 않을 수 있다.</li>
<li>파티션을 고려할 수 있다.</li>인덱스 전략 수립시 절차 중요</ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p># 최선의 방법</p>
<p>* 처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>* 처리범위가 적다는 것은 분포가 적다는 것을 의미</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① <u>COL1 인덱스에서 'ABC'인 첫번째 로우</u>와 <u>COL2 인덱스에서 123인 첫번째 로우</u>를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 <u>인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스</u> 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는</p>
<p>두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는</p>
<p>각 인덱스 컬럼 값들과 ROWID로 정렬을 한다. =&gt;&nbsp;이미 머지된 결과에서 rowid를 액세스 한다.&nbsp;=&gt;&nbsp;<span style="COLOR: #0000ff">인덱스 머지보다 처리범위를 줄임</span></p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">..</span></span></span></p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p dir="ltr" align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>다음</p>
<p><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-5</p></td></tr></tbody></table>
<p></p></span></span></span>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 좌측 그림 설명</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2와 COL1이 모두 '='을 가지게 된다.</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">라) 처리범위에 직접적인 영향을 주지 못하는 컬럼의 추가 기준</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></span></span></span></p>
<ul dir="ltr">
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">결합 인덱스의 컬럼 순서를 결정하는 우선순위</span></span></span></span></span></span></div></li>
<ul>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">1단계 : 항상 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">2단계 : 항상 '='로 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">3단계 : 어느 것이 더 좋은 분포도를 가지는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">4단계 : 자주 정렬되는 순서는 무엇인가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">5단계 : 부가적으로 추가시킬 컬럼은 어떤 것으로 할 것인가?</span></span></span></span></span></span></div></li></ul></ul>
<p align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">&nbsp;
<p align="left">&nbsp;</p></span></span></span>
<p></p></span></span></span>
<p></p>
<p></p></p>
노랑배 2010.11.30 16:28:08
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<ul>
<li>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</li>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; <strong>∵</strong>기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델링에서 주로 키 엔터키(Key Entity)로 구성된 테이블. 대표적인 예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p dir="ltr">&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p>
<ul>
<li>데이터가 지속적으로 증가하고 있기에 비트맵 인덱스 보다 <strong>B-Tree 인덱스가 주로 사용</strong></li>
<li>테이블 구조에 따라 인덱스 전략에 영향을 받음</li>
<li>예) 매출정보 테이블</li></ul>
<p>&nbsp;</p></blockquote>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라)&nbsp;저장용 대형&nbsp;테이블</p>
<ul>
<li>갱신이 거의 없어 여유공간(PCTFREE)을 전혀 부여하지 않을 수 있다.</li>
<li>파티션을 고려할 수 있다.</li>인덱스 전략 수립시 절차 중요</ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">..</span></span></span></p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p dir="ltr" align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>다음</p>
<p><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-5</p></td></tr></tbody></table>
<p></p></span></span></span>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 좌측 그림 설명</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2와 COL1이 모두 '='을 가지게 된다.</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">라) 처리범위에 직접적인 영향을 주지 못하는 컬럼의 추가 기준</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></span></span></span></p>
<ul dir="ltr">
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">결합 인덱스의 컬럼 순서를 결정하는 우선순위</span></span></span></span></span></span></div></li>
<ul>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">1단계 : 항상 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">2단계 : 항상 '='로 사용하는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">3단계 : 어느 것이 더 좋은 분포도를 가지는가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">4단계 : 자주 정렬되는 순서는 무엇인가?</span></span></span></span></span></span></div></li>
<li>
<div align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">5단계 : 부가적으로 추가시킬 컬럼은 어떤 것으로 할 것인가?</span></span></span></span></span></span></div></li></ul></ul>
<p align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">&nbsp;
<p align="left">&nbsp;</p></span></span></span>
<p></p></span></span></span>
<p></p></p>
노랑배 2010.11.24 09:59:01
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p><span style="FONT-SIZE: 14px"><strong><span style="FONT-SIZE: 12px"></span></strong></span>&nbsp;<a href="http://www.gurubee.net/pages/viewpage.action?pageId=1507462">http://www.gurubee.net/pages/viewpage.action?pageId=1507462</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<blockquote class="q7">
<p>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</p></blockquote>
<ul>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; ∵기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델리엥서 주로 키 엔터키(Key Entity)로 구성된 테이블.</li>
<li>예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>조건의 형태가 뚜렷하고, 데이터 증감이 별로 없으며, 검색 위주의 액세스가 발생한다는 것.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라) 중대형 테이블 특징</p>
<ul>
<li>대부분의 인덱스가 여러 컬럼으로 만들어진 여러 개의 결합 인데스로 구성</li>
<li>B-Tree 인데긋가 주로 사용</li>
<li>테이블 구조에 따라 인덱스 전략에 영향 미침</li>
<li>인덱스 전략 수립시 절차 중요</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">..</span></span></span></p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p dir="ltr" align="left">
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>다음</p>
<p><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-5</p></td></tr></tbody></table></p></span></span></span>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 좌측 그림 설명</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">COL2와 COL1이 모두 '='을 가지게 된다.</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">라) 처리범위에 직접적인 영향을 주지 못하는 컬럼의 추가 기준</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;<span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p></span></span></span>
<p></p></span></span></span></p>
노랑배 2010.11.23 14:26:15
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p><span style="FONT-SIZE: 14px"><strong><span style="FONT-SIZE: 12px"></span></strong></span>&nbsp;<a href="http://www.gurubee.net/pages/viewpage.action?pageId=1507462">http://www.gurubee.net/pages/viewpage.action?pageId=1507462</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<blockquote class="q7">
<p>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</p></blockquote>
<ul>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; ∵기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델리엥서 주로 키 엔터키(Key Entity)로 구성된 테이블.</li>
<li>예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>조건의 형태가 뚜렷하고, 데이터 증감이 별로 없으며, 검색 위주의 액세스가 발생한다는 것.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라) 중대형 테이블 특징</p>
<ul>
<li>대부분의 인덱스가 여러 컬럼으로 만들어진 여러 개의 결합 인데스로 구성</li>
<li>B-Tree 인데긋가 주로 사용</li>
<li>테이블 구조에 따라 인덱스 전략에 영향 미침</li>
<li>인덱스 전략 수립시 절차 중요</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br /></p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">&nbsp;
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">다음</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">다음</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>다음</p>
<p>&nbsp;</p>
<p align="center"><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;그림 1-4-5</p></td></tr></tbody></table></span></span></span>
<p></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p align="left">■ 좌측 그림 설명</p>
<p align="left">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</p>
<p align="left">&nbsp;&nbsp;</p>
<p align="left">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</p>
<p align="left">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</p>
<p align="left">COL2와 COL1이 모두 '='을 가지게 된다.</p></span></span></span>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>다음</p>
<p>&nbsp;</p>
<p align="center"><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">&nbsp;그림 1-4-5</p></td></tr></tbody></table></span></span></span>
<p></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p align="left">■ 좌측 그림 설명</p>
<p align="left">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</p>
<p align="left">&nbsp;&nbsp;</p>
<p align="left">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</p>
<p align="left">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</p>
<p align="left">COL2와 COL1이 모두 '='을 가지게 된다.</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 725px; HEIGHT: 218px" alt="1.4.6.jpg" src="files/attach/images/6534/794/007/1.4.6.jpg" width="873" height="391" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-6</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp; </p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p></span></span></span></p></p></blockquote></span></span></span></p>
노랑배 2010.11.23 01:18:44
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p><span style="FONT-SIZE: 14px"><strong><span style="FONT-SIZE: 12px"></span></strong></span>&nbsp;<a href="http://www.gurubee.net/pages/viewpage.action?pageId=1507462">http://www.gurubee.net/pages/viewpage.action?pageId=1507462</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<blockquote class="q7">
<p>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</p></blockquote>
<ul>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; ∵기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델리엥서 주로 키 엔터키(Key Entity)로 구성된 테이블.</li>
<li>예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>조건의 형태가 뚜렷하고, 데이터 증감이 별로 없으며, 검색 위주의 액세스가 발생한다는 것.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라) 중대형 테이블 특징</p>
<ul>
<li>대부분의 인덱스가 여러 컬럼으로 만들어진 여러 개의 결합 인데스로 구성</li>
<li>B-Tree 인데긋가 주로 사용</li>
<li>테이블 구조에 따라 인덱스 전략에 영향 미침</li>
<li>인덱스 전략 수립시 절차 중요</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p></blockquote>
<p><br />&nbsp;</p>
<p>&nbsp;</p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br /></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table>
<p>&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br /></p>
<p align="left">다) IN 연산자를 이용한 징검다리 효과</p>
<p align="left">■ 두개의 컬럼을 함께 사용하는 액세스 형태 조사해 보면</p>
<ul>
<li>
<div align="left">COL2는 '=' 사용, &nbsp;COL1은 '=' 사용하지 않음&nbsp; =&gt;&nbsp; COL2+COL1 결합인덱스 생성</div></li>
<li>
<div align="left">COL2는 LIKE 나 BETWEEN 사용,&nbsp; COL1은 &nbsp;' =' 사용&nbsp; =&gt;&nbsp; COL1+COL2 결합인덱스 생성</div></li></ul>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p align="left"><span style="COLOR: #ff0000">최소의 인덱스로 최대의 액세스 형태를 만족하는 결합인덱스 생성이 목적</span></p></blockquote>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"></span><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">■ 비효율적인 인덱스를 사용하면서도 비효율이 없도록 하는 방법</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">범위 연산을 IN 연산으로 변형</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<blockquote class="q7">
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">다음</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">다음</span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>다음</p>
<p>&nbsp;</p>
<p align="center"><img style="WIDTH: 628px; HEIGHT: 370px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p>&nbsp;</p></td></tr></tbody></table></span></span></span></p>
<p dir="ltr" align="left"><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000"></span></span></span>&nbsp;</p><span style="COLOR: #ff0000"><span style="COLOR: #000000"><span style="COLOR: #000000">
<p align="left">■ 좌측 그림 설명</p>
<p align="left">COL2가 'BETWEEN'으로 사용되어 COL1이 '='을 사용 했더라도 COL2의 범위를 모두 스캔</p>
<p align="left">&nbsp;&nbsp;</p>
<p align="left">■ 우측 그림 설명 ( 'BETWEEN'&nbsp; 을&nbsp; 'IN' 으로 변경)</p>
<p align="left">'INLIST ITERATOR' 수행 확인(IN절의 리스트 값만 인덱스를 탐침)</p>
<p align="left">COL2와 COL1이 모두 '='을 가지게 된다.</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p dir="ltr" align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-5</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 725px; HEIGHT: 218px" alt="1.4.6.jpg" src="files/attach/images/6534/794/007/1.4.6.jpg" width="873" height="391" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-6</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp; </p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p></span></span></span></blockquote>
노랑배 2010.11.23 01:13:59
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p><span style="FONT-SIZE: 14px"><strong><span style="FONT-SIZE: 12px"></span></strong></span>&nbsp;<a href="http://www.gurubee.net/pages/viewpage.action?pageId=1507462">http://www.gurubee.net/pages/viewpage.action?pageId=1507462</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<blockquote class="q7">
<p>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</p></blockquote>
<ul>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; ∵기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델리엥서 주로 키 엔터키(Key Entity)로 구성된 테이블.</li>
<li>예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>조건의 형태가 뚜렷하고, 데이터 증감이 별로 없으며, 검색 위주의 액세스가 발생한다는 것.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라) 중대형 테이블 특징</p>
<ul>
<li>대부분의 인덱스가 여러 컬럼으로 만들어진 여러 개의 결합 인데스로 구성</li>
<li>B-Tree 인데긋가 주로 사용</li>
<li>테이블 구조에 따라 인덱스 전략에 영향 미침</li>
<li>인덱스 전략 수립시 절차 중요</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓은 COL1이 앞에 위치하고, 분포도가 좁은 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁은 COL2가 앞에 위치하고, 분포도가 넓은 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp; 115 이고 COl1&nbsp; =&nbsp; 'A'인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔, 조건을 비교, 조건을 만족하면 로우 액세스, 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">컬럼에서 '='을 사용한 경우에는 분포도와 결합순서와의 상관관계는 없다.</p></blockquote>
<p><br /></p>
<p align="left">&nbsp;나) 이퀄(=)이 결합순서에 미치는 영향</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■</p>
<blockquote class="q4">
<p align="left">■ SQL 예)</p>
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2 &nbsp;BETWEEN&nbsp; 113&nbsp; AND&nbsp; 115;</p></blockquote>
<p><br />
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도 넓고, &nbsp;'=' 사용한 컬럼이 앞에 위치&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; 분포도 좁고, '=' 사용한 컬럼이 뒤에 위치 &gt;</strong></p>
<p><strong>&nbsp;&nbsp;&lt; 분포도 좁고 'BETWEEN' 사용 컬럼이 뒤에 위치 &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt; 분포도&nbsp;넓고 'BETWEEN' 사용 컬럼이 앞에 위치 &gt;</strong></p>
<p align="center"><img style="WIDTH: 622px; HEIGHT: 421px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="center">그림 1-4-4</p>
<p>..</p></td></tr></tbody></table></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">■ 좌측 그림 수행</p>
<p align="left">분포도가 넓지만 '='로 사용된 COL1이 앞에 위치, 분포도는 좁으나 'BETWEEN'으로 사용된 COL2가 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL1&nbsp; =&nbsp; 'A' 이고 COL2&nbsp; =&nbsp; 115 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ 다음 로우를 차례로 스캔 =&gt; COL1이 'A'가 아니거나 COL2가 115보다 클 때까지 액세스 =&gt; 그렇지 않으면 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 인덱스의 첫번째 컬럼이 '='이므로 COL2가 113과 115 사이에 있는 로우만 액세스</p>
<p align="left">=&gt; COL1 정렬 후 COL2 정렬</p>
<p align="left">=&gt;&nbsp;COL1이 '='로 상용된 범위 내에서는 반드시 COL2 정렬이 보장됨.</p>
<p align="left">=&gt; 115보다 큰 값을 만나면 결코 115보다 적은 값은 존재하지 않는다.</p>
<p align="left">=&gt; 스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">■ 우측 그림 수행</p>
<p align="left">분포도가 좁지만 'BETWEEN'으로 사용된 COl2가 앞에 위치, 분포도는 넓지만 '='을 사용한 COL1이 뒤에 위치</p>
<p align="left">&nbsp;</p>
<p align="left">① COL2&nbsp; =&nbsp;&nbsp;113 이고 COL1&nbsp; =&nbsp;&nbsp;'A' 인 첫번째 로우를 바로 찾는다.</p>
<p align="left">② ROWID를 이용하여 테이블의 로우를 액세스한다.</p>
<p align="left">③ COL2가 115보다 클때까지 스캔, 스캔한 로우는 COL1이 'A인지 체크, 맞으면 로우 액세스</p>
<p align="left">④ COL2가 115보다 커지면&nbsp;스캔 종료</p>
<p align="left">&nbsp;</p>
<p align="left">위는 선행 컬럼인 COL2의 전체범위를 스캔. COL1은 처리 범위를 좁히지 못하고 체크 역할만 함</p>
<p align="left">&nbsp;</p>
<p align="left">◆ 종합</p>
<p align="left">인덱스 첫 번째 컬럼이 '='로 사용되지 않으면 뒤에 있는 컬럼이 '='을 사용하더라도 처리범위는 줄어들지 않는다.</p>
<p align="left">=&gt; <span style="COLOR: #ff0000"><strong>인덱스 컬럼 순서의 결정에는 분포도보다 '='이 더 우선적으로 감안되어야 한다.</strong></span></p>
<p align="left">&nbsp;</p></blockquote>
<p><br /></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 712px; HEIGHT: 429px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-5</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 725px; HEIGHT: 218px" alt="1.4.6.jpg" src="files/attach/images/6534/794/007/1.4.6.jpg" width="873" height="391" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-6</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp; </p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
노랑배 2010.11.23 00:12:16
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p><span style="FONT-SIZE: 14px"><strong><span style="FONT-SIZE: 12px"></span></strong></span>&nbsp;<a href="http://www.gurubee.net/pages/viewpage.action?pageId=1507462">http://www.gurubee.net/pages/viewpage.action?pageId=1507462</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<blockquote class="q7">
<p>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</p></blockquote>
<ul>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; ∵기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델리엥서 주로 키 엔터키(Key Entity)로 구성된 테이블.</li>
<li>예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>조건의 형태가 뚜렷하고, 데이터 증감이 별로 없으며, 검색 위주의 액세스가 발생한다는 것.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라) 중대형 테이블 특징</p>
<ul>
<li>대부분의 인덱스가 여러 컬럼으로 만들어진 여러 개의 결합 인데스로 구성</li>
<li>B-Tree 인데긋가 주로 사용</li>
<li>테이블 구조에 따라 인덱스 전략에 영향 미침</li>
<li>인덱스 전략 수립시 절차 중요</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■ SQL 예)</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p><br /></p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p></blockquote>
<p><br /></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 702px; HEIGHT: 472px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="left"></p>
<p align="left">&nbsp;그림 1-4-4</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 712px; HEIGHT: 429px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-5</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 725px; HEIGHT: 218px" alt="1.4.6.jpg" src="files/attach/images/6534/794/007/1.4.6.jpg" width="873" height="391" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-6</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp; </p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
노랑배 2010.11.22 23:30:20
복원
<p><span style="FONT-SIZE: 14px"><strong>4.1. 인덱스의 선정 기준</strong></span></p>
<p><span style="FONT-SIZE: 14px"><strong><span style="FONT-SIZE: 12px"></span></strong></span>&nbsp;<a href="http://www.gurubee.net/pages/viewpage.action?pageId=1507462">http://www.gurubee.net/pages/viewpage.action?pageId=1507462</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.1. 테이블 형태별 적용기준</strong></p>
<ul>
<li>적은 데이터를 가진 소형 테이블</li>
<li>주로 참조되는(Referenced) 역할을 하는 중대형 테이블</li>
<li>업무의 구체적인 행위를 관리하는 중대형 테이블</li>
<li>저장용(Log) 대형 테이블</li></ul>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>가) 적은 데이터를 가진 소형 테이블</p>
<blockquote class="q7">
<p>DB_FILE_MULTIBLOCK_READ_COUNT에 지정된 숫자 이하의 불록을 가진 테이블</p></blockquote>
<ul>
<li>인덱스 유무가 성능에 거의 미치지 않는다.</li>
<li>소형 테이블도 인덱스 구성이 바람직</li>
<li>소량 테이블이라도 기본키는 인덱스를 권고한다.&nbsp; ∵기본키는 조인의 실행계획이나 무결성에 영향을 미치므로</li></ul></blockquote>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>나) 주로 참조되는(Referenced) 역할을 하는 중대형 테이블</p>
<ul>
<li>트랜잭션 데이터들의 행위의 주체나 목적이 되는 개체들로 구성된 테이블</li>
<li>데이터 모델리엥서 주로 키 엔터키(Key Entity)로 구성된 테이블.</li>
<li>예) 고객 테이블</li>
<li>좁은 범위의 스캔 또는 조인등에 의해 내측루프에서 기본키에 의해 연결되는 유형</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>조건의 형태가 뚜렷하고, 데이터 증감이 별로 없으며, 검색 위주의 액세스가 발생한다는 것.</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>다) 업무의 구체적인 행위를 관리하는 중대형 테이블</p></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>라) 중대형 테이블 특징</p>
<ul>
<li>대부분의 인덱스가 여러 컬럼으로 만들어진 여러 개의 결합 인데스로 구성</li>
<li>B-Tree 인데긋가 주로 사용</li>
<li>테이블 구조에 따라 인덱스 전략에 영향 미침</li>
<li>인덱스 전략 수립시 절차 중요</li></ul></blockquote>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.2. 분포도와 손익분기점</strong></p>
<p>인덱스 생성 목적 : 전체 집합에서 특정부분만 선별적으로 액세스 하고자 하는 것.<br />손익분기점 : 인덱스 컬럼의 분포도가 10~15%를 넘지 않아야 인덱스로서의 가치가 있음.</p>
<p>&nbsp;</p>
<p>최선의 방법</p>
<p>처리범위가 적은 것을 처리주관 조건으로 하는 것</p>
<p>&nbsp;</p>
<p>현실은</p>
<p>많은 액세스 형태 / 경우마다 인덱스 생성 불가</p>
<p>전략적인 구성이 필요</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.3. 인덱스 머지와 결합 인덱스 비교</strong></p>
<p>인덱스 머지(Index Merge) : 여러 인덱스가 협력하여 같이 액세스를 주관</p>
<p>결합 인덱스(Concatenated Index) : 여러 개의 컬럼을 모아 하나의 인덱스로 생성시키는 것.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<blockquote class="q7">
<p align="left">■ 인덱스 머지 SQL 예</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp;&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff"> INDEX1&nbsp; :&nbsp; COL1</span></p>
<p align="left">WHERE COL1 &nbsp;= &nbsp; 'ABC'&nbsp; AND&nbsp; COL2&nbsp; =&nbsp; 123;&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;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">&nbsp;</span><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2</span></p></blockquote>
<p>&nbsp;</p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p><img style="WIDTH: 551px; HEIGHT: 288px" alt="1.4.1.jpg" src="files/attach/images/6534/794/007/1.4.1.jpg" width="735" height="479" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="center">그림 1 - 4 - 1</p>
<p align="left">■ 그림설명</p>
<p align="left">① COL1 인덱스에서 'ABC'인 첫번째 로우와 COL2 인덱스에서 123인 첫번째 로우를 찾는다.</p>
<p align="left">② ROWID를 비교하여&nbsp; 값이 적은쪽(왼쪽)의 값(15)을 기준으로 커질때까지 우측과 비교한다.</p>
<p align="left">③ 우측의 32를 기준으로 비교값보다 커질때까지 좌측을 비교한다. 같으면 액세스 한다.</p>
<p align="left">④ 67을 기준으로 67보다 큰 값이 나올때까지 스캔</p>
<p align="left">⑤ 68을 기준으로 스캔하려 했더니 'ABC'가 아니므로 머지를 중단한다.</p>
<p align="left">&nbsp;</p>
<p align="left">■ 종합</p>
<p align="left">- 위 방법은 테이블 액세스를 일으키기 전에 인덱스간에 머지를&nbsp; 통해 처리범위를 최대한 줄여 액세스 한다.</p>
<p align="left">- 인덱스 머지는 머지할 대상이 서로 비슷한 분포도를 가지고 있을 때 유리</p>
<p align="left">- 옵티마이져는 차이가 많이 나는 인덱스간에는 인덱스 머지를 선택하지 않는다.</p></blockquote>
<p><br />&nbsp;</p>
<blockquote class="q7">
<p>■ 인덱스 머지와 결합 인덱스 차이</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p align="center"><img style="WIDTH: 577px; HEIGHT: 344px" alt="1.4.2.jpg" src="files/attach/images/6534/794/007/1.4.2.jpg" width="760" height="490" editor_component="image_link"/></p></td></tr></tbody></table>
<p></p>
<p align="center">그림 1 - 4 - 2</p>
<p>&nbsp;</p>
<p>&nbsp;■ 비교 설명</p>
<p>&nbsp;</p>
<p>● 인덱스 머지는 두 개의 인덱스를 같은 ROWID로 머지 =&gt; <span style="COLOR: #3a32c3"><span style="COLOR: #000000">머지를 수행한 양과 머지에 성공한 양에 차이 발생</span>&nbsp;=&gt;&nbsp;불필요한 일을 함</span></p>
<p>&nbsp;</p>
<p>● 결합 인덱스는 각 인덱스 컬럼 값들과 ROWID로 정렬되어 있다.</p>
<p>● 결합 인덱스는 이미 머지된 결과에서 찾는다.</p>
<p>&nbsp;</p></blockquote>
<p><br />&nbsp;</p>
<p><strong>4.1.4. 결합 인덱스의 특징</strong></p>
<ul dir="ltr">
<li>
<div style="MARGIN-RIGHT: 0px">결합 인덱스의 첫 번째 컬럼이 조건절에 없다면 인덱스는 사용되지 않는다.</div></li>
<li>
<div style="MARGIN-RIGHT: 0px">컬럼 중 일부만 조건을 받거나 '='이 아닌 연산자가 많으면 처리범위 증가 =&gt; 효율이 크게 저하</div></li></ul>
<p>&nbsp;</p>
<p>가) 분포도와 결합순서의 상관관계</p>
<p align="left">&nbsp;</p>
<blockquote class="q7">
<p align="left">■ SQL 예)</p>
<blockquote class="q4">
<p align="left">SELECT&nbsp; *</p>
<p align="left">FROM&nbsp; TAB1&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff"> </span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX1&nbsp; <span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">:&nbsp; </span></span></span><span style="BACKGROUND-COLOR: #333333; COLOR: #ffff00"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">COL1&nbsp; +&nbsp; COL2</span></span></p>
<p align="left">WHERE&nbsp; COL1&nbsp; =&nbsp; 'A'&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; <span style="BACKGROUND-COLOR: #8e8e8e; COLOR: #ffffff"><span style="BACKGROUND-COLOR: #9334d8; COLOR: #ffffff">INDEX2&nbsp; :&nbsp; COL2&nbsp; +&nbsp; COL1</span></span></p>
<p align="left">AND&nbsp; COL2&nbsp; =&nbsp; 115;</p></blockquote>
<p><br /></p>
<p align="left"></p>
<table style="BACKGROUND: #a6cf00" cellspacing="1" align="center">
<tbody>
<tr style="BACKGROUND: #ffffff">
<td>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&lt; 분포도가 좋지 않은 컬럼이 선행 &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; &lt; 분포도가 좋은 컬럼이 선행 &gt;</strong></p>
<p><img style="WIDTH: 591px; HEIGHT: 350px" alt="1.4.3.jpg" src="files/attach/images/6534/794/007/1.4.3.jpg" width="879" height="572" editor_component="image_link"/></p>
<p>&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p>&nbsp;</p>
<p align="left">위 그림은 '분포도와 결합 순서'가 비교 연산자를 모두 '='로 사용했을 때 어떤 상관 관계를 가지고 있는 지를</p>
<p align="left">알아보기 위한 그림이다.</p>
<p align="left">&nbsp;</p>
<p align="center"><strong><span style="COLOR: #ff0000">결론) 분포도는 순서에 별다른 영향을 미치지 않는다</span></strong></p></td></tr></tbody></table>
<p></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p></blockquote>
<p><br /></p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center">&nbsp;</p>
<p align="center">그림 1-4-3</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 702px; HEIGHT: 472px" alt="1.4.4.jpg" src="files/attach/images/6534/794/007/1.4.4.jpg" width="845" height="606" editor_component="image_link"/></p>
<p align="left"></p>
<p align="left">&nbsp;그림 1-4-4</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 712px; HEIGHT: 429px" alt="1.4.5.jpg" src="files/attach/images/6534/794/007/1.4.5.jpg" width="869" height="607" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-5</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="center"><img style="WIDTH: 725px; HEIGHT: 218px" alt="1.4.6.jpg" src="files/attach/images/6534/794/007/1.4.6.jpg" width="873" height="391" editor_component="image_link"/></p>
<p align="left"></p>
<p align="center">&nbsp;그림 1-4-6</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp; </p>
<p align="left">&nbsp;</p>
<p align="left">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>4.1.5. 결합 인덱스의 컬럼순서 결정 기준</strong></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
노랑배 2010.11.22 23:29:30