Oracle Hint, Tuning 실행계획 SQL 연산 (NESTED LOOP SEMI-JOIN, INDEX RANGE SCAN)
Oracle Hint, Tuning_ 실행계획 SQL 연산 3.6 실행계획 SQL 연산 : NESTED LOOP SEMI-JOIN 서브쿼리가 조인으로 풀려 세미조인이 되는데, 중첩루프처럼 풀리는 것 -- 중첩루프 조인과 유사하게 처리되는데 메인쿼리에서 한건 추출후 DEPTNO를 서브쿼리로 상수값 처리하여 넣 어 주어 서브쿼리가 실행되어 최종적으로 결과를 도출하는 구조이며 이때 서브쿼리는 확인자 역할을 한다. SQL> SELECT count(ENAME) FROM MYEMP1 E WHERE EXISTS ( SELECT /*+ NL_SJ */ 1 FROM MYEMP1_OLD EO WHERE E.EMPNO = EO.EMPNO); COUNT(ENAME) ---------------- 5000001 경 과: 00:00:3.08
Oracle Hint, Tuning_ 실행계획 SQL 연산 Execution Plan -------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 18 | 29G (1)|999:59:59 | | 1 | SORT AGGREGATE | | 1 | 18 | | | | 2 | NESTED LOOPS SEMI | | 5000K| 85M| 29G (1)|999:59:59 | | 3 | TABLE ACCESS FULL | MYEMP1 | 10M| 152M| 21169 (1)| 00:04:15 | |* 4 | TABLE ACCESS FULL | MYEMP1_OLD | 833K| 1627K| 2927 (1)| 00:00:36 | -------------------------------------------------------------------------------------------------
Oracle Hint, Tuning_ 실행계획 SQL 연산 실행계획 SQL 연산 : INDEX RANGE SCAN WHERE절에 인덱스 구성 컬럼이 ‘<’ or ‘>’와 같이 범위 제한 연산자에 의해 이용되 거나 BETWEEN or LIKE와 같은 조건 절에 이용될 때 INDEX RANGE SCAN을 하게 된 다. 만약 결합(복합) 인덱스라면 범위 제한자에 사용되는 컬럼은 인덱스 구성 컬럼 중 선두 컬럼이여야 한다. 조건을 만족하는 첫 번째 레코드를 인덱스 블록에서 추출 후 조건에 맞는 데이터가 나올 때 까지 계속 스캔하는 나가는 방식으로 INDEX, INDEX_ASC 힌트를 사용할 때 나타나는 연산자이다. 아래 예에서 EMP TABLE에는 sal에 대해 오름차순 순방향 인덱스가 구성되어 있다. (Index Range Scan이 가능하도록 하는 힌트는 INDEX_RS 이다.)
Oracle Hint, Tuning_ 실행계획 SQL 연산 SQL>SELECT ENAME, SAL FROM EMP WHERE SAL > 2000; Execution Plan -------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF ‘EMP’ 2 1 INDEX (RANGE SCAN) OF ‘idx_emp_sal’ (NON-UNIQUE) SQL> SELECT /*+ index_rs(emp idx_emp_sal) */ ename, sal FROM emp WHERE sal > 2000; -- 참고로 위와 같이 인덱스를 경유하여 나온 데이터는 SAL 칼럼 값으로 오름차순으로 정렬되어 있음을 확인 할 수 있다. 특정 컬럼에 대해 인덱스가 구성되어 있다면 인덱스 생성할 때 내림차순이라고 명시하지 않으면 칼럼 값 에 대해 오름차순으로 인덱스가 구성되므로 인덱스를 경유하게 되면 자동으로 오름차순 형태로 데이터가 추출된 다.

3.6 실행계획 SQL 연산 (NESTED LOOP SEMI-JOIN)

  • 1.
    Oracle Hint, Tuning 실행계획SQL 연산 (NESTED LOOP SEMI-JOIN, INDEX RANGE SCAN)
  • 2.
    Oracle Hint, Tuning_실행계획 SQL 연산 3.6 실행계획 SQL 연산 : NESTED LOOP SEMI-JOIN 서브쿼리가 조인으로 풀려 세미조인이 되는데, 중첩루프처럼 풀리는 것 -- 중첩루프 조인과 유사하게 처리되는데 메인쿼리에서 한건 추출후 DEPTNO를 서브쿼리로 상수값 처리하여 넣 어 주어 서브쿼리가 실행되어 최종적으로 결과를 도출하는 구조이며 이때 서브쿼리는 확인자 역할을 한다. SQL> SELECT count(ENAME) FROM MYEMP1 E WHERE EXISTS ( SELECT /*+ NL_SJ */ 1 FROM MYEMP1_OLD EO WHERE E.EMPNO = EO.EMPNO); COUNT(ENAME) ---------------- 5000001 경 과: 00:00:3.08
  • 3.
    Oracle Hint, Tuning_실행계획 SQL 연산 Execution Plan -------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 18 | 29G (1)|999:59:59 | | 1 | SORT AGGREGATE | | 1 | 18 | | | | 2 | NESTED LOOPS SEMI | | 5000K| 85M| 29G (1)|999:59:59 | | 3 | TABLE ACCESS FULL | MYEMP1 | 10M| 152M| 21169 (1)| 00:04:15 | |* 4 | TABLE ACCESS FULL | MYEMP1_OLD | 833K| 1627K| 2927 (1)| 00:00:36 | -------------------------------------------------------------------------------------------------
  • 4.
    Oracle Hint, Tuning_실행계획 SQL 연산 실행계획 SQL 연산 : INDEX RANGE SCAN WHERE절에 인덱스 구성 컬럼이 ‘<’ or ‘>’와 같이 범위 제한 연산자에 의해 이용되 거나 BETWEEN or LIKE와 같은 조건 절에 이용될 때 INDEX RANGE SCAN을 하게 된 다. 만약 결합(복합) 인덱스라면 범위 제한자에 사용되는 컬럼은 인덱스 구성 컬럼 중 선두 컬럼이여야 한다. 조건을 만족하는 첫 번째 레코드를 인덱스 블록에서 추출 후 조건에 맞는 데이터가 나올 때 까지 계속 스캔하는 나가는 방식으로 INDEX, INDEX_ASC 힌트를 사용할 때 나타나는 연산자이다. 아래 예에서 EMP TABLE에는 sal에 대해 오름차순 순방향 인덱스가 구성되어 있다. (Index Range Scan이 가능하도록 하는 힌트는 INDEX_RS 이다.)
  • 5.
    Oracle Hint, Tuning_실행계획 SQL 연산 SQL>SELECT ENAME, SAL FROM EMP WHERE SAL > 2000; Execution Plan -------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF ‘EMP’ 2 1 INDEX (RANGE SCAN) OF ‘idx_emp_sal’ (NON-UNIQUE) SQL> SELECT /*+ index_rs(emp idx_emp_sal) */ ename, sal FROM emp WHERE sal > 2000; -- 참고로 위와 같이 인덱스를 경유하여 나온 데이터는 SAL 칼럼 값으로 오름차순으로 정렬되어 있음을 확인 할 수 있다. 특정 컬럼에 대해 인덱스가 구성되어 있다면 인덱스 생성할 때 내림차순이라고 명시하지 않으면 칼럼 값 에 대해 오름차순으로 인덱스가 구성되므로 인덱스를 경유하게 되면 자동으로 오름차순 형태로 데이터가 추출된 다.