메뉴 건너뛰기

bysql.net

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

2010.10.18 18:24

노랑배 조회 수:10897

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

  1. IN-List 탐침 실행계획
  2. 연쇄(Concatenation) 실행계획
  3. 원격(Remote) 실행계획
  4. 정렬 처리(Sort Operation)
  5. 합집합 (Union, Union-All) 실행계획
  6. 교집합(Intersection) 실행계획
  7. 차집합(Minux) 실행계획
  8. COUNT(STOPKEY) 실행계획

 

 

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

  • IN-LIST ITERATOR의 특징
    • 옵티마이져가 'IN' 연산을 'OR' 형태로 변형 후 실행한다.
      예) COL1 IN (1,2) AND COL2 =10  ☞  (COL1=1 AND COL2=10) OR (COL1=2 AND COL2=10)
    • 'IN'을 사용했더라도 비교값이 하나만 있는 경우에는 INLIST ITERATOR 실행계획은 나타나지 않는다.

◆ SQL 예

SELECT order_id, order_type, order_amount

FROM orders

WHERE order_type IN (1,2,3);

 

Execution Plan

-------------------------------------------------------------------------------------------

SELECT STATEMENT

   INLIST ITERATOR  => IN 연산이 OR로 실행 / 결합 인덱서의 처리범위를 효율적으로 처리 / 비교값 만큼 반복 수행

      TABLE ACCESS (BY INDEX ROWID) OF 'ORDERS'

         INDEX (RANGE SCAN) OF 'ORDERS_IDX1' (NON-UNIQUE)

 

  • 'INLIST ITERATOR'   ☞   IN 조건의 비교값 만큼 반복 수행을 의미


 

 

 3.2.3.2 연쇄(Concatenation) 실행계획

  • 'OR' 조건을 별도의 실행단위로 분리하여 액세스 경로를 수립하여 이를 연결하는 실행계획
  • 'OR' 조건이 처리주관 조건의 역할을 하는 경우

 

  • 1개의 테이블에 OR 조건이 있을 경우의 실행계획

 CONCATENATION
   TABLE ACCESS (BY INDEX ROWID) OF 'TABLE1'
      INDEX (RANGE SCAN) OF 'B_IDX' (NON-UNIQUE)
   TABLE ACCESS (BY INDEX ROWID) OF 'TABLE1'
      INDEX (RANGE SCAN) OF 'A_IDX' (NON-UNIQUE)

  • 실행계획 예

SQL문 예

SELECT o.header_id, i.line_id, i.revenue_amount
FROM order_item i, orders o
WHERE i.item_group = :b1
   AND (o.s_order_id=i.order_id

      OR o.m_order_id=i.order_id);

 

  • 실행계획 예 1 : USE_CONCAT 힌트를 사용한 경우

Execution Plan

-------------------------------------------------------------------------------------------

SELECT STATEMENT
  CONCATENATION
    NESTED LOOPS
      TABLE ACCESS (BY INDEX ROWID) OF 'ORDER_ITEM'
        INDEX (RANGE SCAN) OF 'ORDER_ITEM_IDX1' (NON-UNIQUE)
      TABLE ACCESS (BY INDEX ROWID) OF 'ORDERS'
        INDEX (UNIQUE SCAN) OF 'ORDER_PK' (UNIQUE)
    NESTED LOOPS
      TABLE ACCESS (BY INDEX ROWID) OF 'ORDER_ITEM'
        INDEX (RANGE SCAN) OF 'ORDER_ITEM_IDX1' (NON-UNIQUE)
      TABLE ACCESS (BY INDEX ROWID) OF 'ORDERS'
        INDEX (UNIQUE SCAN) OF 'ORDER_U1' (UNIQUE)

  • 실행계획 예 2 : NO_EXPAND 힌트를 사용한 경우

Execution Plan

-------------------------------------------------------------------------------------------

SELECT STATEMENT
  HASH JOIN
    TABLE ACCESS (BY INDEX ROWID) OF 'ORDER_ITEM'
      INDEX (RANGE SCAN) OF 'ORDER_ITEM_IDX1' (NON-UNIQUE)
    TABLE ACCESS (FULL) OF 'ORDERS'

 

 

  • 연쇄(CONCATENATION) 적용하지 말아야 할 경우
    1. 조인의 연결고리가 'OR' 조건을 가질 때 조인의 상대방이 넓은 처리범위를 가질 때
    2. 동일 컬럼의 'OR' 조건 : 이때는 IN-List 탐침이 유리하기 때문이다
    3. 보다 효율적으로 처리범위를 줄일 수 있는 다른 액세스 경로가 있을 때
    4. 'OR' 조건들 중에서 너무 넓은 처리범위를 가진 것들이 존재할 때

 

 

 3.2.3.3 원격(Remote) 실행계획

  • 분산되어 있는 다른 데이터베이스의 테이블을 링크를 통한 액세스
  • 물리적 : 다른 데이터베이스  /  논리적 : 같은 데이터베이스로 인식
  • 원격 실행계획에서 옵티마이져 성향
    • 원격 테이블의 실행계획은 나타내지 않음 (라이브러리 캐시를 통해 얻을 수 있음)

