[ Oracle. 실행계획 - SORT ]

 

1. sort 종류

    - 명시적 sort, 암시적 sort

 

2. Sort 수행위치에 따른 구분

    1. Memory Sort

        - Memory내에서 Sort작업이 전부 이루어 지는 경우

    2. Disk Sort

        - 메모리 부족시 Disk영역을 빌려 Sort가 수행되는 경우. 속도가 느림

 

2. 명시적 Sort 예제

    . sql>SELECT deptno, ename, sal
              FROM emp_large
             ORDER BY deptno, sal desc;

    . 실행계획

         

 

3. 암시적 Sort 예제

    . distinct에 의한 암시적 Sort

       - SELECT DISTINCT job FROM emp_large;

       - 9i 실행계획

          ; 대상 데이터를 job 컬럼을 기준으로 정렬 연산 수행한 후

            해당 데이터를 처음부터 마지막까지 읽어 내려 가면서 중복 걸랜 후

            결과를 리턴하기 때문

         

 

       - 10g 실행계획

          ; Distinct연산에 의한 Unique값을 찾기 위해 Hash연산을 사용

            정렬된 결과를 나타내지는 않지만 Sort보다 가벼운 연산

         

       - 9i 와 10g의 Distinct에 의한 Unique값을 찾는 비용은

          약 : 70% : 3% 이다.

 

4. 암시적 - Sort Merge Join

       -   sql>SELECT /*+ USER_MERGE(emp_large, depart) */
                               dname, ename, job_sal
                      FROM emp_large a, depart
                    WHERE a.dept_no = b.dept_no * 1;

          ; depart.dept_no 컬럼의 인텍스를 사용하지 못하게 하여 Sort연산을 실행하도록 함

       - 실행계획

          ;

         

 

5. SORT(AGGREGATE)  ~ 그룹행 연산 (실제적으로 SORT가 발생하는 것 아님)

     - sql > SELECT count(*)                 FROM emp_large WHERE ename like 'A%';

                SELECT max(sql), min(sal)  FROM emp_large;

                SELECT avg(sal)                  FROM emp_large;

     - 실행계획

        ; Count나 Sum, Avg와 같은 그룹행 연산에서 결과 집합을 집계(Aggreagte)연산을

          수행했다는 의미

        ; 실제적인 Sort를 하지는 않음

        ; 비용이 발생하지 않은 Operation은 실제수행된것은 아니고 개념적인 수행임

     

 

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

** 집합연산

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

1. 집합연산 종류

    1. UNION ALL

    2. UNION (합집합)

    3. INTERSECT (교집합)

    4. MINUS (차집합)

    -  UNION, INTERSECT, MINUS는 두 집한간에 공통된 요소를 찾아야 함

 

2. UNION ALL

    - sql > SELECT deptno FROM depart

               UNION ALL

               SELECT deptno FROM emp_large;

    - 실행계획

       ; depart 테이블에서 index가 존재하는 deptno컬럼 1개만 필요하므로

          INDEX FULL SCAN이 수행 됐음

         즉, 인덱스내에 필요한 모든 컬럼이 있으므로 인덱스에만 접근.

     

 

3. UNION

    - sql > SELECT deptno FROM depart

               UNION

               SELECT deptno FROM emp_large;

    - 실행계획

       ; UNION에서 중복된 값을 걸러내기 위해 SORT연산을 수행

       ; TempSpcace : 10g부터 추가

                                 SORT를 하기 위해 6280k의 공간이 필요하다는 의미

       ; 비용 (Cost) = CPU Cost + IO Cost

         : 633 의 비용 시 CPU Cost비중 2%

           (즉, Full Table Scan은 IO 집중(Intensive)적인 작업 이라는 의미)

       ; Memory Sort만 발생했음

          . CPU Cost가 100%라는 의미는 I/O Cost가 발생하지 않았다는 의미임

      

       ; 위 sql문장 수행전에  sql>SET AUTOTRACE TRACEONLY 하에서 다시 실행해보면

        

 

4. INTERSECT

    - sql > SELECT deptno FROM depart

               INTERSECT

               SELECT deptno FROM emp_large;

    - 실행계획

       ; depart는 Index Full scan이므로 NOSORT를 하고

         emp_large는 Table Access Full Scan이므로 Sort Unique Scan을 함

         그런 후 INTERSECTION을 의미상으로 수행

          (SORT UNIQUE : Unique값을 찾기 위해 Sort연산을 수행한다는 의미)

      

5. MINUS

    - sql > SELECT deptno FROM depart

               MINUS

               SELECT deptno FROM emp_large;

    - 실행계획

       ; 

      

Posted by 농부지기
,