오라클에 이런 게 있다는 걸 몰랐었다. 사실 모르는 게 많지만...
몇주째 고생하는 개발자에게 이걸 알려줬다면, 마이그레이션 작업이 훨씬 금방 끝났었을 텐데...
못도와준게 아쉽다. 그리고 역시 비싼 디비는 뭐가 다르긴 다르다.

파티션은 아직은 잘 모르지만, 키를 가지고 대용량의 테이블을 내부적으로 나눠서 빠른 처리를 하도록 돕는 기능이다. 개수가 많은 것보다는 개수가 적은 것이 쿼리가 훨씬 빠르기 때문이다.

참고 사이트
간략 설명
http://www.devarticles.com/c/a/Oracle/Partitioning-in-Oracle/1/

more..


조금 보기 좋은 설명
http://www.orafaq.com/node/55

잘 정리해 놓은 것
http://niflheim.tistory.com/tag/oracle%20partition

more..


샘플?
http://asktom.oracle.com/pls/asktom/f?p=100:11:1619565279119772::::P11_QUESTION_ID:4636779130376

오라클 도움말
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c12parti.htm

문법 설명(발췌)
http://www.ss64.com/ora/table_a_part.html

'Database > Oracle' 카테고리의 다른 글

오라클 테이블 락 ( Table lock )  (0) 2010.10.04
오라클 백그라운드 프로세서  (0) 2010.09.28
계층형 쿼리 (CONNECT BY)  (0) 2010.07.14
오라클 클라이언트 가 토드에서 안될때. ㅋ  (0) 2010.06.29
update 방법들  (0) 2010.06.16
load data [local] infile 'path' into table table_name [fields terminated by] [lines terminated by] [fields enclosed by]

일반 파일을 table의 해당 각각의 컬럼에 입력합니다.

c:/test.txt
------------------------------------------------------------------------------------------
n     오락실     지출     300
n     용돈        수입     1000000000
n     새우깡     지출     500
n     꽁돈        수입     150
------------------------------------------------------------------------------------------

test_table
------------------------------------------------------------------------------------------
no(unique)       내용       타입       값
------------------------------------------------------------------------------------------

test_table 테이블에 test.txt(txt 파일만 가능한 것이 아닙니다. 설명의 이해를 돕기위해..^^) 파일을 넣을 경우 쿼리문은 다음과 같습니다.
load data infile 'c:/test.txt' into table test_table

RESULT
------------------------------------------------------------------------------------------
no(unique)       내용       타입       값
------------------------------------------------------------------------------------------
1                    오락실     지출       300
2                    용돈        수입       1000000000
3                    새우깡     지출       500
4                    꽁돈        수입       150
------------------------------------------------------------------------------------------

위 파일을 text.txt로 가정하고 각 필드를 구분할 값을 fields terminated by 가 없다면 기본값으로 탭(t)을 사용합니다.
no 필드는 각 열의 기준값이므로  Null 이여야 합니다. 때문에 맨 앞은 n을 이용하여 이 필드는 널이라는 것을 sql 에 알려줍니다.

fields terminated by
------------------------>
필드간 구분을 지을 문자값을 지정합니다 이 값이 없다면 기본값은 탭이며  다음처럼 사용합니다.
load data infile 'c:/test.txt' into table test_table fields terminated by 't';

lines terminated by
------------------------>
행을 지정할 문자값을 지정합니다.
load data infile 'c:/test.txt' into table test_table lines terminated by 'rn';

fields enclosed by
------------------------>
필드를 감싸줄 문자값을 지정합니다. "로 감싸줄 경우...
load data infile c:/test.txt' into table test_table fields enclosed by """;

local
------------------------>
오프라인 파일인지 온라인 파일인지를 구분합니다.
값이 없다면 서버에서 찾게됩니다.

'Database > Mysql' 카테고리의 다른 글

프로시저의 예  (0) 2011.01.26
MySQL DUMP 백업 및 복원  (0) 2010.09.20
mysql replication error  (0) 2010.06.28
LOAD XML Syntax [v5.5]  (0) 2010.04.07
MySQL 사용 중 발생할 수 있는 대기 현상 장애의 원인과 대처  (0) 2009.12.30

===================================================================
[예]

SELECT
        LEVEL AS LEV
      , MENU.*
FROM
        TBL_MENU  MENU
WHERE               MENU_TYPE_CD = '1'
START WITH          MENU.MENU_ID = 'TOP'
CONNECT BY PRIOR    MENU.MENU_ID = MENU.UP_MENU_ID
ORDER SIBLINGS BY   MENU_SEQ

===================================================================
[풀이]

