5.11. 범퍼카 토토 파티셔닝

포스트그레SQL기본 테이블 파티셔닝을 지원합니다. 이 섹션에서는 데이터베이스 설계의 일부로 분할을 구현하는 이유와 방법을 설명합니다.

5.11.1. 개요

분할이란 논리적으로 하나의 큰 범퍼카 토토을 더 작은 물리적 조각으로 분할하는 것을 의미합니다. 파티셔닝은 여러 가지 이점을 제공할 수 있습니다.

  • 특정 상황, 특히 범퍼카 토토에서 많이 액세스되는 행의 대부분이 단일 파티션 또는 소수의 파티션에 있는 경우 쿼리 성능이 크게 향상될 수 있습니다. 분할은 인덱스의 상위 트리 수준을 효과적으로 대체하므로 인덱스에서 많이 사용되는 부분이 메모리에 적합할 가능성이 높아집니다.

  • 쿼리 또는 업데이트가 단일 파티션의 상당 부분에 액세스하는 경우 전체 범퍼카 토토에 분산된 무작위 액세스 읽기가 필요한 인덱스를 사용하는 대신 해당 파티션의 순차적 스캔을 사용하여 성능을 향상시킬 수 있습니다.

  • 파티션 설계에서 사용 패턴을 고려한 경우 파티션을 추가하거나 제거하여 대량 로드 및 삭제를 수행할 수 있습니다. 다음을 사용하여 개별 파티션 삭제드롭 범퍼카 토토또는 수행 중범퍼카 토토 분리 파티션 변경는 대량 작업보다 훨씬 빠릅니다. 이 명령은 또한 다음을 완전히 피합니다.진공대량으로 인한 오버헤드삭제.

  • 자주 사용하지 않는 데이터는 더 저렴하고 느린 저장 매체로 마이그레이션할 수 있습니다.

이러한 이점은 일반적으로 범퍼카 토토이 매우 클 경우에만 가치가 있습니다. 범퍼카 토토 분할로 이점을 얻을 수 있는 정확한 지점은 애플리케이션에 따라 다르지만 경험상 범퍼카 토토 크기는 데이터베이스 서버의 물리적 메모리를 초과해야 합니다.

포스트그레SQL다음과 같은 형태의 파티셔닝을 기본적으로 지원합니다:

범위 분할

테이블은 다음과 같이 분할되어 있습니다.범위키 열 또는 열 집합으로 정의되며, 서로 다른 파티션에 할당된 값 범위 간에 중복되지 않습니다. 예를 들어 날짜 범위 또는 특정 비즈니스 개체에 대한 식별자 범위를 기준으로 분할할 수 있습니다. 각 범위의 경계는 낮은 쪽 끝에서는 포함되고 위쪽 끝에서는 제외되는 것으로 이해됩니다. 예를 들어, 한 파티션의 범위가 다음과 같은 경우110, 다음 범위는1020, 값10첫 번째 파티션이 아닌 두 번째 파티션에 속합니다.

목록 분할

범퍼카 토토은 각 파티션에 나타나는 키 값을 명시적으로 나열하여 분할됩니다.

해시 파티셔닝

범퍼카 토토은 각 파티션에 대한 모듈러스와 나머지를 지정하여 파티션됩니다. 각 파티션은 지정된 계수로 나눈 파티션 키의 해시 값이 지정된 나머지를 생성하는 행을 보유합니다.

애플리케이션이 위에 나열되지 않은 다른 형태의 파티셔닝을 사용해야 하는 경우 상속과 같은 대체 방법을 사용하고유니온 올14912_15059

5.11.2. 선언적 파티셔닝

PostgreSQL범퍼카 토토이 파티션으로 나누어져 있음을 선언할 수 있습니다. 분할된 범퍼카 토토을 a라고 합니다.분할된 범퍼카 토토. 선언에는 다음이 포함됩니다.파티셔닝 방법위에 설명된 것과 같이 사용할 열 또는 표현식의 목록파티션 키.

분할된 범퍼카 토토 자체는 다음과 같습니다.가상자체 저장공간이 없는 테이블입니다. 대신 저장소는 다음에 속합니다.파티션는 파티션을 나눈 테이블과 연결된 일반적인 테이블입니다. 각 파티션은 해당 파티션에 정의된 대로 데이터의 하위 집합을 저장합니다.파티션 경계. 분할된 범퍼카 토토에 삽입된 모든 행은 파티션 키 열의 값을 기반으로 파티션 중 적절한 파티션으로 라우팅됩니다. 행의 파티션 키를 업데이트하면 더 이상 원래 파티션의 파티션 경계를 충족하지 않는 경우 다른 파티션으로 이동됩니다.

파티션 자체는 파티션된 테이블로 정의될 수 있으며, 그 결과는 다음과 같습니다.하위 파티셔닝. 모든 파티션에는 분할된 상위 파티션과 동일한 열이 있어야 하지만 파티션에는 다른 파티션과 구별되는 고유한 인덱스, 제약 조건 및 기본값이 있을 수 있습니다. 보다범퍼카 토토 생성파티션을 나눈 테이블 및 파티션 생성에 대한 자세한 내용은.

일반 테이블을 파티션된 테이블로 전환하거나 그 반대로 전환하는 것은 불가능합니다. 그러나 기존 일반 테이블이나 분할된 범퍼카 토토을 분할된 범퍼카 토토의 파티션으로 추가하거나 분할된 범퍼카 토토에서 파티션을 제거하여 독립형 테이블로 전환하는 것이 가능합니다. 이는 많은 유지 관리 프로세스를 단순화하고 속도를 높일 수 있습니다. 보다범퍼카 토토 변경에 대해 자세히 알아보기파티션 연결그리고파티션 분리하위 명령.

파티션도 가능합니다.PostgreSQL : 문서 : 15 : 5.12. 외국 배트맨 토토, 하지만 외부 범퍼카 토토의 내용이 파티셔닝 규칙을 충족하는 것은 사용자의 책임이므로 상당한 주의가 필요합니다. 다른 제한 사항도 있습니다. 보다외부 범퍼카 토토 생성더 많은 정보를 원하시면.

5.11.2.1. 예

대형 아이스크림 회사를 위한 데이터베이스를 구축한다고 가정해 보겠습니다. 회사는 매일 최고기온과 지역별 아이스크림 판매량을 측정하고 있다. 개념적으로 우리는 다음과 같은 테이블을 원합니다.

