2013-08-08 2 views
4

I은 ​​다음 표를오라클 DB 매일 분할

CREATE TABLE "METRIC_VALUE_RAW" 
    ( 
    "SUBELEMENT_ID" INTEGER NOT NULL , 
    "METRIC_METADATA_ID" INTEGER NOT NULL , 
    "METRIC_VALUE_INT" INTEGER, 
    "METRIC_VALUE_FLOAT" FLOAT(126), 
    "TIME_STAMP" TIMESTAMP NOT NULL 
    ) ; 
  1. 매 시간마다 데이터를 SQL 로더를 사용하여 테이블에로드됩니다있다.
  2. 매일 데이터가 파티션에 저장되도록 파티션을 만들고 싶습니다.
  3. 테이블에 30 일 동안 데이터를 저장하고 싶습니다. 따라서 30 일이 지나면 가장 오래된 파티션이 삭제됩니다.

파티션을 디자인하는 방법에 대한 아이디어를 공유 할 수 있습니까?

+0

파티션 자동화에 대해 이야기 할 때 10g와 11g 사이에 큰 차이가 있으므로 사용중인 버전을 명시해야합니다. – haki

+0

10g을 사용하고 있습니다. 또한 향후 업그레이드를 계획하고 있으므로 11g에 대해 알면 도움이됩니다. 그러므로 둘 모두에 대해 아는 것이 도움이 될 것입니다. – user2032118

답변

1

내가 말했듯이 10g에서 11g 사이의 파티션 자동화에는 큰 차이가 있습니다. 10G에서는 ETL 프로세스 중에 수동으로 파티션을 관리해야합니다 (10g DBA마다 파티션 관리를 위해 작성한 유틸리티 패키지가 있음을 확신합니다). 1 단계 & 2의

, 당신은 직접 매일 파티션에 여러 가지 옵션

  1. 로드 데이터를 가지고있다.
  2. 데이터를 새 파티션에로드하고이를 매일 파티션으로 병합하십시오.
  3. 매 시간마다 새 파티션에 데이터를로드하고 유지 관리 중에 창은 모든 시간별 파티션을 일일 파티션으로 병합합니다.

올바른 방법은 필요에 따라 다릅니다. 새로 추가 된 데이터가 즉시 쿼리됩니까? 어떤 방식으로? 몇 시간 (또는로드 ...)에 걸쳐 데이터를 쿼리 하시겠습니까? 집계를 보여주고 있습니까? 데이터에 대해 DML 작업을 수행하고 있습니까 (파티션에 대한 DDL 작업은 대규모 잠금을 유발합니다).

약 3, 다시 - 수동. 오래된 파티션을 삭제하십시오.

11G에는 위에 언급 된 작업 중 일부를 자동화하는 새로운 간격 파티션 기능이 있습니다.

0

는 샘플 데이터를 parititon하는 테이블 SQL을 만드는 것입니다 태그 :

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL, 
    report_status VARCHAR(20) NOT NULL, 
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 
PARTITION BY RANGE (UNIX_TIMESTAMP(report_updated)) (
    PARTITION p0 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-01 00:00:00')), 
    PARTITION p1 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-02 00:00:00')), 
    PARTITION p2 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-03 00:00:00')), 
    PARTITION p3 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-04 00:00:00')), 
    PARTITION p4 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-05 00:00:00')), 
    PARTITION p5 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-06 00:00:00')), 
    PARTITION p6 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-07 00:00:00')), 
    PARTITION p7 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-08 00:00:00')), 
    PARTITION p8 VALUES LESS THAN (UNIX_TIMESTAMP('2008-01-09 00:00:00')), 
    PARTITION p9 VALUES LESS THAN (MAXVALUE) 
); 

Paritions는 DBA 및 나머지에 의해 생성됩니다 오라클에 의해 처리됩니다. 파티션을 삭제하려면 별도의 작업을 작성해야합니다.

+0

이것은 MySQL의 예입니까? –

+0

예를 들어 주셔서 감사합니다. 이 예에서는 연도를 지정했습니다 (2008/2009). 날짜를 지정하지 않고 일별 파티션을 만들어 재사용 할 수있는 방법이 있습니까? 30 일 데이터를 저장하고 싶습니다. – user2032118

+0

@ user2032118 : 그 해의 차이는 [지금 수정합니다] 오류입니다. 이처럼 파티션 순서를 정의하면 oracle은 create table 스크립트에서 같은 패턴을 사용하여 관련 파티션을 계속 선택합니다. 파티션을 계속 추가하면됩니다. – Lokesh

0

여기에 Oracle 11g에서 수행하는 방법이 나와 있으며 매우 잘 작동합니다. 나는 오라클 10g에서 그것을 시도하지 않았다, 당신은 그것을 시도 할 수있다. 위에서 보듯이

CREATE TABLE XXX (
    partition_date DATE, 
    ..., 
    ..., 
) 
PARTITION BY RANGE (partition_date) 
INTERVAL (NUMTODSINTERVAL(1, 'day')) 
(
    PARTITION part_01 values LESS THAN (TO_DATE('2000-01-01','YYYY-MM-DD')) 
) 
TABLESPACE MY_TABLESPACE 
NOLOGGING; 

는 오라클이보기 자동 1 일 이후에 각각 별개의 partition_day에 대해 별도의 파티션을 만들 것입니다 그 partition_date 2000 년 1 월 기록 :

이 방법 매일 파티션 테이블을 만드는 방법이며, 이 날짜보다 오래된 경우 'part_01'이라는 파티션에 저장됩니다.

당신이 문 사용하여 테이블 파티션을 monitore 수 있습니다, 당신이 원하는 경우 일부 파티션을 삭제, 이후

SELECT * FROM user_tab_partitions WHERE table_name = 'XXX'; 

를 사용하는 다음 명령을 'AAAAAA는'parition 이름

ALTER TABLE XXX DROP PARTITION AAAAAA UPDATE GLOBAL INDEXES 

입니다 .

도움이되기를 바랍니다.