이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다메이저 토토 사이트 PostgreSQL : 문서 : 17 : 5.12. 테이블 사설 토토 사이트버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

5.9. 분할

PostgreSQL기본을 지원합니다 테이블 사설 토토 사이트. 이 섹션에서는 이유와 방법에 대해 설명합니다 데이터베이스 디자인의 일부로 사설 토토 사이트 구현.

5.9.1. 개요

사설 토토 사이트은 논리적으로 하나의 큰 것을 분할하는 것을 말합니다 작은 물리적 조각으로 테이블. 분할이 제공 할 수 있습니다 몇 가지 이점 :

  • 쿼리 성능을 크게 향상시킬 수 있습니다 특정 종류의 쿼리.

  • 각 조각이므로 업데이트 성능을 향상시킬 수 있습니다 테이블의 인덱스보다 작은 인덱스가 있습니다. 전체 데이터 세트가 될 것입니다. 인덱스가 더 이상 맞지 않을 때 메모리에서 쉽게, 작업을 읽고 쓰십시오. 인덱스는 점차 더 많은 디스크 액세스를 취합니다.

  • 단순히 하나를 제거하여 벌크 삭제를 수행 할 수 있습니다 사설 토토 사이트의 요구 사항이 계획된 경우 분할 설계.드롭 테이블is 대량보다 훨씬 빠릅니다삭제, to 계속해서 말하지 말라진공오버 헤드.

  • 거의 사용하지 않는 데이터를 저렴하고 느리게 마이그레이션 할 수 있습니다 스토리지 미디어.

혜택은 일반적으로 테이블 일 때만 가치가 있습니다. 그렇지 않으면 매우 클 것입니다. 테이블의 정확한 지점 분할의 혜택은 응용 프로그램에 따라 다릅니다. 경험의 규칙은 테이블의 크기가 데이터베이스 서버의 물리적 메모리를 초과합니다.

현재,PostgreSQL테이블 상속을 통한 파티셔닝을 지원합니다. 각 사설 토토 사이트 단일 부모 테이블의 자식 테이블로 만들어야합니다. 그만큼 부모 테이블 자체는 일반적으로 비어 있습니다. 그것은 단지 존재합니다 전체 데이터 세트를 나타냅니다. 당신은 익숙해야합니다 상속 (참조토토 결과 PostgreSQL : 문서 : 8.1 : 상속) 사설 토토 사이트을 시행하기 전에.

다음 형태의 파티셔닝은에서 구현할 수 있습니다.PostgreSQL:

범위 사설 토토 사이트

테이블이 분할되어"Ranges"키 열 또는 세트로 정의됩니다 값의 범위에 겹치지 않는 열 다른 사설 토토 사이트에 할당됩니다. 예를 들어, 하나는 할 수 있습니다 날짜 범위 또는 식별자 범위별로 분할 특정 비즈니스 개체.

사설 토토 사이트 목록

테이블은 명시 적으로 나열하여 사설 토토 사이트됩니다 각 사설 토토 사이트에 주요 값이 나타납니다.

해시 사설 토토 사이트은 현재 지원되지 않았습니다.

5.9.2. 구현 분할

분할 된 테이블을 설정하려면 다음을 수행하십시오.

  1. 생성"마스터"테이블, 모든 사설 토토 사이트이 상속 될 것입니다.

    이 테이블에는 데이터가 포함되지 않습니다. 수표를 정의하지 마십시오 이 테이블의 제약 조건, 당신이 그들을 의도하지 않는 한 모든 사설 토토 사이트에 똑같이 적용됩니다. 요점이 없습니다 인덱스 또는 고유 한 제약 조건을 정의하고 어느 하나.

  2. 여러 생성"Child"테이블 마스터 테이블에서 각각 상속합니다. 일반적으로, 이것들 테이블은 상속 된 세트에 열을 추가하지 않습니다. 마스터.

    우리는 하위 테이블을 사설 토토 사이트이라고합니다. 그들은 모든면에서 정상입니다PostgreSQL테이블.

  3. 사설 토토 사이트 테이블에 테이블 제약 조건을 추가하여 정의합니다 각 사설 토토 사이트에서 허용 된 주요 값.

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

    check (x = 1)
    Check (County in County ( 'Oxfordshire', 'Buckinghamshire', 'Warwickshire'))))
    Check (outletid = 100 및 outletid <200)

    제약 조건에 없음을 보장하십시오 다르게 허용되는 키 값간에 중첩됩니다 사설 토토 사이트. 일반적인 실수는 범위 제약 조건을 설정하는 것입니다 이와 같이:

    점검 (100에서 200 사이의 outletid)
    확인 (200에서 300 사이의 outletid)

    이것은 어느 사설 토토 사이트이 있는지 명확하지 않기 때문에 잘못되었습니다. 키 값은 200에 속합니다.

    범위 간의 구문에는 차이가 없습니다. 사설 토토 사이트을 나열합니다. 이러한 용어는 설명 적입니다 오직.

  4. 각 사설 토토 사이트마다 키에 인덱스를 만듭니다 열, 원하는 다른 인덱스뿐만 아니라 열이 있습니다. (주요 지수는 엄격하게 필요하지 않지만 대부분 시나리오 도움이됩니다. 핵심 값을 의도한다면 독특한 그러면 항상 독특한 또는 각 사설 토토 사이트에 대한 1 차 키 제약 조건.)

  5. 선택적으로, 규칙을 정의하거나 리디렉션을 방지합니다 마스터 테이블의 적절한 수정 분할.

  6. 제약 _exclusion구성 매개 변수가 활성화되어postgresql.conf. 이것 없이는 쿼리가됩니다 원하는대로 최적화되지 않습니다.

