SQL Operation #

순서
  1. SORT(AGGREGATE)[1]
  2. AND-EQUAL[2]
  3. CONCATENATION[3]
  4. COUNT(STOPKEY)[4]
  5. FILTER[5]
  6. INDEX (UNIQUE || RANGE-SCAN)[6]
  7. MERGE JOIN[7]
  8. NESTED LOOPS[8]
  9. SORT (UNIQUE || GROUP BY || JOIN || ORDER BY)[9]
  10. TABLE ACCESS (FULL || CLUSTER || HASH || BY ROWID)[10]
  11. UNION[11]
  12. UNION ALL[12]
  13. VIEW[13]

SORT(AGGREGATE)[#1]#

GROUP BY절없이 Group 함수를 사용할 경우 발생함.

[예제]

SELECT MAX(KAP_SEQ)
FROM   TB_RA315

[PLAN]

SORT (AGGREGATE)
  TABLE ACCESS (FULLOF 'TB_RA315' 

AND-EQUAL[#2]#

두개의 Indexed Column이 각각 ‘=’ 조건으로 사용되어 Index Merge를 이용하는 경우 발생함.

[예제]

SELECT PIN 
FROM   TB_RA315 
WHERE  RGS_AIM_CD = '1' 
AND    RGS_CAUS_CD='2'

[PLAN]

TABLE ACCESS (BY ROWIDOF 'TB_RA315'
   AND-EQUAL
      INDEX (RANGE SCANOF 'TX_RA315_01' (NON-UNIQUE)
      INDEX (RANGE SCANOF 'TX_RA315_02' (NON-UNIQUE)

CONCATENATION[#3]#

각각 access된 Row들의 합집합을 구하기 위해 union all연산을 수행함.

[예제]

SELECT PIN
FROM TB_RA301
WHERE PIN IN '111','222' )

[PLAN]

CONCATENATION
  INDEX (UNIQUE SCANOF 'TX_RA301_PK' (UNIQUE
  INDEX (UNIQUE SCANOF 'TX_RA301_PK' (UNIQUE)

COUNT(STOPKEY)[#4]#

Table의 row수를 지정한 개수만큼만 추출하는 경우 발생

[예제]

SELECT PIN 
FROM   TB_RA301 
WHERE  ROWNUM < 20;

[PLAN]

COUNT (STOPKEY)
   INDEX (FULL SCANOF 'TX_RA301_PK' (UNIQUE)

FILTER[#5]#

선택된 row에 대해서 다른 집합에 대응하는 row가 있을때 제거하는 Operation

[예제]

SELECT ‘1’
FROM   TB_RT337
WHERE  REGT_VER  = '01'
AND    REGT_NO   = '1641'
AND    RECEV_DATE = SUBSTR('1991040000000', 1)
AND EXISTS (SELECT 'X'
      FROM TB_RT337 
      WHERE A.REL_PIN = TB_RT337.REL_PIN
      AND   A.MODI_FLAG= 'Y')

[PLAN]

FILTER
  TABLE ACCESS (BY ROWIDOF 'TB_RT337
     INDEX (RANGE SCANOF 'TX_RT337_03' (NON-UNIQUE)
TABLE ACCESS (BY ROWIDOF 'TB_RT337
     INDEX (RANGE SCANOF 'TX_RT337_02' (NON-UNIQUE)

INDEX (UNIQUE || RANGE-SCAN)[#6]#

  1. UNIQUE : UNIQUE INDEX로 한개의 row추출
  2. RANGE-SCAN : NON-UNIQUE INDEX로 한개 이상의 row 추출

MERGE JOIN[#7]#

먼저 각각의 조건으로만 각자의 테이블을 Access하여 data를 추출한후 SORT하여 조인조건에 따라 merge하는 join. 주로 인덱스를 사용할 수 없는 경우나 조인순서가 왜곡되어있는 경우 발생함.

[예제]

SELECT  /*+ ORDERED */  A.INDI_SEQ
FROM  TB_RA105 A,TB_RE006 B,TB_RA111 C
WHERE A.REGT_VER          =  '01'
AND A.REGT_NO           =  '1150'
AND A.APPL_YEAR         =  '1998'
AND C.REGT_VER          =  '01'
AND C.REGT_NO           =  '1150'
AND C.APPL_YEAR         =  '1998'
AND B.ADMIN_REGN_VER    = C.ADMIN_REGN_VER
AND B.ADMIN_REGN1_CD    =  C.ADMIN_REGN1_CD
AND B.ADMIN_REGN2_CD    =  C.ADMIN_REGN2_CD
AND B.ADMIN_REGN3_CD    =  C.ADMIN_REGN3_CD
AND B.ADMIN_REGN4_CD    =  C.ADMIN_REGN4_CD

[PLAN]

NESTED LOOPS (COST=73554 CARD=BYTES=65)
MERGE JOIN (CARTESIAN
    INDEX (RANGE SCANOF 'TX_RA105_PK' (UNIQUE
    SORT (JOIN)
      INDEX (FULL SCANOF 'TX_RE006_02' (NON-UNIQUE)
  TABLE ACCESS (BY ROWIDOF 'TB_RA111'
    INDEX (RANGE SCANOF 'TX_RA111_01' (NON-UNIQUE)

NESTED LOOPS[#8]#

먼저 driving table의 row를 추출한후 그 결과를 다른 table에 연결하는 join의 경우, 가장 일반적인 Join의 수행방법

SORT (UNIQUE || GROUP BY || JOIN || ORDER BY)[#9]#

  1. UNIQUE : 같은 row를 제거하기 위한 sort
  2. GROUP BY : access결과를 GROUP BY하기 위한 sort
  3. JOIN : MERGE JOIN을 위한 sort
  4. ORDER BY : ORDER BY를 위한 sort 시에 발생함

[예제 1]

SELECT PIN, COUNT(PYO_SEQ
FROM TB_RA305
GROUP BY PIN

[PLAN]

SORT (GROUP BY)
   TABLE ACCESS (FULLOF 'TB_RA305' 

[예제 2]

SELECT DISTINCT PIN
FROM TB_RA301

[PLAN]

SORT (UNIQUE)
  TABLE ACCESS (FULLOF 'TB_RA301'

TABLE ACCESS (FULL || CLUSTER || HASH || BY ROWID)[#10]#

  1. FULL : 전체table scan하는 경우
  2. CLUSTER : Cluster scan하는 경우
  3. HASH : Key값에 의한 hash 알고리즘을 사용하여 scan하는 경우
  4. BY ROWID : Rowid를 이용하여 scan하는 경우

UNION[#11]#

두집합의 합집합을 구하기 위해 union연산자를 사용하는 경우. 중복을 제거하기 위해 sort작업을 수행하며 항상 전체 범위 처리를 한다.

[예제]

SELECT PIN FROM TB_RA301
UNION 
SELECT PIN FROM TB_RA305

[PLAN]

SORT (UNIQUE)
   UNION-ALL
      TABLE ACCESS (FULLOF 'TB_RA301'
      TABLE ACCESS (FULLOF 'TB_RA305'

UNION ALL[#12]#

두집합의 합집합을 구하기 위해 union all 연산자를 사용하는 경우. 중복이 가능하기 때문에 sort작업을 수행하지 않으며 부분 범위 처리를 한다.

[예제]

SELECT PIN FROM TB_RA301
UNION ALL
SELECT PIN FROM TB_RA305

[PLAN]

UNION-ALL
   TABLE ACCESS (FULLOF 'TB_RA301'
   TABLE ACCESS (FULLOF 'TB_RA305' 

VIEW[#13]#

어떤 처리에 의해 생성되는 가상의 집합에서 추출하는 경우.주로 subquery를 사용한 경우 발생

[예제]

SELECT '1'
FROM  (SELECT  COUNTRECEV_SEQ CNT
       FROM  TB_RT345
       WHERE  REGT_VER = '01'
       AND  REGT_NO  = '1141'
       AND  APPL_YEAR= '1998' )
WHERE  ROWNUM = 1

[PLAN]

COUNT (STOPKEY)
   VIEW (COST=CARD=45)
      SORT (AGGREGATE)
   INDEX (RANGE SCANOF 'TX_RT345_PK' (UNIQUE)

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-7) was last changed on 08-Jan-2008 19:22 by DongGukLee