3.2.3. 연산방식에 따른 실행계획

\- 실행계획은 우리가 사용한 연산방식에 따라서 다양하게 나타날수있다.

3.2.3.1. In-List 탐침(Iterator) 실행계획

\- 'IN'을 사용한 경우는 실행계획에 큰 영향을 미칠 수 있다.
\- 'BETWEEN'은 선분을 의미하지만, 'IN'은 여러개의 점을 의미한다.
\- 선분 개념은 Range Scan을 하게 되지만, 점의 개념은 '='을 사용할 수 있다.
\- (예) 실행계획
'INLIST ITERATOR'아래에 있는 처리를 IN조건에 나열된 각각의 비교값만큼 반복수행한다. IN대신 OR을 사용해도 동일한데, 그 이유는 옵티마이저가 'IN'연산을 'OR'형태로 변경시킨 후 실행계획을 수립하기 때문이다.
\- 'INDEX(table_alias index_name)힌트를 적용하여 IN조건을 사용한 컬럼이 속한 인덱스를 사용하도록 할수 있으나, 적용여부는 옵티마이저가 결정한다.

h4.

3.2.3.2. 연쇄(Concatenation) 실행계획

\-'OR'로 연결된 서로 다른 컬럼을 사용한 조건을 별도의 실행단위로 분리하여 가각의 최적의 액세스 경로를 수립하여 이를 연결하는 실행계획
\- 항상 이런 실행계획이 나타나는 것은 아니며, 'OR'조건이 처리주관 조건의 역할을 하는 경우에만 그렇게 실행되며, 아닌경우 단순히 체크조건으로만 사용된다.
\- 'USE_CONCAT'으로 유도가능, 'NO_EXPAND'적용 불가능하게 할 수 있음.
\- 'OR'조건은 주어진 상황에 따라사 연결 실행계획이 유리할 수도, 불리할 수도 있으므로 가능하다면 실행계획을 확인해보고, 함부로 힌트를 적용하지 않는것이 바람직 하다.
\* 이런경우는 적용하지 않는 것이 바람직\*
\- 조인의 연결고리가 'OR"조건을 가질 때 조인의 상대방이 넓은 처리범위를 가질 때
\- 동일 컬럼의 'OR'조건: 이때는 IN-LIst탐침이 유리하다.
\- 보다 효율적으로 처리범위를 줄일 수 있는 다른 얙세스 경로가 있을때
\- 'OR'조건들 중에서 너무 넓은 처리범위를 가진 것들이 존재할 때

h4.

3.2.3.3. 원격(Remote) 실행계획

\- 다른 데이터베이서 테이블을 DC Link로 엑세스하는 형태.
\- 원격 테이블의 상세한 실행계획은 나타나지 않으므로, 어떤 방법으로 액세스했는지 알 수 없다.
\- 원격테이블이 실행계획에 부담이 많은 내측루프에서 수행되면 큰 부담이 된다. 원격테이블 액세스는 랜덤이 아닌 범위처리에는 부담이 적으므로 이와 같은 경우에는 Sort Merge나 해쉬조인으로 나타나는 경우가 많음.
\- 논리적으로 가장 이상적인 방법은, 먼저 원격에서 두 테이블을 조인하고 그 결과를 로컬에서 받는 방법이다.
이렇게 처리되도록 하려면, 원격에 미리 조인된 뷰를 만드는 방법이 있다.
\- 항상 실행계획을 확인하는 습관을 가질것.

h4.

3.2.3.4. 정렬처리(Sort Operation)실행계획

\- 엑세스된 데이터는 사용자의 요구를 충족시키기 위해 다양한 가공을 하게 되며, 이러한 가공에는 상당부분 정렬이 필요한 경우가 많다.
\- 정렬형태별로 처리방법에 차이가 있으며, 발생하는 부하의 정도도 다르다.
{+}SORT(UNIQUE)+
\- DISTINCT함수를 사용했을 때
\- 서브쿼리에서 제공자 역할을 할때
{+}SORT(AGGREGATE)+
GROUP BY를 하지 않은 상태에서 전체 대상에 대해 그룹함수로 계산할 때
{+}SORT(GROUP BY)+
GROUP BY를 사용하여 여러개의 다른 그룹으로 집결을 수행할 때 발생되며, 그룹의 개수가 많을수록 부담이 커진다.
이러한 문제를 해결하기위해, GROUP BY를 해쉬를 이용해서 처리할 수도 있다. SORT(GROUP BY NOSORT)

3.2.3.5. 집합처리(Set Operation)실행계획

{+}합집합(Union, Union All) 실행계획{+}
UNION은 최소 공배수 집합을 구해야 하므로, 추가로 SORT(UNIQUE)를 수행해야 하고, UNION ALL은 그런 처리가 필요하지 않다.

{+}교집합(Intersection) 실행계획{+}
교집합은 양쪽집합 모두에 속하는 공통집합의 의미한다. 이를 구하기 위해서는 먼저 각각의 집합에서 유일한 집합을 구해야 하낟.
마치 Sort Merge조인과 유사한 방법을 사용하여 양쪽집합을 유일하게 정렬한 다음 머지한다.

{+}차집합(Minus) 실행계획{+}
이 작업은 머지작업과 유사한 형태로 처리되며, 어느 한쪽을 기준으로 다른 쪽에 존재하면 제거하는 형식으로 선별하는 처리가 될 것이다.
집합연산에서 만약 SELECT-List의 컬럼이 그 테이블의 기본키였다면 논리적으로 유일성이 보장되지만 그래도 SORT(UNIQUE)은 발생된다. 물론 WHERE절에 부여된 조건이 기본키를 =로 엑세스한 경우는 SORT(UNIQUE)이 발생되지 않는다.

3.2.3.6. COUNT(STOPKEY)실행계획

\- 쿼리의 조건절에 ROWNUM을 사용했을 때 나타난다.
\- 이 컬럼은 가상컬럼으로 ROWNUM을 잘 활용하면 내부적인 진행단계를 제어할 수도 있다.