예를 들어, 우리가 대형 아이스크림 회사. 회사는 최대 온도를 측정합니다 각 지역의 아이스크림 판매뿐만 아니라 매일. 개념적으로 우리는 다음과 같은 테이블을 원합니다 :

테이블 측정 생성 (
    city_id int null not,
    로그 데이트 날짜는 null이 아닙니다.
    PeakTemp int,
    단위 int
);

우리는 대부분의 쿼리가 지난 주에만 액세스 할 것임을 알고 있습니다. 이 테이블의 주요 사용 이후 월 또는 분기 데이터 관리를 위해 온라인 보고서를 준비하는 것입니다. 줄이기 위해 저장 해야하는 오래된 데이터의 양, 우리는 가장 최근 3 년간의 데이터를 유지하십시오. 시작시 매달 우리는 가장 오래된 달의 데이터를 제거 할 것입니다.

이 상황에서 우리는 파티셔닝을 사용하여 우리가 만나는 데 도움을 줄 수 있습니다. 측정 테이블에 대한 모든 다른 요구 사항. 위에서 설명한 단계에 따라 파티션을 설정할 수 있습니다. 다음과 같이 :

  1. 마스터 테이블은입니다.측정테이블, 정확히 다음과 같이 선언했습니다 위에.

  2. 다음으로 우리는 활성 달마다 하나의 파티션을 만듭니다 :

    테이블 측정 생성 _yy04mm02 () 상속 (측정);
    테이블 측정 _yy04mm03 () 상속 (측정)을 만듭니다.
    ...
    테이블 측정 _yy05mm11 () 상속 (측정)을 만듭니다.
    테이블 측정 _yy05mm12 () 상속 (측정)을 만듭니다.
    테이블 측정 _yy06mm01 () 상속 (측정); 생성

    각 사설 토토 사이트은 자신의 완전한 테이블입니다. 맞아요.하지만 그들은에서 그들의 정의를 물려받습니다.측정테이블.

    이것은 우리의 문제 중 하나를 해결합니다 : 이전 데이터 삭제. 각 달, 우리가해야 할 일은 a를 수행하는 것입니다.드롭 테이블가장 오래된 어린이 테이블에서 새 달의 데이터에 대한 새 자식 테이블 만들기.

  3. 우리는 겹치지 않는 테이블 제약 조건을 추가해야합니다 테이블 작성 스크립트가됩니다.

    테이블 측정 생성 _yy04mm02 (
        check (logdate = date '2004-02-01'및 logdate <날짜 '2004-03-01'))
    ) 상속 (측정);
    테이블 측정 _yy04mm03 만들기 (
        check (logdate = date '2004-03-01'및 logdate <날짜 '2004-04-01')
    ) 상속 (측정);
    ...
    테이블 측정 값 생성 _yy05mm11 (
        check (logdate = date '2005-11-01'및 logdate <날짜 '2005-12-01'))
    ) 상속 (측정);
    테이블 측정 값 생성 _yy05mm12 (
        check (logdate = date '2005-12-01'및 logdate <날짜 '2006-01-01')
    ) 상속 (측정);
    테이블 측정 _yy06mm01 생성 (
        check (logdate = date '2006-01-01'및 logdate <날짜 '2006-02-01')
    ) 상속 (측정);
  4. 우리는 아마도 주요 열에 인덱스가 필요할 것입니다 :

    Measurement_YY04MM02 (logdate)에서 인덱스 측정 _yy04mm02_logdate 만들기;
    Measurement_YY04MM03 (logdate)에서 색인 측정 _yy04mm03_logdate를 만듭니다.
    ...
    Measurement_YY05MM11 (logdate)에서 색인 측정 _yy05mm11_logdate를 만듭니다.
    Measurement_YY05MM12 (logdate)에서 인덱스 측정 _yy05mm12_logdate를 만듭니다.
    인덱스 측정 값을 만듭니다.

    현재 추가 인덱스를 추가하지 않기로 선택합니다.

  5. 데이터가 최신 사설 토토 사이트에만 추가되면 우리는 데이터를 삽입하는 매우 간단한 규칙을 설정할 수 있습니다. 우리는해야합니다 매달 매월 재정의하여 항상 현재 사설 토토 사이트.

    규칙 측정을 만들거나 교체하십시오
    측정에 삽입합니다
    대신하십시오
        측정 _yy06mm01 값 (new.city_id,
                                                  new.logdate,
                                                  new.peaktemp,
                                                  new.unitsales);

    우리는 데이터를 삽입하고 서버를 가질 수 있습니다. 행이있는 사설 토토 사이트을 자동으로 찾습니다 추가해야합니다. 우리는 더 복잡한 세트로 이것을 할 수 있습니다 아래에 표시된 규칙의.

    규칙 생성 _insert_yy04mm02 AS
    측정 값으로 삽입하십시오
        (logdate = date '2004-02-01'및 logdate <날짜 '2004-03-01'))
    대신하십시오
        측정 _yy04mm02 값 (new.city_id,
                                                  new.logdate,
                                                  new.peaktemp,
                                                  new.unitsales);
    ...
    규칙 측정 _insert_yy05mm12를 만듭니다
    측정 값으로 삽입하십시오
        (logdate = date '2005-12-01'및 logdate <날짜 '2006-01-01'))
    대신하십시오
        측정 _yy05mm12 값 (new.city_id,
                                                  new.logdate,
                                                  new.peaktemp,
                                                  new.unitsales);
    규칙 측정 _insert_yy06mm01을 만듭니다
    측정 값으로 삽입하십시오
        (logdate = date '2006-01-01'및 logdate <날짜 '2006-02-01'))
    대신하십시오
        측정 _yy06mm01 값 (new.city_id,
                                                  new.logdate,
                                                  new.peaktemp,
                                                  new.unitsales);

    여기서조항 각 규칙은 정확히 일치합니다check사설 토토 사이트에 대한 제약 조건.