UP_MENU_ID 가 'TOP'인 것부터 순환고리를 시작하며
동일 레벨일경우(즉, UP_MENU_ID 가 'TOP'으로 하는 여러 ROW)는 MENU_SEQ가 먼저인것 부터 계층구조
그리고 마지막으로 MENU_TYPE_CD가 '1'인것만 최종 추출

===================================================================


◈ LEVEL 예약어 : depth

◈ CONNECT BY의 실행순서
    (1) START WITH 절
    (2) CONNECT BY 절
    (3) WHERE 절


    START WITH : 시작위치 설정 (서브쿼리를 사용가능)
    CONNECT BY : 순환고리의 조건 (서브쿼리를 사용불가)
    ORDER SIBLINGS BY : 같은 레벨중 순환고리 순서를 정할때 사용

◈ PRIOR 의 위치
    (1) CONNECT BY PRIOR 자식컬럼 =       부모컬럼  ==> 부모에서 자식으로 트리 구성
    (2) CONNECT BY       자식컬럼 = PRIOR 부모컬럼  ==> 자식에서 부모으로 트리 구성

◈ 데이터가 많아질 경우....

    - START WITH MENU_ID = 'TOP'
          MENU_ID 컬럼에 index가 생성되어 있지 않는다면 속도를 보장할 수 없습니다.

    - CONNECT BY PRIOR MENU_ID = UP_MENU_ID
          역시 PRIOR 쪽의 컬럼값이 상수가 되기 때문에 UP_MENU_ID컬럼에 index를 생성하여야 CONNECT BY의 속도를 보장할 수 있습니다.

    - 계층구조를 CONNECT BY, START WITH로 풀면 부분범위 처리가 불가능하고 Desc으로 표현하기가 어렵 습니다.

◈ 
    (1) '상품' 메뉴는 모두 출력 안함.
    SELECT
            LEVEL AS LEV
          , MENU.*
    FROM   
            TBL_MENU  MENU
    WHERE               MENU.MENU_NAME  <> '상품'
    START WITH          MENU.MENU_ID = 'TOP'
    CONNECT BY PRIOR    MENU.MENU_ID = MENU.UP_MENU_ID
    ORDER SIBLINGS BY   MENU_SEQ
   
    (2) '상품'메뉴 밑으로 모든 메뉴는 출력안함.
    SELECT
            LEVEL AS LEV
          , MENU.*
    FROM   
            TBL_MENU  MENU
    START WITH          MENU.MENU_ID    = 'TOP'
    CONNECT BY PRIOR    MENU.MENU_ID    = MENU.UP_MENU_ID
    AND                 MENU.MENU_NAME  <> '상품'
    ORDER SIBLINGS BY   MENU_SEQ
   
    ** 참고) 메뉴중 2LEVEL까지만 결과 출력
    (WHERE조건으로도 LEVEL <= 2가능함. 그러나 권하지는 않는다.
     왜? WHERE 조건은 모든 나온결과에 대해서 FILTER하지만 CONNECT BY절의 조건으로 넣으면 순환자체를 안한다. 즉 성능에 좋다)
    SELECT
            LEVEL AS LEV
          , MENU.*
    FROM   
            TBL_MENU  MENU
    START WITH          MENU.MENU_ID    = 'TOP'
    CONNECT BY PRIOR    MENU.MENU_ID    = MENU.UP_MENU_ID
    AND                 LEVEL  <= 2
    ORDER SIBLINGS BY   MENU_SEQ    
  
   

    (1) 들여쓰기로 결과출력
    SELECT
            LPAD(’ ’, 4*(LEVEL-1)) || MENU.MENU_NAME
          , MENU.*
    FROM
            TBL_MENU  MENU
    WHERE               MENU_TYPE_CD = '1'
    START WITH          MENU.MENU_ID = 'TOP'
    CONNECT BY PRIOR    MENU.MENU_ID = MENU.UP_MENU_ID
    ORDER SIBLINGS BY   MENU_SEQ
   
    (2) 엑셀과 같이 셀 단위로 들여쓰기
    SELECT
             DECODE(LEV, '1', MENU_NAME, '') AS LEV1
           , DECODE(LEV, '2', MENU_NAME, '') AS LEV2
           , DECODE(LEV, '3', MENU_NAME, '') AS LEV3
           , DECODE(LEV, '4', MENU_NAME, '') AS LEV4
           , DECODE(LEV, '5', MENU_NAME, '') AS LEV5
    FROM
           (
             SELECT
                     LEVEL AS LEV
                   , MENU.*
             FROM    TBL_MENU  MENU
             WHERE               MENU_TYPE_CD = '1'
             START WITH          MENU.MENU_ID = 'TOP'
             CONNECT BY PRIOR    MENU.MENU_ID = MENU.UP_MENU_ID        
             ORDER SIBLINGS BY   MENU_SEQ
           )

+ Recent posts