메뉴 건너뛰기

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 진행기록 운영자 2011.08.23 3552
34 2.3.조인 종류별 특징 및 활용방안 (3/4) (2.3.4~2.3.5) 실천하자 2010.12.08 15346
33 1.4. 부분범위처리로의 유도(1/2) (1.4.9) 실천하자 2010.12.08 14430
32 2.3.4. 해쉬(Hash) 조인 / 2.3.5. 세미(Semi) 조인 pranludi 2010.12.05 8607
31 2.1.조인과 반복연결(loop query)의 비교 pranludi 2010.12.05 11447
30 제2장. 조인의 최적화 방안 pranludi 2010.12.05 6575
29 1.4.9. 웹 게시판에서의 부분범위 처리 pranludi 2010.12.05 6775
28 2.3.조인 종류별 특징 및 활용방안 (1/4) (2.3.1) file 노랑배 2010.12.04 9477
27 2.3.조인 종류별 특징 및 활용방안 (2/4) (2.3.2~2.3.3) file 실천하자 2010.12.03 12561
26 2.2.연결고리 상태가 조인에 미치는 영향 file 노랑배 2010.12.03 9151
25 제1장. 부분범위처리(Partial range scan) file supersally 2010.12.01 12321
24 1.4. 부분범위처리로의 유도(1/2) (1.4.1 ~ 1.4.8) file 실천하자 2010.11.26 19346
23 4.2. 클러스터링 형태의 결정 기준 file pranludi 2010.11.26 8446
22 4.1. 인덱스의 선정 기준 (2/2) (4.1.6.) [1] file 실천하자 2010.11.15 16804
21 제4장. 인덱스 수립 전략 노랑배 2010.11.13 7768
20 4.1. 인덱스의 선정 기준 (1/2) (4.1.1.~4.1.5.) [2] file 노랑배 2010.11.13 23370
19 3.2.5. 기타 특수한 목적을 처리하는 실행계획 pranludi 2010.11.09 11332
18 3.3. 실행계획의 제어 file supersally 2010.11.08 11134
17 3.2.4. 비트맵(Bitmap) 실행계획 file 실천하자 2010.11.08 12836
16 3.2 실행계획의 유형 pranludi 2010.10.19 4929