조회 수 11788 추천 수 0 댓글 1

1. global index에 대한 특징....

 

2. 10g, 11g 파티션 테이블 새로운 기능이 어떤게 있나요?

 

3. 파티션테이블 사용시 병렬쿼리와의 성능관계가 어떻게 되나요?

  • 관리자 2011.06.13 00:30

    1. global index에 대한 특징....

     

    Global index 에 대해서 ?

    파티션된 테이블이 있다 할 지라도 각 파티션 마다 인덱싱을 하는 것이 아닌,

    인덱스 생성시 보통의 파티션 되지 않은 테이블로 보고 통으로 하나의 인덱스를 생성

    테이블 전체 검색이 필요한 where 문이 있을 경우 global 인덱스가 local 인덱스보다 유리하다.

    이런 경우 local 인덱스를 사용할 경우 파티션 수 만큼의 인덱스 파티션을 검사해야 하므로 I/O가 상당히 커짐.

    Global Index Range Partiton, Hash Patition 에서만 사용될 수 있다

     

    OTN 자료입니다.

     

     GLOBAL INDEX

    global index는 table과는 다르게 partition이 된다. 즉, table과 같은
    column으로 partition되나 그 범위가 틀리거나, 혹은 다른 컬럼으로 partition이
    이루어진다.
    하나의 index partition에 있는 모든 index는 모두 하나의 table partition에
    속하게 되지 않고, 두 개 이상의 partition에 나누어 있을 수 있다.

    예를 들어 EMP table의 경우 많은 수의 사원을 각 부서 별로 partition을 구성할
    수 있다. 특정 부서에 속한 사원에 대한 operation의 경우 이것은 매우 도움이
    될 수 있다. 그러나 대부분 회사에 부서의 종류는 아주 많은 것이 아니어서 부
    서 번호에 index를 거는 것은 드문 일이다. 그러나 사원 번호는 고유하기 때문
    에 primary key가 되거나 index를 생성하는 것이 일반적이다. 이 때 이 사원
    번호에 부여된 index를 partitioning하게 되면, 이것이 global index가 되는
    것이다.

    global index는 prefixed global index만이 존재하며, non-prefixed global
    index는 생성이 불가능하다. 즉, global index는 항상 index의 맨 앞 컬럼 값만을
    이용하여 partition된다.

    위의 예를 이용하여 global index를 생성하면 다음과 같다.

       CREATE TABLE emp
       (ename VARCHAR2(10),
       empno NUMBER NOT NULL,
       deptno NUMBER)
       PARTITION BY RANGE (deptno)
       (PARTITION part1 VALUES LESS THAN(30),
       PARTITION part2 VALUES LESS THAN (MAXVALUE));

       CREATE UNIQUE INDEX emp_pk on emp(empno)
       GLOBAL PARTITION BY RANGE (empno)
       (PARTITION p1 VALUES LESS THAN ('1000'),
       PARTITION p2  VALUES LESS THAN ('2000'),
       PARTITION p3  VALUES LESS THAN (MAXVALUE));


    2. index unusable

    non-partitioned index나 partitioned index의 partition은 특정한
    operation에 의해 Index Unusable(IU) 상태가 될 수 있다. 이렇게 IU 상태가 된
    index나 index partition을 SELECT하거나 DML을 시도하면 오류가 발생하게 된다.
    어떤 partition이 IU 상태가 되면 그 partition을 사용하기 전에 rebuild하여야
    한다. 그러나 IU partition을 제외한 다른 partition만을 읽거나 DML을 수행하는
    작업은 IU partition을 access하지 않는 한 오류가 발생하지 않는다.

    단, IU partition을 rebuild하기 전에 split이나 rename이 가능하며, IU 상태인
    global index를 drop하는 것도 가능하다.

    partition을 Index Unusable 상태로 만들 수 있는 작업은 다음과 같이 6가지로
    요약할 수 있다.

    (1) direct path load 시
     
    Direct path SQL*Loader 수행 후 index가 table의 해당 data보다 이전 것이면,
    IU 상태가 된다. (Oracle7에서는 Index가 Direct Load State가 되었다고 표현한다).
    index가 table의 data보다 이전 상태라는 것은 data를 load 후 index를 생성 중에
    space 부족 등의 원인으로 오류가 발생하였거나 SKIP_INDEX_MAINTENANCE
    option을 사용한 경우이다.

    (2) ALTER TABLE MOVE PARTITION과 같이 ROWID를 변화시키는 작업.
        영향받는 local index와 전체 global index를 IU 상태가 되게 한다.

    (3) ALTER TABLE TRUNCATE PARTITION이나 DROP PARTITION과 같이 table의 row를
        지우는 작업.
        global index partition을 IU 상태로 만든다.

    (4) ALTER TABLE SPLIT PARTITION은 local index의 partition definition은
        변경시키지만, 자동으로 index를 새로운 definition에 맞게 rebuild하지 않기
        때문에 영향 받는 local index partition을 IU 상태로 만든다. 또한 이것은
        ROWID를 변경시키기 때문에 모든 global index partition을 IU 상태로 만든다.

    (5) ALTER INDEX SPLIT PARTITION은 index의 definition은 변경시키지만, 영향
        받은 partition은 rebuild시키지 않는다. 이 작업은 영향받는 index
        partition 부분을 IU 상태로 만든다. 그러나 global index의 경우는 그대로
        usable 상태로 된다.


    3. unusable상태를 확인하고 해결하는 방법

       os> sqlplus system/manager
       SQL>select index_owner, index_name, partition_name, status
           from dba_ind_partitions
           where status = 'UNUSABLE' ;  
      
       rebuild하는 방법은 해당 user에서
       SQL>alter index emp_pk rebuild partiton p1;


    아무옵션없이 생성된 인덱스도 unusable상태가 되며 조회시 에러가 발생한다.
    그때는 dba_indexes 에 status를 조회해야한다.

     

    2. 10g, 11g 파티션 테이블 새로운 기능이 어떤게 있나요?

     

    10G

    ----

    10G New Feature

    1. Partitioned Index-Organized Tables (IOTs) Enhancements
        a. List-partitioned IOTs     list partition으로 IOT를 구성할 수 있다.
         
          CREATE TABLE sales (
             acct_no NUMBER(5),
             acct_name CHAR(30),
             amount_of_sale NUMBER(6),
             week_no INTEGER,
             sale_details VARCHAR2(1000),
             PRIMARY KEY (acct_no, acct_name, week_no))
             ORGANIZATION INDEX INCLUDING week_no
             OVERFLOW tablespace overflow_here
             PARTITION BY LIST (week_no) (
             PARTITION part1234 VALUES (1, 2, 3, 4) tablespace ts1,
             PARTITION part5678 VALUES (5, 6, 7, 8) tablespace ts1,
             PARTITION partdefault VALUES (DEFAULT) tablespace ts1)

     


    HYUN> select index_name, partition_name, status from user_ind_partitions
    INDEX_NAME                                                   PARTITION_NAME       STATUS
    ------------------------------------------------------------ -------------------- ----------------
    SYS_IOT_TOP_24210                                            PART1234             USABLE
    SYS_IOT_TOP_24210                                            PART5678             USABLE
    SYS_IOT_TOP_24210                                            PARTDEFAULT          USABLE

     


         b. Global index maintenance for partitioned IOTs
            10g 이전의 파티션 IOT의 global indexes 사용에서 drop , truncate 또는 exchange partition 후에 global indexes는 unusable 되었던 점과
            move, split 또는 merge aprtition과 같은 다른 파티션 유지 관리 작업시 global index-based의 성능이 저하되었던 점을 개선하였다


    SQL> alter table sales truncate partition PART1234;

    INDEX_NAME                                                   PARTITION_NAME       STATUS
    ------------------------------------------------------------ -------------------- ----------------
    SYS_IOT_TOP_24210                                            PART1234             USABLE
    SYS_IOT_TOP_24210                                            PART5678             USABLE
    SYS_IOT_TOP_24210                                            PARTDEFAULT          USABLE

     

         c. Local partitioned bitmap indexes on partitioned IOTs
             파티션된 IOT에서 bitmap 인덱스 사용이 가능해 졌다


    HYUN> CREATE TABLE piot_test ( empno NUMBER(4),
          ename VARCHAR2(10),
          edept NUMBER(4),
          constraint emp_iot_pk primary key(empno))
          ORGANIZATION INDEX MAPPING TABLE     
          PARTITION BY RANGE(empno) (
          partition emp_p100 VALUES LESS THAN (50) ,
          partition emp_p200 VALUES LESS THAN (MAXVALUE) );

    HYUN> create bitmap index i_b_edept on piot_test(edept) local;

       

          d. LOB cloumns are now supported in all types of partitioned IOTs
               IOT 파티션에서 LOB 컬럼이 가능해졌다

    2. Local partitioned Index Enhancements
        ADD,SPLIT,MERGE,MOVE와 같은 DDL명령어후에 기존에는 local partitioned index가 unusable 상태가 되었지만
       10g 부터는 update indexes를 써서 자동으로 rebuild 할 수 있다.


    HYUN> ALTER TABLE sales_test
          MOVE PARTITION s_q3
          TABLESPACE USERS2
          UPDATE INDEXES (saled_test_ix
          (PARTITION s_q3 TABLESPACE EXAMPLE));

    HYUN> SELECT index_name, tablespace_name, status
          FROM user_ind_partitions
          WHERE index_name like 'SALES%';I

    NDEX_NAME                 TABLESPACE_NAME STATUS
    -------------------  --------------- ------
    SALES_TEST_IX_S_Q1  USERS  USABLE
    SALES_TEST_IX_S_Q2  USERS  USABLE
    SALES_TEST_IX_S_Q3  EXAMPLE  USABLE

     

    SKIP_UNUSABLE_INDEXES 파라메타가 true로 설정되어 있다면 index가 unusable 상태이더라도
    스킵하여 full scan 하여 쿼리를 수행합니다
    false라면 쿼리 수행시 ora-1502 에러가 납니다

    3. partition 넘버가 기존의 64K-1에서 1024K-1로 증가 되었습니다
    4. Dynamic Partition Pruning 가 강화되었습니다.
    5. perge mode로 large partitioned table이 drop 되었을때 drop의 동작은 partition chunk를 삭제 하기 위해 인터널하게 나뉜다
    6. intra-partition DML은 bitmap indexes를 이용 할 수 있다.

     

    11G

    ------

    Composite Partition에서 확장된 Extended Composite Partition이 지원

    - Range-Range

    두 개의 날짜 필드를 가지고 있을 때 유용할 수 있다

    CREATE TABLE shipments

    ( order_id NUMBER NOT NULL

    , order_date DATE NOT NULL

    , delivery_date DATE NOT NULL

    , customer_id NUMBER NOT NULL

    , sales_amount NUMBER NOT NULL )

    PARTITION BY RANGE (order_date)

    SUBPARTITION BY RANGE (delivery_date)

    ( PARTITION p_2006_jul VALUES LESS THAN (TO_DATE('01-AUG-2006','dd-MON-yyyy'))

    ( SUBPARTITION p06_jul_e VALUES LESS THAN (TO_DATE('15-AUG-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_jul_a VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_jul_l VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_2006_aug VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))

    ( SUBPARTITION p06_aug_e VALUES LESS THAN (TO_DATE('15-SEP-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_aug_a VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_aug_l VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_2006_sep VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))

    ( SUBPARTITION p06_sep_e VALUES LESS THAN (TO_DATE('15-OCT-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_sep_a VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_sep_l VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_2006_oct VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy'))

    ( SUBPARTITION p06_oct_e VALUES LESS THAN (TO_DATE('15-NOV-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_oct_a VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_oct_l VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_2006_nov VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy'))

    ( SUBPARTITION p06_nov_e VALUES LESS THAN (TO_DATE('15-DEC-2006','dd-MON-yyyy'))

    , SUBPARTITION p06_nov_a VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))

    , SUBPARTITION p06_nov_l VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_2006_dec VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))

    ( SUBPARTITION p06_dec_e VALUES LESS THAN (TO_DATE('15-JAN-2007','dd-MON-yyyy'))

    , SUBPARTITION p06_dec_a VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy'))

    , SUBPARTITION p06_dec_l VALUES LESS THAN (MAXVALUE)

    )

    );

     

    - List-Range 

    List Partitioning + 날짜 필드를 이용한 sub-partitioning

    CREATE TABLE donations

    ( id NUMBER

    , name VARCHAR2(60)

    , beneficiary VARCHAR2(80)

    , payment_method VARCHAR2(30)

    , currency VARCHAR2(3)

    , amount NUMBER )  PARTITION BY LIST (currency)

     

    SUBPARTITION BY RANGE (amount)

    ( PARTITION p_eur VALUES ('EUR')

    ( SUBPARTITION p_eur_small VALUES LESS THAN (8)

    , SUBPARTITION p_eur_medium VALUES LESS THAN (80)

    , SUBPARTITION p_eur_high VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_gbp VALUES ('GBP')

    ( SUBPARTITION p_gbp_small VALUES LESS THAN (5)

    , SUBPARTITION p_gbp_medium VALUES LESS THAN (50)

    , SUBPARTITION p_gbp_high VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_aud_nzd_chf VALUES ('AUD','NZD','CHF')

    ( SUBPARTITION p_aud_nzd_chf_small VALUES LESS THAN (12)

    , SUBPARTITION p_aud_nzd_chf_medium VALUES LESS THAN (120)

    , SUBPARTITION p_aud_nzd_chf_high VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_jpy VALUES ('JPY')

    ( SUBPARTITION p_jpy_small VALUES LESS THAN (1200)

    , SUBPARTITION p_jpy_medium VALUES LESS THAN (12000)

    , SUBPARTITION p_jpy_high VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_inr VALUES ('INR')

    ( SUBPARTITION p_inr_small VALUES LESS THAN (400)

    , SUBPARTITION p_inr_medium VALUES LESS THAN (4000)

    , SUBPARTITION p_inr_high VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_zar VALUES ('ZAR')

    ( SUBPARTITION p_zar_small VALUES LESS THAN (70)

    , SUBPARTITION p_zar_medium VALUES LESS THAN (700)

    , SUBPARTITION p_zar_high VALUES LESS THAN (MAXVALUE)

    )

    , PARTITION p_default VALUES (DEFAULT)

    ( SUBPARTITION p_default_small VALUES LESS THAN (10)

    , SUBPARTITION p_default_medium VALUES LESS THAN (100)

    , SUBPARTITION p_default_high VALUES LESS THAN (MAXVALUE)

    )

    ) ENABLE ROW MOVEMENT;

     

    - List-Hash  

    List Partitioning 후 생성된 파티션의 크기가 너무 클 경우

    Hash Partitioning을 이용하여 sub-partitioning을 하면 유용하다

    CREATE TABLE credit_card_accounts

    ( account_number NUMBER(16) NOT NULL

    , customer_id NUMBER NOT NULL

    , customer_region VARCHAR2(2) NOT NULL

    , is_active VARCHAR2(1) NOT NULL

    , date_opened DATE NOT NULL

    ) PARTITION BY LIST (customer_region)

    SUBPARTITION BY HASH (customer_id)

    SUBPARTITIONS 16

    ( PARTITION emea VALUES ('EU','ME','AF')

    , PARTITION amer VALUES ('NA','LA')

    , PARTITION apac VALUES ('SA','AU','NZ','IN','CH')

    ) ;

     

    - List-List  

    List Partitioning을 이용하여 파티션할 수 있는 Column 2개 이상 있을 경우 유용하다

    CREATE TABLE current_inventory

    ( warehouse_id NUMBER

    , warehouse_region VARCHAR2(2)

    , product_id NUMBER

    , product_category VARCHAR2(12)

    , amount_in_stock NUMBER

    , unit_of_shipping VARCHAR2(20)

    , products_per_unit NUMBER

    , last_updated DATE

    ) PARTITION BY LIST (warehouse_region)

    SUBPARTITION BY LIST (product_category)

    SUBPARTITION TEMPLATE

    ( SUBPARTITION perishable VALUES ('DAIRY','PRODUCE','MEAT','BREAD')

    , SUBPARTITION non_perishable VALUES ('CANNED','PACKAGED')

    , SUBPARTITION durable VALUES ('TOYS','KITCHENWARE')

    )

    ( PARTITION p_northwest VALUES ('OR', 'WA')

    , PARTITION p_southwest VALUES ('AZ', 'UT', 'NM')

    , PARTITION p_northeast VALUES ('NY', 'VM', 'NJ')

    , PARTITION p_southeast VALUES ('FL', 'GA')

    , PARTITION p_northcentral VALUES ('SD', 'WI')

    , PARTITION p_southcentral VALUES ('OK', 'TX')

    );

     

    - Reference Partition

    부모 테이블의 Reference Key를 이용하여 자식테이블에 대해서 Partitioning을 수행한다

    보무 테이블과 자식 테이블간에 부모 테이블의 Partition key column의 복제 없이

    자식 테이블의 partition 구조를 따라가는 방식

    제약조건 - Foreign key 제약 조건이 설정되어 있어야 한다

             - 상속받는 테이블의 key값이 not null 이어야 한다

    CREATE TABLE ref_part_parent

    (pcol1 NUMBER PRIMARY KEY,

    pcol2 VARCHAR2(10))

    PARTITION BY RANGE (pcol1)

    (PARTITION p1 VALUES LESS THAN (100),

    PARTITION p2 VALUES LESS THAN (200),

    PARTITION p3 VALUES LESS THAN (300),

    PARTITION p4 VALUES LESS THAN (MAXVALUE))

     

    INSERT INTO ref_part_parent values(50,'fifty');

    INSERT INTO ref_part_parent values(150,'1-fifty');

    INSERT INTO ref_part_parent values(250,'2-fifty');

    INSERT INTO ref_part_parent values(350,'3-fifty');

    commit;

     

    SQL> select * from REF_PART_PARENT;

     

         PCOL1 PCOL2

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

               50 fifty

           150 1-fifty

           250 2-fifty

           350 3-fifty

     

    CREATE TABLE ref_part_child

    (ccol1 NUMBER NOT NULL,

    CONSTRAINT ccol1_fk FOREIGN KEY(ccol1) REFERENCES ref_part_parent(pcol1))

    PARTITION BY REFERENCE(ccol1_fk);

     

    alter table ref_part_child add (ccol2 varchar2(10));

     

    insert into ref_part_child values(50,'child_1');

    insert into ref_part_child values(150,'child0-1');

    commit;

     

    SQL> select * from REF_PART_CHILD;

     

     CCOL1  CCOL2

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

    50         child_1

    150      child0-1

     

     

    select table_name,partition_name,high_value from user_tab_partitions

    where table_name like 'REF_PART%';

     

    TABLE_NAME                     PARTITION_NAME                 HIGH

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

    REF_PART_PARENT                P1                             100

    REF_PART_PARENT                P2                             200

    REF_PART_PARENT                P3                             300

    REF_PART_PARENT                P4                             MAXV

    REF_PART_CHILD                 P1

    REF_PART_CHILD                 P2

    REF_PART_CHILD                 P3

    REF_PART_CHILD                 P4

     

    SQL> select * from ref_part_child partition (p1);

     

    CCOL1      CCOL2

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

    50         child_1

     

     

    SQL> select * from ref_part_child partition (p2);

     

    CCOL1      CCOL2

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

    150        child0-1

     

    SQL> select * from ref_part_child partition (p4);

     

    no rows selected

     

    SQL> select * from ref_part_child partition (p3);

     

    no rows selected

     

     

     

     

     

     

     

     

    - Interval Partition

    Range Partition에서 특정 범위를 지정하고 관리할대는 미리 range를 만들어주어야 하고 생성 이후 분할 또는 병합을 할 때는 추가적인 작업 필요

    Interval Partition에서는 각 파티션의 간격을 미리 정의함으로서 파티션 생성을 오라클이 직접해주는 방식(Range Partition 확장)

    파티션을 특정 Tablespace에 저장하고 싶다면 STORE IN 구문으로 가능함

    CREATE TABLE SH.SALES_INTERVAL

    PARTITION BY RANGE(time_id)

    INTERVAL (NUMTOYMINTERVAL(1,'month')) STORE IN (tbs1,tbs2,tbs2,tbs4)

    (

    partition p1 values less than (to_date('1-1-2002','dd-mm-yyyy')),

    partition p2 values less than (to_date('1-1-2003','dd-mm-yyyy')),

    partition p3 values less than (to_date('1-1-2004','dd-mm-yyyy')))

    as

    select * from sh.sales

    where time_id < to_date('1-1-2004','dd-mm-yyyy');

     

    select table_name,partition_name,high_value,tablespace_name

    from user_tab_partitions

    where table_name like 'SALES_INT%';

     

    TABLE_NAME   PARTITION_NA        HIGH_VALUE                       TABLESPACE_NAME

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

    SALES_INTERVAL      P1   TO_DATE(' 2002-01-01 00:00:00'             USERS

    SALES_INTERVAL      P2   TO_DATE(' 2003-01-01 00:00:00'             USERS

    SALES_INTERVAL      P3   TO_DATE(' 2004-01-01 00:00:00'             USERS

     

    insert into sales_interval values (128,4000,to_date('01-02-2004','dd-mm-yyyy'),3,999,1,100);

    commit;

     

    select table_name,partition_name,high_value,tablespace_name

    from user_tab_partitions

    where table_name like 'SALES_INT%';

     

    TABLE_NAME     PARTITION_NA       HIGH_VALUE                      TABLESPACE_NAME

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

    SALES_INTERVAL      P1   TO_DATE(' 2002-01-01 00:00:00'             USERS

    SALES_INTERVAL      P2   TO_DATE(' 2003-01-01 00:00:00'             USERS

    SALES_INTERVAL      P3   TO_DATE(' 2004-01-01 00:00:00'              USERS

    SALES_INTERVAL      SYS_P21        TO_DATE(' 2004-03-01 00:00:00'             TBS1

     

    - System Partition

    테이블 생성시 파티션 구간을 미리 설정하는 것이 아니라 임의로 나눈 파티션에 대해 사용자가 원하는 파티션에 데이터를 저장하는 방식

    사용자가 'system partition'으로 되어 있는 테이블에 DML하고자 할 때 직접 파티션을 지정해 주어야 한다

    insert는 반드시 파티션을 지정

    delete, update 할 경우 필수는 아니나 지정하지 않을 경우 모든 파티션을 검색

    로컬 인덱스 생성 시, 인덱스도 동일한 방법으로 Partitioning 된다

    create table sales

    (

    sales_id number,

    product_code number,

    state_code number

    )

    partition by system

    (

    partition p1 tablespace users,

    partition p2 tablespace users

    );

     

    select partition_name

    from user_segments

    where segment_name = 'SALES';

     

    PARTITION_NAME

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

    P1

    P2

     

    insert into sales partition (p1) values (1,100,2);

    commit;

     

     

     

     

     

     

    - Virtual Column Partition

    파티션으로 나누고자 하는 Column이 테이블에서 가공되어 얻을 수 있는 Column일 경우

    11g 이전에서는 새로운 column을 추가하고 트리거를 이용하여

    column 값을 생성하는 방법을 사용하여 많은 오버헤드 발생

    11g 에서는 Virtual Column Partition을 지원하여 실제로 저장되지 않은 Column

    런타임에 계산하여 생성. 또한 가상 Column에 파티션을 적용하는 것도 가능하다

    CREATE TABLE emp

    (

    EMPNO NUMBER(6),

    SAL NUMBER,

    COMM NUMBER,

    HIREDATE DATE,

    TOTAL_SALARY as(sal*(1+comm))

    )

    PARTITION BY RANGE(TOTAL_SALARY)

    (

    PARTITION P1 VALUES LESS THAN(50000),

    PARTITION P2 VALUES LESS THAN(100000),

    PARTITION P3 VALUES LESS THAN(150000),

    PARTITION P4 VALUES LESS THAN(MAXVALUE)

     

    3. 파티션테이블 사용시 병렬쿼리와의 성능관계가 어떻게 되나요?

     

    파티셔닝 환경에서의 패러럴 처리는 파티션테이블이 파티션 단위로 격납되는 스토리지를 분산시키는 등 명시적으로 패러럴 처리를 효율적으로 실시하는데 적합한 설정이 가능하다

    게다가 파티셔닝에서는 테이블 데이터에 작성된 인덱스도 파티션화할 수 있으며, 패러럴의 인덱스 스캔을 다른 파티션에 영향을 주는 일 없이 실시 할수 있다.

     

    Parallel DML이 사용가능한 경우

     - INSERT, UPDATE, DELETE, MERGE

    DML의 병렬 처리는 대상 테이블이 매우 크고, 전체 데이터 중 최소 1% 이상을 변경하는, 그리고 1%의 크기가 몇 백MB 단위거나 GB 단위일 때 그 효용성을 발휘합니다.

    그리고 이러한 것으로 기인하여 얻을 수 있는 DML의 가장 큰 잇점은 속도 향상입니다. 바꾸어 말해 단지 몇 MB나 몇십 MB의 데이터 변경을 위해 굳이 병렬로 처리하는 것은 시스템 자원의 비 효율성 및 성능 저하를 초래할 수 있습니다. 다른 병렬 작업처럼 읽기 혹은 쓰기 만을 하는 것이 아니라, 읽기, 쓰기, 지우기, Recursive Call 등의 복합작업을 동시에 하는 DML의 특징 상, 그 작업 성능이 단순히 할당 되는 Parallel Execution Server Process의 갯수에서 비롯되는 것이 아니라, 하드웨어의 특성(CPU의 갯수, Disk Controller의 갯수, 데이터의 Disk별 분포도 등)에 대해서도 많이 좌우 됩니다

     


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 Q&A Oracle관련 게시물만 Sean 2014.04.09 84839
16 Q&A 오라클 복구 질문 희달이 2015.05.08 1149
15 Q&A import후 simple_size 0일때 고구마 2014.01.13 3194
14 Q&A [답변] 테이블 수정, 삭제 및 LOB에 대해 알려주세요 Tech1 2012.03.26 10656
13 Q&A ORACLE_BASE, ORACLE_HOME 각각의 위치에 대한 설명 부탁드립니다 Tech1 2012.03.20 10882
» Q&A 파티션 테이블에 대해서 몇가지 궁금합니다. 1 고구마 2011.06.13 11788
11 Q&A Local Prefixed와 Local Non-Prefixed index 차이 ? 1 고구마 2011.06.13 9598
10 Q&A 파티션 테이블 종류가 뭐가 있나요? 1 고구마 2011.06.13 10344
9 Q&A RAC 쿼리 속도 관련 질문입니다. 3 고구마 2011.05.20 8970
8 Q&A ORA--04031 에러에 대해 질문합니다. 4 고구마 2011.05.17 12628
7 Q&A 오라클 프로세스에 대해서 궁금합니다. 4 고구마 2011.05.04 11190
6 Q&A 패키지 BODY 관련 질문 3 고구마 2011.05.03 10177
5 Q&A alert_log는 5 perfstat 2011.04.22 8072
4 Q&A RHEL5에 11gR2 RAC 구성시 ASM 관련 에러 file 송기성 2010.12.11 17687
3 Q&A 서버교체에 관해서.. 1 명랑여행 2010.08.20 9641
2 Q&A 오라클 유저 삭제가 안될시? 4 명랑여행 2010.05.27 11546
1 Q&A 업그레이드 이후 안됨 3 유주환 2010.04.23 10385
Board Pagination Prev 1 Next
/ 1