◆ SQL 예

SELECT c.customer_name, count(*)
FROM customers c, orders@crm_db o
WHERE c.cust_id = o.cust_id

  AND o.order_number = :b1
GROUP BY c.customer_name;

 

Execution Plan

-------------------------------------------------------------------------------------------
SELECT STATEMENT
  SORT(GROUP BY)
    NESTED LOOPS
      REMOTE
        TABLE ACCESS (BY INDEX ROWID) OF 'CUSTOMERS'
          INDEX (RANGE SCAN) OF 'CUSTOMERS_PK' (UNIQUE)

-------------------------------------------------------------------------------------------
SELECT "ORDER_NUMBER", "CUST_ID"

FROM "ORDERS" "O"

WHERE "ORDER_NUMBER"=:"SYS_B_0";

 

원격 테이블이 선행 집합이 되어 외측 루프를 수행하고 로컬 테이블이 내측 루프를 수행하고 있다.


 

 

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

  • 정렬작업의 종류
    1. SORT (UNIQUE)
    2. SORT (AGGREGATE)
    3. SORT (GROUP BY)
    4. SORT (JOIN)
    5. SORT (ORDER BY)

 

1. SORT (UNIQUE)
설명 : 추출된 로우에 대하여 유일한 집합을 생성하는 작업

 

  • SORT (UNIQUE) 정렬이 일어나는 경우
    • DISTINCT 함수를 사용했을 때
    • 서브쿼리에서 제공자 역할을 할 때

2. SORT (AGGREGATE)

  • GROUP BY를 하지 않은 상태에서 전체 대상에 대해 그룹함수로 계산을 할 때 나타난다.
    (그룹함수 : SUM, COUNT, MIN, MAX, AVG)
  • 일반적인 정렬을 하지 않는다.
  •  

3. SORT (GROUP BY)

  • GROUP BY 구문에 의해 정렬을 수행한다.
  • 데이터 용량이 많을 경우 정렬 작업에 부담이 생김   ☞  'HASH(GROUP BY)' 사용
    (해쉬는 대용량 처리시 정렬보다 유리하다)
  • 인덱스와 키값이 동일할 경우 정렬이 필요 없다.  ☞  실행계획에 SORT(GROUP BY NOSORT) 나타남

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

  1. 합집합(Union, Union-All)
  2. 교집합(Intersection)
  3. 차집합(Minus)

 

  • 합집합(Union, Union All) 실행계획
    • 서로 다른 쿼리에서 처리한 결과를 다시 모음

◆ SQL 예

SELECT order_id, order_date, status
FROM orders
WHERE order_date > :b1

   OR order_id IN (SELECT order_id

                          FROM order_item
                          WHERE item_group='A001');

 

Execution Plan

-------------------------------------------------------------------------------------------

SELECT STATEMENT
FILTER
TABLE ACCESS (FULL) OF 'ORDERS'
TABLE ACCESS (BY INDEX ROWID) OF 'ORDER_ITEM'
    INDEX (RANGE SCAN) OF 'ODER_ITEM_IDX2' (NON-UNIQUE)

 

◆ UNION 연산자를 사용하여 개선한 경우

SELECT order_id, order_date, status
FROM orders
WHERE order_date > :b1

UNION

SELECT order_id, order_date, status

FROM order_item

WHERE order_id IN (SELECt order_id

                             FROM  order_item

                             WHERE item_group = 'A001');

 

Execution Plan

-------------------------------------------------------------------------------------------

SELECT STATEMENT
  SORT(UNIQUE)
    UNION-ALL
      TABLE ACCESS (BY INDEX ROWID) OF orders
        INDEX (RANGE SCAN) OF order_index
      NESTED LOOPS
        VIEW
          SORT(UNIQUE)
            TABLE ACCESS (BY INDEX ROWID) OF order_item
              INDEX (RANGE SCAN) OF order_item_index (NON-UNIQUE)
        TABLE ACCESS (BY INDEX ROWID) OF orders
          INDEX (UNIQUE SCAN) OF order_pk_index (UNIQUE)

 

  •  교집합(Intersection) 실행계획
    • 양쪽 집합 모두에 속하는 공통집합을 구한다.(최대 공약수 집합)

◆ SQL 예