우리가 볼 수 있듯이 복잡한 분할 계획에는 상당한 양의 DDL. 위의 예에서는 우리가 될 것입니다 매달 새로운 파티션을 만들므로 글을 쓰는 것이 현명 할 수 있습니다. 필요한 DDL을 자동으로 생성하는 스크립트.

다음 경고가 적용됩니다 :

  • 현재 모든 것을 확인할 방법이 없습니다check제약은 상호입니다 독점적인. 데이터베이스 디자이너는 치료가 필요합니다.

  • 현재 행을 지정할 간단한 방법은 없습니다. 마스터 테이블에 삽입해서는 안됩니다. 에이check (false)마스터 테이블의 제약 모든 어린이 테이블에 의해 상속 될 것이므로 이 목적으로 사용됩니다. 한 가지 가능성은를 설정하는 것입니다.insert마스터 트리거 항상 오류가 발생하는 테이블. (또는 그러한 A. 트리거를 사용하여 데이터를 올바른 상태로 리디렉션 할 수 있습니다. 제안 된대로 일련의 규칙을 사용하는 대신 자식 테이블 위에.)

사설 토토 사이트도 A를 정리할 수 있습니다Union All보기 :

보기 측정을 만듭니다
          Measurement_yy04mm02에서 *를 선택하십시오
Union All Select * From Measurement_YY04MM03
...
Union All Select * From Measurement_YY05MM11
Union All Select * From Measurement_YY05MM12
Union All Select * From Measurement_YY06MM01;

그러나 제약 제외는 현재 지원되지 않습니다 이러한 방식으로 정의 된 파티션 된 테이블. 또한 필요합니다 보기 재창조를 추가하고 추가 및 떨어 뜨리는 추가 단계가 추가됩니다. 데이터 세트의 개별 파티션.

5.9.3. 분할 및 제약 제외

제약 제외쿼리입니다 성능을 향상시키는 최적화 기술 위에서 설명한 방식으로 정의 된 파티션 테이블. 처럼 예 :

SET SORMSARTAINT_EXCLUSION = ON;
로그 데이트 = 날짜 '2006-01-01'; 측정에서 count (*)를 선택하십시오.