범퍼카 토토 측정 생성(
    city_id int는 null이 아닙니다.
    logdate 날짜가 null이 아닙니다.
    피크 온도 정수,
    단위 판매 정수
);

이 범퍼카 토토의 주요 용도는 관리를 위한 온라인 보고서를 준비하는 것이기 때문에 대부분의 쿼리는 지난 주, 월 또는 분기의 데이터에만 액세스한다는 것을 알고 있습니다. 저장해야 하는 오래된 데이터의 양을 줄이기 위해 가장 최근 3년치의 데이터만 보관하기로 결정했습니다. 매월 초에 가장 오래된 달의 데이터가 제거됩니다. 이러한 상황에서는 분할을 사용하여 측정 범퍼카 토토에 대한 다양한 요구 사항을 모두 충족할 수 있습니다.

이 경우 선언적 파티셔닝을 사용하려면 다음 단계를 따르십시오.

  1. 만들기측정테이블을 지정하여 파티션을 나눈 테이블로파티션 기준19483_19534범위이 경우) 및 파티션 키로 사용할 열 목록입니다.

    테이블 측정 생성(
        city_id int는 null이 아닙니다.
        logdate 날짜가 null이 아닙니다.
        피크 온도 정수,
        단위 판매 정수
    ) 범위별 파티션(logdate);
  2. 파티션을 생성하십시오. 각 파티션의 정의는 상위 파티션의 파티션 키와 분할 방법에 해당하는 경계를 지정해야 합니다. 새 파티션의 값이 하나 이상의 기존 파티션의 값과 겹치도록 경계를 지정하면 오류가 발생합니다.

    이렇게 생성된 파티션은 모든 면에서 정상입니다.PostgreSQL범퍼카 토토(또는 외부 범퍼카 토토). 각 파티션에 대해 테이블스페이스 및 스토리지 매개변수를 별도로 지정할 수 있습니다.

    우리의 예에서 각 파티션은 한 번에 한 달 분량의 데이터를 삭제하는 요구 사항에 맞게 한 달 분량의 데이터를 보유해야 합니다. 따라서 명령은 다음과 같습니다.

    CREATE TABLE 측정_y2006m02 측정 부분
        ('2006-02-01')부터 ('2006-03-01')까지의 값에 대해;
    
    측정 테이블 만들기_y2006m03 측정 부분
        ('2006-03-01')부터 ('2006-04-01')까지의 값에 대해;
    
    ...
    측정 테이블 만들기_y2007m11 측정 부분
        ('2007-11-01')부터 ('2007-12-01')까지의 값에 대해;
    
    측정 테이블 만들기_y2007m12 측정 부분
        ('2007-12-01')부터 ('2008-01-01')까지의 값에 대해
        TABLESPACE 빠른테이블스페이스;
    
    측정 테이블 만들기_y2008m01 측정 부분
        ('2008-01-01')부터 ('2008-02-01')까지의 값에 대해
        와(parallel_workers = 4)
        TABLESPACE 빠른테이블스페이스;

    (범위 상한은 배타적 경계로 처리되므로 인접한 파티션은 경계 값을 공유할 수 있음을 기억하십시오.)

    하위 파티션을 구현하려면 다음을 다시 지정하십시오.파티션 기준개별 파티션을 생성하는 데 사용되는 명령의 절, 예:

    CREATE TABLE 측정_y2006m02 측정 파티션
        ('2006-02-01')부터 ('2006-03-01')까지의 값에 대해
        범위별 분할(최고 온도);

    파티션 생성 후measurement_y2006m02, 삽입된 모든 데이터측정다음에 매핑됨measurement_y2006m02(또는 직접 삽입된 데이터measurement_y2006m02(파티션 제약 조건이 충족되는 경우 허용됨)은 다음을 기반으로 파티션 중 하나로 추가로 리디렉션됩니다.최고온도열. 지정된 파티션 키는 상위 파티션 키와 겹칠 수 있지만 하위 파티션의 경계를 지정할 때는 허용되는 데이터 집합이 파티션 자체 경계에서 허용하는 하위 집합을 구성하도록 주의해야 합니다. 시스템은 그것이 실제로 사실인지 확인하려고 시도하지 않습니다.

    기존 파티션 중 하나에 매핑되지 않은 상위 ​​테이블에 데이터를 삽입하면 오류가 발생합니다. 적절한 파티션을 수동으로 추가해야 합니다.

    파티션의 파티션 경계 조건을 설명하는 테이블 제약 조건을 수동으로 생성할 필요는 없습니다. 이러한 제약 조건은 자동으로 생성됩니다.

  3. 키 열에 인덱스를 생성하고 분할된 범퍼카 토토에서 원하는 다른 인덱스를 생성하십시오. (키 인덱스는 꼭 필요한 것은 아니지만 대부분의 시나리오에서 도움이 됩니다.) 이렇게 하면 각 파티션에 일치하는 인덱스가 자동으로 생성되고 나중에 생성하거나 연결하는 모든 파티션에도 이러한 인덱스가 있게 됩니다. 분할된 범퍼카 토토에 선언된 인덱스 또는 고유 제약 조건은 다음과 같습니다.가상분할된 범퍼카 토토과 같은 방식으로 실제 데이터는 개별 파티션 테이블의 하위 인덱스에 있습니다.

    측정에 대한 인덱스 생성(로그 날짜);
  4. 다음을 확인하세요.enable_partition_pruning구성 매개변수는 다음에서 비활성화되지 않았습니다.postgresql.conf. 그렇다면 쿼리가 원하는 대로 최적화되지 않습니다.

위의 예에서는 매달 새 파티션을 생성하므로 필요한 DDL을 자동으로 생성하는 스크립트를 작성하는 것이 현명할 수 있습니다.

5.11.2.2. 파티션 유지 관리

일반적으로 테이블을 처음 정의할 때 설정된 파티션 세트는 정적으로 유지되지 않습니다. 오래된 데이터가 들어 있는 파티션을 제거하고 새 데이터에 대해 주기적으로 새 파티션을 추가하려는 것이 일반적입니다. 파티셔닝의 가장 중요한 장점 중 하나는 대량의 데이터를 물리적으로 이동하는 대신 파티션 구조를 조작하여 이 힘든 작업을 거의 즉시 실행할 수 있다는 것입니다.

오래된 데이터를 제거하는 가장 간단한 옵션은 더 이상 필요하지 않은 파티션을 삭제하는 것입니다.

드롭 범퍼카 토토 측정_y2006m02;

모든 기록을 개별적으로 삭제할 필요가 없기 때문에 수백만 개의 기록을 매우 빠르게 삭제할 수 있습니다. 그러나 위 명령에는접속 독점상위 범퍼카 토토을 잠급니다.

흔히 선호되는 또 다른 옵션은 분할된 범퍼카 토토에서 파티션을 제거하지만 그 자체로 테이블로서 해당 파티션에 대한 액세스를 유지하는 것입니다. 여기에는 두 가지 형식이 있습니다.

ALTER TABLE 측정 DETACH PARTITION 측정_y2006m02;
ALTER TABLE 측정 DETACH PARTITION 측정_y2006m02 동시;

이를 통해 데이터가 삭제되기 전에 데이터에 대해 추가 작업을 수행할 수 있습니다. 예를 들어, 이는 종종 다음을 사용하여 데이터를 백업하는 데 유용한 시간입니다.복사, pg_dump또는 유사한 도구. 또한 데이터를 더 작은 형식으로 집계하거나, 다른 데이터 조작을 수행하거나, 보고서를 실행하는 데 유용한 시간이 될 수도 있습니다. 명령의 첫 번째 형식에는가 필요합니다.접속 독점상위 범퍼카 토토을 잠급니다. 추가하기동시두 번째 형식의 한정자는 분리 작업에 필요한 것만 허용업데이트 독점 공유상위 범퍼카 토토을 잠그지만 참조범퍼카 토토 변경...파티션 분리제한 사항에 대한 자세한 내용을 확인하세요.

마찬가지로 우리는 새로운 데이터를 처리하기 위해 새로운 파티션을 추가할 수 있습니다. 위에서 원래 파티션을 생성한 것처럼 파티션을 나눈 테이블에 빈 파티션을 생성할 수 있습니다.

CREATE TABLE 측정_y2008m02 측정 파티션
    ('2008-02-01')부터 ('2008-03-01')까지의 값에 대해
    TABLESPACE 빠른테이블스페이스;

대안으로 파티션 구조 외부에 새 테이블을 생성하고 나중에 파티션으로 연결하는 것이 더 편리한 경우도 있습니다. 이를 통해 분할된 범퍼카 토토에 표시되기 전에 새 데이터를 로드하고 확인하고 변환할 수 있습니다. 게다가,파티션 연결작업에만 필요함업데이트 독점 공유분할된 범퍼카 토토에 대한 잠금, 반대로접속 독점다음에 의해 요구되는 잠금범퍼카 토토 생성 ... 파티션, 따라서 분할된 범퍼카 토토의 동시 작업에 더 친숙합니다. 그만큼범퍼카 토토 생성 ... LIKE옵션은 상위 범퍼카 토토의 정의를 지루하게 반복하는 것을 피하는 데 도움이 됩니다.

범퍼카 토토 생성 측정_y2008m02
  (제약 조건을 포함하는 기본값을 포함하는 측정과 유사)
  TABLESPACE 빠른테이블스페이스;

ALTER TABLE 측정_y2008m02 제약조건 추가 y2008m02
   CHECK ( logdate = DATE '2008-02-01' AND logdate < DATE '2008-03-01' );

\ 'measurement_y2008m02'에서 측정_y2008m02 복사
-- 아마도 다른 데이터 준비 작업

ALTER TABLE 측정 ATTACH PARTITION 측정_y2008m02
    ('2008-02-01')부터 ('2008-03-01' )까지의 값에 대해;

실행하기 전에파티션 연결명령을 생성하는 것이 좋습니다.확인28595_28843확인제약 조건, 테이블은 스캔되어 파티션 제약 조건을 확인하는 동안접속 독점해당 파티션을 잠그세요. 현재 중복된 항목을 삭제하는 것이 좋습니다.확인다음 제약조건파티션 연결완료되었습니다. 연결되는 테이블 자체가 분할된 범퍼카 토토인 경우 각 하위 파티션은 적합할 때까지 반복적으로 잠기고 검색됩니다.확인제약조건이 발생했거나 리프 파티션에 도달했습니다.

마찬가지로, 파티션을 나눈 테이블에기본값파티션을 생성하는 것이 좋습니다.확인연결할 파티션의 제약 조건을 제외하는 제약 조건입니다. 이것이 완료되지 않으면 다음은기본값파티션을 검사하여 연결된 파티션에 있어야 할 레코드가 없는지 확인합니다. 이 작업은를 누른 상태에서 수행됩니다.접속 독점자물쇠를 잠그세요기본값파티션. 만약기본값파티션 자체가 분할된 범퍼카 토토인 경우 위에서 언급한 것처럼 테이블이 연결된 것과 동일한 방식으로 각 파티션이 반복적으로 검사됩니다.

위에서 설명한 것처럼 분할된 범퍼카 토토에 인덱스를 생성하여 전체 계층에 자동으로 적용할 수 있습니다. 이는 기존 파티션뿐만 아니라 향후 생성되는 모든 파티션도 인덱싱되므로 매우 편리합니다. 한 가지 제한 사항은 다음을 사용할 수 없다는 것입니다.동시이러한 분할된 인덱스를 생성할 때의 한정자입니다. 긴 잠금 시간을 피하기 위해 다음을 사용할 수 있습니다.다음에만 인덱스 생성분할된 범퍼카 토토; 이러한 인덱스는 유효하지 않은 것으로 표시되며 파티션에는 인덱스가 자동으로 적용되지 않습니다. 파티션의 인덱스는 다음을 사용하여 개별적으로 생성할 수 있습니다.동시그리고 나서첨부됨다음을 사용하여 상위 항목의 색인에색인 변경 .. 파티션 연결. 모든 파티션의 인덱스가 상위 인덱스에 연결되면 상위 인덱스가 자동으로 유효한 것으로 표시됩니다. 예:

측정값(판매량)만 ON으로 INDEX 생성 측정_usls_idx;

동시에 인덱스 생성 측정_usls_200602_idx
    ON 측정_y2006m02(판매량);
ALTER INDEX 측정_usls_idx
    ATTACH PARTITION 측정_usls_200602_idx;
...

이 기술은 다음과 함께 사용할 수 있습니다.고유그리고기본 키제약조건도 있습니다. 제약 조건이 생성될 때 인덱스가 암시적으로 생성됩니다. 예:

ALTER TABLE ONLY 측정 ADD UNIQUE(city_id, logdate);

ALTER TABLE Measurement_y2006m02 ADD UNIQUE (city_id, logdate);
ALTER INDEX 측정_도시_ID_로그날짜_키
    ATTACH PARTITION 측정_y2006m02_city_id_logdate_key;
...

5.11.2.3. 제한 사항

파티션을 나눈 테이블에는 다음 제한 사항이 적용됩니다.

  • 분할된 범퍼카 토토에 고유 키 또는 기본 키 제약 조건을 생성하려면 파티션 키에 표현식이나 함수 호출이 포함되어서는 안 되며 제약 조건의 열에는 모든 파티션 키 열이 포함되어야 합니다. 제약 조건을 구성하는 개별 인덱스는 자체 파티션 내에서만 직접적으로 고유성을 적용할 수 있기 때문에 이러한 제한이 존재합니다. 따라서 파티션 구조 자체는 다른 파티션에 중복이 없음을 보장해야 합니다.

  • 파티션된 전체 테이블에 걸쳐 제외 제약조건을 생성할 수 있는 방법이 없습니다. 이러한 제약 조건은 각 리프 파티션에만 개별적으로 적용할 수 있습니다. 다시 말하지만, 이 제한은 파티션 간 제한을 적용할 수 없기 때문에 발생합니다.

  • 행 전트리거 켜짐삽입새 행의 최종 대상이 되는 파티션을 변경할 수 없습니다.

  • 동일한 파티션 트리에서 임시 관계와 영구 관계를 혼합하는 것은 허용되지 않습니다. 따라서 분할된 범퍼카 토토이 영구적인 경우 해당 파티션도 영구적이어야 하며 분할된 범퍼카 토토이 임시인 경우에도 마찬가지입니다. 임시 관계를 사용할 때 파티션 트리의 모든 구성원은 동일한 세션에 속해야 합니다.

개별 파티션은 배후에서 상속을 사용하여 파티션된 테이블에 연결됩니다. 그러나 아래 설명된 것처럼 선언적으로 분할된 범퍼카 토토이나 해당 파티션에서는 상속의 일반적인 기능을 모두 사용할 수 없습니다. 특히, 파티션은 자신이 파티션인 분할된 범퍼카 토토 이외의 상위 항목을 가질 수 없으며 테이블은 분할된 범퍼카 토토과 일반 테이블 모두에서 상속될 수 없습니다. 즉, 파티션을 나눈 테이블과 해당 파티션은 일반 테이블과 상속 계층 구조를 공유하지 않습니다.

분할된 범퍼카 토토과 그 파티션으로 구성된 파티션 계층은 여전히 ​​상속 계층이므로,범퍼카 토토로이드그리고 설명된 대로 모든 일반적인 상속 규칙이 적용됩니다.토토 꽁 머니 PostgreSQL : 문서 : 15 : 5.10. 계승, 몇 가지 예외가 있음:

  • 파티션은 상위 파티션에 없는 열을 가질 수 없습니다. 를 사용하여 파티션을 생성할 때 열을 지정할 수 없습니다.범퍼카 토토 생성, 또한 다음을 사용하여 나중에 파티션에 열을 추가하는 것도 불가능합니다.범퍼카 토토 변경. 테이블은 다음을 사용하여 파티션으로 추가될 수 있습니다.범퍼카 토토 변경 ...파티션 연결해당 열이 상위 열과 정확히 일치하는 경우에만 해당합니다.

  • 둘 다확인그리고NULL이 아님분할된 범퍼카 토토의 제약 조건은 항상 모든 파티션에 상속됩니다.확인표시된 제약조건상속 없음분할된 범퍼카 토토에서는 생성이 허용되지 않습니다. 을(를) 삭제할 수 없습니다.NULL이 아님상위 테이블에 동일한 제약 조건이 있는 경우 파티션 열에 대한 제약 조건입니다.

  • 사용 중파티션이 없는 한 파티션을 나눈 테이블에만 제약 조건을 추가하거나 삭제하는 것이 지원됩니다. 파티션이 존재하면 다음을 사용하여이외의 제약 조건에 대해서는 오류가 발생합니다고유그리고기본 키. 대신 파티션 자체에 대한 제약 조건을 추가하고 (상위 테이블에 없는 경우) 삭제할 수 있습니다.

  • 분할된 범퍼카 토토 자체에는 데이터가 없기 때문에 다음을 사용하려고 합니다.잘라내기 분할된 범퍼카 토토에서는 항상 오류가 반환됩니다.

5.11.3. 상속을 사용한 파티셔닝

내장된 선언적 파티셔닝은 가장 일반적인 사용 사례에 적합하지만, 보다 유연한 접근 방식이 유용할 수 있는 몇 가지 상황이 있습니다. 파티셔닝은 테이블 상속을 사용하여 구현할 수 있으며, 이는 다음과 같이 선언적 파티셔닝에서 지원되지 않는 여러 기능을 허용합니다.

  • 선언적 파티셔닝의 경우 파티션은 파티션된 테이블과 정확히 동일한 열 세트를 가져야 하지만 테이블 상속의 경우 하위 테이블에는 상위 테이블에 없는 추가 열이 있을 수 있습니다.

  • 범퍼카 토토 상속은 다중 상속을 허용합니다.

  • 선언적 파티셔닝은 범위, 목록 및 해시 파티셔닝만 지원하는 반면, 테이블 상속을 사용하면 사용자가 선택한 방식으로 데이터를 나눌 수 있습니다. (그러나 제약 조건 제외가 하위 테이블을 효과적으로 정리할 수 없는 경우 쿼리 성능이 저하될 수 있습니다.)

5.11.3.1. 예

이 예는 위의 선언적 파티셔닝 예와 동일한 파티셔닝 구조를 구축합니다. 다음 단계를 따르세요.

  1. 생성루트범퍼카 토토, 그로부터 모든아이테이블이 상속됩니다. 이 테이블에는 데이터가 포함되지 않습니다. 모든 하위 테이블에 동일하게 적용하려는 경우가 아니면 이 테이블에 검사 제약 조건을 정의하지 마십시오. 인덱스나 고유 제약 조건을 정의하는 것도 의미가 없습니다. 이 예에서 루트 테이블은 다음과 같습니다.측정원래 정의된 범퍼카 토토:

    범퍼카 토토 측정 생성(
        city_id int는 null이 아닙니다.
        logdate 날짜가 null이 아닙니다.
        피크 온도 정수,
        단위 판매 정수
    );
  2. 여러 개 생성아이각각 루트 테이블에서 상속되는 테이블. 일반적으로 이러한 테이블은 루트에서 상속된 집합에 열을 추가하지 않습니다. 선언적 파티셔닝과 마찬가지로 이 테이블은 모든 면에서 정상입니다.PostgreSQL범퍼카 토토(또는 외부 범퍼카 토토).

    CREATE TABLE 측정_y2006m02 () 상속(측정);
    CREATE TABLE Measurement_y2006m03 () INHERITS (측정);
    ...
    CREATE TABLE Measurement_y2007m11 () INHERITS (측정값);
    CREATE TABLE Measurement_y2007m12 () INHERITS (측정값);
    CREATE TABLE Measurement_y2008m01 () INHERITS (측정값);
  3. 각 하위 범퍼카 토토에 허용되는 키 값을 정의하려면 하위 범퍼카 토토에 겹치지 않는 범퍼카 토토 제약조건을 추가하세요.

    일반적인 예는 다음과 같습니다:

    확인( x = 1 )
    CHECK( 카운티 IN( '옥스퍼드셔', '버킹엄셔', '워릭셔' ))
    확인( 콘센트 ID = 100 AND 콘센트 ID < 200 )

    제약조건이 서로 다른 하위 테이블에 허용된 키 값 사이에 중복이 없음을 보장하는지 확인하세요. 일반적인 실수는 다음과 같은 범위 제약 조건을 설정하는 것입니다.

    확인( 콘센트 ID 100~200 사이)
    확인(200~300 사이의 콘센트 ID)

    키 값 200이 어느 하위 테이블에 속하는지 명확하지 않기 때문에 이것은 잘못된 것입니다. 대신 범위는 다음 스타일로 정의되어야 합니다:

    CREATE TABLE 측정_y2006m02(
        CHECK( logdate = DATE '2006-02-01' AND logdate < DATE '2006-03-01' )
    ) 상속(측정);
    
    CREATE TABLE 측정_y2006m03(
        CHECK( logdate = DATE '2006-03-01' AND logdate < DATE '2006-04-01' )
    ) 상속(측정);
    
    ...
    CREATE TABLE 측정_y2007m11(
        CHECK( logdate = DATE '2007-11-01' AND logdate < DATE '2007-12-01' )
    ) 상속(측정);
    
    CREATE TABLE 측정_y2007m12(
        CHECK( logdate = DATE '2007-12-01' AND logdate < DATE '2008-01-01' )
    ) 상속(측정);
    
    CREATE TABLE 측정_y2008m01(
        CHECK( logdate = DATE '2008-01-01' AND logdate < DATE '2008-02-01' )
    ) 상속(측정);
  4. 각 하위 테이블에 대해 키 열에 대한 인덱스와 원하는 다른 인덱스를 생성하십시오.

    측정 인덱스 생성 측정_y2006m02_logdate ON 측정_y2006m02(로그 날짜);
    CREATE INDEX 측정_y2006m03_logdate ON 측정_y2006m03(logdate);
    CREATE INDEX 측정_y2007m11_logdate ON 측정_y2007m11(logdate);
    CREATE INDEX 측정_y2007m12_logdate ON 측정_y2007m12(logdate);
    측정_y2008m01_logdate ON 측정 INDEX 생성_y2008m01(로그 날짜);
  5. 우리는 우리의 애플리케이션이 다음과 같이 말할 수 있기를 원합니다.측정에 삽입 ...그리고 데이터가 적절한 하위 테이블로 리디렉션되도록 합니다. 루트 테이블에 적절한 트리거 함수를 연결하여 이를 조정할 수 있습니다. 데이터가 최신 하위 항목에만 추가되는 경우 매우 간단한 트리거 함수를 사용할 수 있습니다.

    함수 생성 또는 교체 Measurement_insert_trigger()
    $$로 트리거 반환
    시작하다
        측정_y2008m01 값에 삽입(신규.*);
        NULL을 반환합니다.
    끝;
    $$
    언어 plpgsql;

    함수를 생성한 후 트리거 함수를 호출하는 트리거를 생성합니다.

    트리거 생성 insert_measurement_trigger
        측정 시 삽입 전
        각 행 실행 함수에 대해 Measurement_insert_trigger();

    우리는 항상 현재 하위 테이블에 삽입되도록 매월 트리거 기능을 다시 정의해야 합니다. 그러나 트리거 정의는 업데이트할 필요가 없습니다.

    우리는 데이터를 삽입하고 행이 추가되어야 하는 하위 테이블을 서버가 자동으로 찾도록 할 수 있습니다. 더 복잡한 트리거 함수를 사용하여 이를 수행할 수 있습니다. 예를 들면 다음과 같습니다.

    함수 생성 또는 교체 Measurement_insert_trigger()
    $$로 트리거 반환
    시작하다
        IF ( NEW.logdate = 날짜 '2006-02-01' AND
             NEW.logdate < DATE '2006-03-01' ) THEN
            측정_y2006m02 값에 삽입(신규.*);
        ELSIF( NEW.logdate = 날짜 '2006-03-01' AND
                NEW.logdate < DATE '2006-04-01' ) THEN
            측정_y2006m03 값에 삽입(신규.*);
        ...
        ELSIF( NEW.logdate = 날짜 '2008-01-01' AND
                NEW.logdate < DATE '2008-02-01' ) THEN
            측정_y2008m01 값에 삽입(신규.*);
        또 다른
            RAISE EXEPTION '날짜가 범위를 벗어났습니다.  Measurement_insert_trigger() 함수를 수정하세요!';
        종료하면;
        NULL을 반환합니다.
    끝;
    $$
    언어 plpgsql;

    트리거 정의는 이전과 동일합니다. 각IF테스트는 정확히 일치해야 합니다.확인하위 범퍼카 토토에 대한 제약 조건.

    이 함수는 한 달의 경우보다 더 복잡하지만 분기가 필요하기 전에 추가될 수 있으므로 자주 업데이트할 필요는 없습니다.

    참고

    실제로 대부분의 삽입이 해당 하위에 들어가는 경우 최신 하위를 먼저 확인하는 것이 가장 좋습니다. 단순화를 위해 이 예시의 다른 부분과 동일한 순서로 트리거 테스트를 표시했습니다.

    삽입을 적절한 하위 테이블로 리디렉션하는 다른 접근 방식은 루트 테이블에 트리거 대신 규칙을 설정하는 것입니다. 예를 들어:

    규칙 만들기 Measurement_insert_y2006m02 AS
    측정 위치에 삽입 중
        ( logdate = DATE '2006-02-01' AND logdate < DATE '2006-03-01' )
    대신에
        측정_y2006m02 값에 삽입(신규.*);
    ...
    측정 규칙 만들기_insert_y2008m01 AS
    측정 위치에 삽입 중
        ( logdate = DATE '2008-01-01' AND logdate < DATE '2008-02-01' )
    대신에
        측정_y2008m01 값에 삽입(신규.*);

    규칙은 트리거보다 훨씬 더 많은 오버헤드를 갖지만 오버헤드는 행당 한 번이 아니라 쿼리당 한 번 지불되므로 이 방법은 대량 삽입 상황에 유리할 수 있습니다. 그러나 대부분의 경우 트리거 방법이 더 나은 성능을 제공합니다.

    주의하세요복사규칙을 무시합니다. 사용하고 싶다면복사데이터를 삽입하려면 루트에 직접 복사하기보다는 올바른 하위 테이블에 복사해야 합니다.복사트리거를 실행하므로 트리거 방식을 사용하면 정상적으로 사용할 수 있습니다.

    규칙 접근법의 또 다른 단점은 규칙 세트가 삽입 날짜를 다루지 않는 경우 오류를 강제할 수 있는 간단한 방법이 없다는 것입니다. 대신 데이터는 자동으로 루트 테이블로 이동합니다.

  6. 다음을 확인하세요.constraint_exclusion구성 매개변수는 다음에서 비활성화되지 않았습니다.postgresql.conf; 그렇지 않으면 하위 범퍼카 토토에 불필요하게 액세스할 수 있습니다.

보시다시피 복잡한 테이블 계층 구조에는 상당한 양의 DDL이 필요할 수 있습니다. 위의 예에서는 매달 새로운 하위 테이블을 생성하므로 필요한 DDL을 자동으로 생성하는 스크립트를 작성하는 것이 현명할 수 있습니다.

5.11.3.2. 상속 분할 유지 관리

오래된 데이터를 빠르게 제거하려면 더 이상 필요하지 않은 하위 테이블을 삭제하세요.

드롭 범퍼카 토토 측정_y2006m02;

상속 계층 범퍼카 토토에서 하위 범퍼카 토토을 제거하지만 자체 권한으로 범퍼카 토토에 대한 액세스를 유지하려면:

ALTER TABLE Measurement_y2006m02 NO INHERIT 측정;

새 데이터를 처리하기 위해 새 하위 테이블을 추가하려면 위에서 원래 하위 테이블을 생성한 것처럼 빈 하위 테이블을 생성하십시오.

범퍼카 토토 생성 측정_y2008m02(
    CHECK( logdate = DATE '2008-02-01' AND logdate < DATE '2008-03-01' )
) 상속(측정);

또는 테이블 계층 구조에 추가하기 전에 새 하위 테이블을 생성하고 채울 수도 있습니다. 이를 통해 상위 테이블의 쿼리에 표시되기 전에 데이터를 로드, 확인 및 변환할 수 있습니다.

범퍼카 토토 생성 측정_y2008m02
  (제약 조건을 포함하는 기본값을 포함하는 측정과 유사);
ALTER TABLE 측정_y2008m02 제약조건 추가 y2008m02
   CHECK ( logdate = DATE '2008-02-01' AND logdate < DATE '2008-03-01' );
\ 'measurement_y2008m02'에서 측정_y2008m02 복사
-- 아마도 다른 데이터 준비 작업
ALTER TABLE Measurement_y2008m02 INHERIT 측정;

5.11.3.3. 주의사항

상속을 사용하여 구현된 분할에는 다음 주의 사항이 적용됩니다:

  • 모든 내용을 확인하는 자동 방법은 없습니다.확인제약조건은 상호 배타적입니다. 하위 테이블을 생성하고 관련 객체를 생성 및/또는 수정하는 코드를 직접 작성하는 것보다 생성하는 것이 더 안전합니다.

  • 인덱스 및 외래 키 제약 조건은 단일 범퍼카 토토에 적용되며 상속 하위에는 적용되지 않으므로 일부가 있습니다.주의사항알아두세요.

  • 여기에 표시된 체계는 행의 키 열 값이 절대 변경되지 않거나 적어도 다른 파티션으로 이동해야 할 만큼 충분히 변경되지 않는다고 가정합니다. 안업데이트그 시도는 다음 때문에 실패할 것입니다.확인제약조건. 이러한 경우를 처리해야 하는 경우 하위 테이블에 적절한 업데이트 트리거를 배치할 수 있지만 이로 인해 구조 관리가 훨씬 더 복잡해집니다.

  • 수동을 사용하는 경우진공또는분석명령을 실행하려면 각 하위 테이블에서 개별적으로 실행해야 한다는 점을 잊지 마세요. 다음과 같은 명령:

    측정 분석;

    루트 테이블만 처리합니다.

  • 삽입다음의 진술충돌 중절이 예상대로 작동하지 않을 것 같습니다.충돌 중하위 관계가 아닌 지정된 대상 관계에 대한 고유 위반의 경우에만 조치가 취해집니다.

  • 애플리케이션이 파티션 구성표를 명시적으로 인식하지 않는 한 행을 원하는 하위 테이블로 라우팅하려면 트리거 또는 규칙이 필요합니다. 트리거는 작성하기가 복잡할 수 있으며 선언적 분할을 통해 내부적으로 수행되는 튜플 라우팅보다 훨씬 느립니다.

5.11.4. 파티션 정리

파티션 정리는 선언적으로 파티션을 나눈 테이블의 성능을 향상시키는 쿼리 최적화 기술입니다. 예를 들어:

SET 활성화_파티션_프루닝 = 켜기;                 -- 기본값
SELECT 개수(*) FROM 측정 WHERE logdate = DATE '2008-01-01';

파티션 정리 없이 위의 쿼리는 다음의 각 파티션을 스캔합니다.측정테이블. 파티션 정리가 활성화되면 플래너는 각 파티션의 정의를 검사하고 쿼리 조건을 충족하는 행을 포함할 수 없기 때문에 파티션을 스캔할 필요가 없음을 증명합니다.어디에서절. 플래너가 이를 증명할 수 있을 때 (자두) 쿼리 계획의 파티션입니다.

EXPLAIN 명령을 사용하여enable_partition_pruning구성 매개변수를 사용하면 파티션이 정리된 계획과 그렇지 않은 계획 간의 차이를 표시할 수 있습니다. 이러한 유형의 테이블 설정에 대한 일반적인 최적화되지 않은 계획은 다음과 같습니다.

SET 활성화_파티션_프루닝 = 꺼짐;
EXPLAIN SELECT count(*) FROM 측정 WHERE logdate = DATE '2008-01-01';
                                    쿼리 계획
------------------------------------------------------​----------------
 집계(비용=188.76..188.77행=1너비=8)
   - 추가(비용=0.00..181.05행=3085 너비=0)
         - 측정 시 시퀀스 스캔_y2006m02(비용=0.00..33.12행=617너비=0)
               필터: (로그 날짜 = '2008-01-01'::날짜)
         - 측정_y2006m03의 시퀀스 스캔(비용=0.00..33.12행=617너비=0)
               필터: (로그 날짜 = '2008-01-01'::날짜)
...
         - 측정_y2007m11의 시퀀스 스캔(비용=0.00..33.12행=617너비=0)
               필터: (로그 날짜 = '2008-01-01'::날짜)
         - 측정_y2007m12의 시퀀스 스캔(비용=0.00..33.12행=617너비=0)
               필터: (로그 날짜 = '2008-01-01'::날짜)
         - 측정_y2008m01의 시퀀스 스캔(비용=0.00..33.12행=617너비=0)
               필터: (로그 날짜 = '2008-01-01'::날짜)

파티션 중 일부 또는 전부는 전체 테이블 순차 스캔 대신 인덱스 스캔을 사용할 수 있지만 여기서 중요한 점은 이 쿼리에 응답하기 위해 이전 파티션을 스캔할 필요가 전혀 없다는 것입니다. 파티션 정리를 활성화하면 동일한 답변을 제공하는 훨씬 더 저렴한 계획을 얻을 수 있습니다.

SET 활성화_파티션_프루닝 = 켜기;
EXPLAIN SELECT count(*) FROM 측정 WHERE logdate = DATE '2008-01-01';
                                    쿼리 계획
------------------------------------------------------​----------------
 집계(비용=37.75..37.76행=1너비=8)
   - 측정_y2008m01의 시퀀스 스캔(비용=0.00..33.12행=617너비=0)
         필터: (로그 날짜 = '2008-01-01'::날짜)

파티션 정리는 인덱스의 존재가 아니라 파티션 키에 의해 암시적으로 정의된 제약 조건에 의해서만 구동된다는 점에 유의하세요. 따라서 키 열에 인덱스를 정의할 필요가 없습니다. 특정 파티션에 대해 인덱스를 만들어야 하는지 여부는 파티션을 검색하는 쿼리가 일반적으로 파티션의 큰 부분을 검색할지 아니면 작은 부분만 검색할지 여부에 따라 달라집니다. 후자의 경우에는 색인이 도움이 되지만 전자의 경우에는 도움이 되지 않습니다.

파티션 정리는 주어진 쿼리를 계획하는 동안뿐만 아니라 쿼리를 실행하는 동안에도 수행될 수 있습니다. 이는 쿼리 계획 시 값을 알 수 없는 표현식(예: a에 정의된 매개변수)이 절에 포함된 경우 더 많은 파티션을 정리할 수 있으므로 유용합니다.준비문, 하위 쿼리에서 얻은 값 사용 또는 중첩 루프 조인 내부의 매개변수화된 값 사용. 실행 중 파티션 정리는 다음 중 언제든지 수행될 수 있습니다.

  • 쿼리 계획을 초기화하는 중. 실행의 초기화 단계 동안 알려진 매개변수 값에 대해 여기에서 파티션 프루닝을 수행할 수 있습니다. 이 단계에서 정리된 파티션은 쿼리에 표시되지 않습니다.설명또는분석 설명. 다음을 관찰하여 이 단계에서 제거된 파티션 수를 확인할 수 있습니다.하위 계획이 제거됨속성설명출력. 이 단계에서 수행된 파티션 정리로 제거된 모든 파티션은 실행 시작 시 여전히 잠겨 있다는 점에 유의하는 것이 중요합니다.

  • 질의 계획의 실제 실행 중. 실제 쿼리 실행 중에만 알려진 값을 사용하여 파티션을 제거하기 위해 여기에서 파티션 정리를 수행할 수도 있습니다. 여기에는 하위 쿼리의 값과 매개변수화된 중첩 루프 조인의 값과 같은 실행 시간 매개변수의 값이 포함됩니다. 이러한 매개변수의 값은 쿼리 실행 중에 여러 번 변경될 수 있으므로 파티션 정리에 사용되는 실행 매개변수 중 하나가 변경될 때마다 파티션 정리가 수행됩니다. 이 단계에서 파티션이 정리되었는지 확인하려면 다음 사항을 주의 깊게 검사해야 합니다.루프속성분석 설명출력. 서로 다른 파티션에 해당하는 하위 계획은 실행 중에 각각이 정리된 횟수에 따라 서로 다른 값을 가질 수 있습니다. 일부는 다음과 같이 표시될 수 있습니다.(실행되지 않음)매번 가지치기를 했다면.

파티션 정리는 다음을 사용하여 비활성화할 수 있습니다.enable_partition_pruning설정.

5.11.5. 분할 및 제약 조건 제외

제약조건 제외은 파티션 정리와 유사한 쿼리 최적화 기술입니다. 레거시 상속 방법을 사용하여 구현된 파티셔닝에 주로 사용되지만 선언적 파티셔닝을 포함한 다른 목적으로도 사용될 수 있습니다.

제약 제외는 각 테이블의 파티션을 사용한다는 점을 제외하면 파티션 정리와 매우 유사한 방식으로 작동합니다.확인제약 - 이름을 부여함 - 반면 파티션 정리는 선언적 파티셔닝의 경우에만 존재하는 테이블의 파티션 경계를 사용합니다. 또 다른 차이점은 제약 조건 제외가 계획 시에만 적용된다는 것입니다. 실행 시 파티션을 제거하려는 시도가 없습니다.

제약 제외가 사용하는 사실확인파티션 정리에 비해 속도가 느린 제약 조건은 때때로 장점으로 사용될 수 있습니다. 선언적으로 파티션을 나눈 테이블에서도 제약 조건을 정의할 수 있기 때문에 내부 파티션 경계 외에도 제약 조건 제외를 통해 쿼리 계획에서 추가 파티션을 제거할 수 있습니다.

기본(권장) 설정은constraint_exclusion둘 다 아님켜짐아니요꺼짐, 그러나 중간 설정은파티션, 이는 상속으로 분할된 범퍼카 토토에서 작업할 가능성이 있는 쿼리에만 이 기술이 적용되도록 합니다. 그만큼켜짐설정으로 인해 기획자가 조사하게 됩니다.확인모든 쿼리에 제약이 있으며, 이점이 없을 것 같은 간단한 쿼리도 마찬가지입니다.

제약조건 제외에는 다음 주의사항이 적용됩니다:

  • 제약조건 제외는 쿼리 실행 중에도 적용될 수 있는 파티션 정리와 달리 쿼리 계획 중에만 적용됩니다.

  • 제약조건 제외는 쿼리가 다음과 같은 경우에만 작동합니다.어디절에 상수(또는 외부에서 제공되는 매개변수)가 포함되어 있습니다. 예를 들어, 다음과 같은 불변 함수와의 비교는 다음과 같습니다.CURRENT_TIMESTAMP플래너는 런타임 시 함수 값이 어떤 하위 범퍼카 토토에 포함될 수 있는지 알 수 없으므로 최적화할 수 없습니다.

  • 파티셔닝 제약 조건을 단순하게 유지하세요. 그렇지 않으면 플래너가 하위 테이블을 방문할 필요가 없다는 것을 증명하지 못할 수도 있습니다. 이전 예제에 설명된 대로 목록 분할에는 간단한 동일 조건을 사용하고, 범위 분할에는 간단한 범위 테스트를 사용합니다. 경험상으로 분할 제약 조건에는 B-트리 색인 생성 가능 연산자를 사용하여 분할 열과 상수의 비교만 포함되어야 합니다. 왜냐하면 B-트리 색인 생성 가능 열만 파티션 키에 허용되기 때문입니다.

  • 상위 범퍼카 토토의 모든 하위에 대한 모든 제약 조건은 제약 조건 제외 중에 검사되므로 하위 항목 수가 많으면 쿼리 계획 시간이 상당히 늘어날 수 있습니다. 따라서 레거시 상속 기반 분할은 최대 100개의 하위 범퍼카 토토까지 잘 작동합니다. 수천 명의 어린이를 이용하려고 하지 마십시오.

5.11.6. 선언적 파티셔닝 모범 사례

범퍼카 토토을 분할하는 방법은 신중하게 선택해야 합니다. 잘못된 설계로 인해 쿼리 계획 및 실행 성능이 부정적인 영향을 받을 수 있기 때문입니다.

가장 중요한 설계 결정 중 하나는 데이터를 분할하는 열입니다. 가장 일반적으로 나타나는 열 또는 열 집합으로 파티션을 나누는 것이 최선의 선택인 경우가 많습니다.어디에서파티션된 테이블에서 실행 중인 쿼리의 절.어디에서62893_63082기본 키또는고유제약. 원치 않는 데이터를 제거하는 것도 파티셔닝 전략을 계획할 때 고려해야 할 요소입니다. 전체 파티션은 상당히 빠르게 분리될 수 있으므로 한 번에 제거할 모든 데이터가 단일 파티션에 위치하도록 파티션 전략을 설계하는 것이 유리할 수 있습니다.

테이블을 나누어야 할 파티션의 목표 수를 선택하는 것도 중요한 결정입니다. 파티션이 충분하지 않으면 인덱스가 너무 크고 데이터 지역성이 좋지 않아 캐시 적중률이 낮아질 수 있습니다. 그러나 테이블을 너무 많은 파티션으로 나누면 문제가 발생할 수도 있습니다. 파티션이 너무 많으면 아래에 자세히 설명된 대로 쿼리 계획 및 실행 중에 쿼리 계획 시간이 길어지고 메모리 소비가 높아질 수 있습니다. 테이블을 분할하는 방법을 선택할 때 향후 발생할 수 있는 변경 사항을 고려하는 것도 중요합니다. 예를 들어, 고객당 하나의 파티션을 선택하고 현재 소수의 대규모 고객을 보유하고 있는 경우, 몇 년 후에 다수의 소규모 고객을 만나게 될 경우의 영향을 고려하십시오. 이 경우 파티션을 선택하는 것이 더 나을 수 있습니다.해시파티션을 시도하기보다는 합리적인 개수의 파티션을 선택하세요.목록그리고 고객 수가 데이터를 분할하는 것이 실용적인 것 이상으로 증가하지 않기를 바라고 있습니다.

하위 파티션은 다른 파티션보다 커질 것으로 예상되는 파티션을 추가로 분할하는 데 유용할 수 있습니다. 또 다른 옵션은 파티션 키에 여러 열이 포함된 범위 파티셔닝을 사용하는 것입니다. 둘 중 하나는 파티션 수가 너무 많아지기 쉬우므로 자제하는 것이 좋습니다.

쿼리 계획 및 실행 중에 분할 오버헤드를 고려하는 것이 중요합니다. 쿼리 플래너는 일반적으로 쿼리 플래너가 소수의 파티션을 제외한 모든 파티션을 정리할 수 있는 경우 최대 수천 개의 파티션이 포함된 파티션 계층 구조를 꽤 잘 처리할 수 있습니다. 플래너가 파티션 정리를 수행한 후 더 많은 파티션이 남아 있으면 계획 시간이 길어지고 메모리 소비도 높아집니다. 많은 수의 파티션을 갖는 것에 대해 우려해야 하는 또 다른 이유는 특히 많은 세션이 많은 수의 파티션에 접근하는 경우 서버의 메모리 소비가 시간이 지남에 따라 크게 증가할 수 있다는 것입니다. 그 이유는 각 파티션에서 해당 파티션에 닿는 각 세션의 로컬 메모리에 해당 메타데이터를 로드해야 하기 때문입니다.

데이터 웨어하우스 유형의 작업 부하에서는 다른 작업 부하보다 더 많은 수의 파티션을 사용하는 것이 합리적일 수 있습니다.OLTP유형 작업 부하. 일반적으로 데이터 웨어하우스에서는 대부분의 처리 시간이 쿼리 실행 중에 소비되므로 쿼리 계획 시간은 그다지 중요하지 않습니다. 이 두 가지 유형의 워크로드 중 하나를 사용하면 대량의 데이터를 다시 분할하는 작업이 엄청나게 느려질 수 있으므로 조기에 올바른 결정을 내리는 것이 중요합니다. 의도한 작업 부하에 대한 시뮬레이션은 분할 전략을 최적화하는 데 도움이 되는 경우가 많습니다. 더 많은 파티션이 더 적은 수의 파티션보다 낫다고 가정하거나 그 반대도 마찬가지입니다.

수정 사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.