SELECT resist_no FROM employees WHERE dept_no = :b1
INTERSECT
SELECT social_no FROM billboard WHERE cre_date = :b2

 

Execution Plan

-------------------------------------------------------------------------------------------
SELECT STATEMENT
  INTERSECTION
    SORT (UNIQUE)
      TABLE ACCESS (BY INDEX ROWID) OF employees
        INDEX (RANGE SCAN) OF employee_index(NON-UNIQUE)     => 유일하게 정렬
    SORT (UNIQUE)
      TABLE ACCESS (BY INDEX ROWID) OF billboard
        INDEX (RANGE SCAN) OF billboard_index(NON-UNIQUE)       => 유일하게 정렬

 

  • 차집합(Minus) 실행계획
    • 한쪽의 집합을 기준으로 다른 집합의 요소들을 제거

◆ SQL 예

SELECT resist_noFROM employees WHERE dept_no = :b1
MINUS
SELECT social_noFROM billboard WHERE cre_date = :b2

 

Execution Plan

-------------------------------------------------------------------------------------------
SELECT STATEMENT
  MINUS
    SORT (UNIQUE)
      TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES'
        INDEX (RANGE SCAN) OF 'EMPLOYEES_IDX2' (NON-UNIQUE)    =>   유일하게 정렬
    SORT (UNIQUE)
      TABLE ACCESS (BY INDEX ROWID) OF 'BILLBOARD'
        INDEX (RANGE SCAN) OF 'BILLBOARD_IDX1' (NON-UNIQUE)    =>  유일하게 정렬


 

3.2.3.6. COUNT(STOPKEY) 실행계획

  • 조건절에 ROWNUM을 사용했을 경우 발생

 

ROWNUM은 가상 컬럼이라 부르며 테이블에 존재하지 않고 DBMS가 제공한 컬럼이다

가상 컬럼 : SYSDATE, USER, ROWID, LEVEL(CONNECT BY 사용시)


 

◆ SQL 예

SELECT *
FROM orders
WHERE order_date = :b1

    AND acc_deptno = :b2

    AND ROWNUM <= 20;

Execution Plan

-------------------------------------------------------------------------------------------
SELECT STATEMENT
  COUNT (STOPKEY)
    TABLE ACCESS (BY INDEX ROWID) OF 'ORDERS'
      INDEX (RANGE SCAN) OF 'ORDER_IDX2' (NON-UNIQUE)


 

번호 제목 글쓴이 날짜 조회 수
35 Front Page file 운영자 2010.09.06 164252
34 3.1. SQL과 옵티마이져 (3/3) (3.1.3 ~ 3.1.5) [2] file 실천하자 2010.10.08 26956
33 4.1. 인덱스의 선정 기준 (1/2) (4.1.1.~4.1.5.) [2] file 노랑배 2010.11.13 23370
32 2.2. 비트맵(Bitmap) 인덱스 file 실천하자 2010.10.04 20927
31 1.4. 부분범위처리로의 유도(1/2) (1.4.1 ~ 1.4.8) file 실천하자 2010.11.26 19346
30 2.3. 함수기반 인덱스(FBI, Function-Based Index) pranludi 2010.10.01 18679
29 4.1. 인덱스의 선정 기준 (2/2) (4.1.6.) [1] file 실천하자 2010.11.15 16804
28 2.3.조인 종류별 특징 및 활용방안 (3/4) (2.3.4~2.3.5) 실천하자 2010.12.08 15346
27 1.4. 부분범위처리로의 유도(1/2) (1.4.9) 실천하자 2010.12.08 14430
26 1.1. 테이블과 인덱스의 분리형 file 실천하자 2010.09.13 13905
25 3.1. SQL과 옵티마이져 (2/3) (3.1.2.3 ~ 3.1.2.5) 노랑배 2010.10.06 13722
24 2.1. B-tree 인덱스 file 김진희 2010.10.04 13018
23 3.2.4. 비트맵(Bitmap) 실행계획 file 실천하자 2010.11.08 12833
22 2.3.조인 종류별 특징 및 활용방안 (2/4) (2.3.2~2.3.3) file 실천하자 2010.12.03 12561
21 제1장. 부분범위처리(Partial range scan) file supersally 2010.12.01 12321
20 2.1.조인과 반복연결(loop query)의 비교 pranludi 2010.12.05 11447
19 3.2.5. 기타 특수한 목적을 처리하는 실행계획 pranludi 2010.11.09 11332
18 3.3. 실행계획의 제어 file supersally 2010.11.08 11134
17 3.2.1. 스캔(Scan)의 기본유형 [1] pranludi 2010.10.19 11072
» 3.2.3. 연산 방식에 따른 실행계획 노랑배 2010.10.18 10897