제약 제외가 없으면 위의 쿼리가 스캔됩니다 의 각 파티션측정테이블. 제약 제외 활성화 된 플래너는 각각의 제약 조건을 조사합니다 파티션이 파티션이 될 필요가 없음을 증명하려고 노력합니다. 줄을 섭취 할 수 없기 때문에 스캔했습니다. 쿼리여기서절. 플래너시기 이것을 증명할 수 있고, 쿼리에서 사설 토토 사이트을 제외합니다. 계획.

를 사용할 수 있습니다설명명령으로 계획의 차이점제약 _exclusionon 및 계획. 이 유형의 테이블 설정에 대한 일반적인 기본 계획은 다음과 같습니다.

SET SERPARTAINT_EXCLUSION = OFF;
로그 데이트 = 날짜 '2006-01-01'에서 측정에서 선택한 수 (*)를 설명하십시오.

                                          쿼리 계획
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 집계 (비용 = 158.66..158.68 행 = 1 너비 = 0)
   - Append (비용 = 0.00..151.88 행 = 2715 너비 = 0)
         - 측정시 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)
         - 측정 _yy04mm02 측정에서 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)
         - 측정 _yy04mm03 측정에서 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)
...
         - 측정 _yy05mm12 측정에서 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)
         - 측정 _yy06mm01 측정에서 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)

파티션 중 일부 또는 전부는 대신 인덱스 스캔을 사용할 수 있습니다. 전체 테이블 순차적 스캔이지만 여기서 요점은 대답하기 위해 이전 파티션을 전혀 스캔 할 필요가 없습니다. 이 쿼리. 제약 제외를 활성화하면 a를 얻습니다 동일하게 제공 할 계획을 크게 줄였습니다 답변:

SET SORMSARTAINT_EXCLUSION = ON;
로그 데이트 = 날짜 '2006-01-01'에서 측정에서 선택한 수 (*)를 설명하십시오.
                                          쿼리 계획
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------.
 집계 (비용 = 63.47..63.48 행 = 1 너비 = 0)
   - Append (비용 = 0.00..60.75 행 = 1086 너비 = 0)
         - 측정시 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)
         - 측정 _yy06mm01 측정에서 SEQ 스캔 (비용 = 0.00..30.38 행 = 543 너비 = 0)
               필터 : (logdate = '2006-01-01':: 날짜)

제약 제외는에 의해서만 구동됩니다.check존재가 아니라 제약 인덱스. 따라서 인덱스를 정의 할 필요는 없습니다 주요 열. 주어진에 대해 인덱스를 만들어야하는지 여부 사설 토토 사이트은 스캔 쿼리를 기대하는지 여부에 따라 사설 토토 사이트은 일반적으로 사설 토토 사이트의 많은 부분을 스캔합니다. 아니면 작은 부분. 색인은 후자에 도움이 될 것입니다 사례는 아니지만 전자는 아닙니다.

다음 경고가 적용됩니다 :

  • 제약 제외는 쿼리의 경우에만 작동합니다여기서절은 상수를 포함합니다. 에이 매개 변수화 된 쿼리는 이후로 최적화되지 않습니다 Planner는 매개 변수 값을 분할 할 수 없습니다 런타임에 선택할 수 있습니다. 같은 이유로"안정된"다음과 같은 기능current_date피해야합니다. 가입 다른 테이블의 열에 대한 사설 토토 사이트 키는 그렇지 않습니다. 최적화.

  • check플래너와대로 제약 조건 현재 그러한 조건이 거짓을 증명하지 못한다. 예를 들어, 다음 제약 조건이 작동합니다xisInteger열이지만 ifxisbigint:

    check (x = 1)

    abigint열을 사용해야합니다 제약 조건 :

    check (x = 1 :: bigint)

    문제는에 국한되지 않습니다.bigint데이터 유형 -마다 발생할 수 있습니다 상수의 기본 데이터 유형은 데이터와 일치하지 않습니다. 비교되는 열의 유형. 제공된 쿼리의 교차-다타 타입 비교는 다음과 같습니다 보통 괜찮아,check조건

  • 업데이트삭제마스터 테이블에 대한 명령 현재 제약 제외를 수행하지 않습니다.

  • 마스터 테이블의 모든 파티션에 대한 모든 제약 제약 제외로 고려되므로 많은 수가 있습니다 파티션의 쿼리 계획 시간이 증가 할 가능성이 높습니다 상당히.

  • 여전히 실행해야한다는 것을 잊지 마십시오분석각 사설 토토 사이트에서 개별적으로. 에이 명령

    측정 분석;

    마스터 테이블 만 처리합니다.