PostgreSQL기본 테이블 파티셔닝을 지원합니다. 이 섹션에서는 데이터베이스 설계의 일부로 분할을 구현하는 이유와 방법을 설명합니다.
파티션이란 논리적으로 하나의 큰 스포츠 토토 베트맨을 더 작은 물리적 조각으로 분할하는 것을 의미합니다. 파티셔닝은 여러 가지 이점을 제공할 수 있습니다.
특정 상황, 특히 스포츠 토토 베트맨에서 많이 액세스되는 행의 대부분이 단일 파티션 또는 소수의 파티션에 있는 경우 쿼리 성능이 크게 향상될 수 있습니다. 분할은 인덱스의 선행 열을 대체하여 인덱스 크기를 줄이고 인덱스에서 많이 사용되는 부분이 메모리에 들어갈 가능성을 높입니다.
쿼리 또는 업데이트가 단일 파티션의 상당 부분에 액세스하는 경우 전체 스포츠 토토 베트맨에 분산된 인덱스 및 무작위 액세스 읽기를 사용하는 대신 해당 파티션의 순차적 스캔을 활용하여 성능을 향상시킬 수 있습니다.
대량 로드 및 삭제는 해당 요구 사항이 파티션 설계에 계획된 경우 파티션을 추가하거나 제거하여 수행할 수 있습니다. 하는 중스포츠 토토 베트맨 분리 파티션 변경또는 다음을 사용하여 개별 파티션 삭제드롭 스포츠 토토 베트맨대량 작업보다 훨씬 빠릅니다. 이 명령은 또한 다음을 완전히 피합니다.진공대량으로 인한 오버헤드삭제.
자주 사용하지 않는 데이터는 더 저렴하고 느린 저장 매체로 마이그레이션할 수 있습니다.
이점은 일반적으로 스포츠 토토 베트맨이 매우 클 경우에만 가치가 있습니다. 스포츠 토토 베트맨 분할로 이점을 얻을 수 있는 정확한 지점은 애플리케이션에 따라 다르지만 경험상 스포츠 토토 베트맨 크기는 데이터베이스 서버의 물리적 메모리를 초과해야 합니다.
포스트그레SQL다음과 같은 형태의 파티셔닝을 기본적으로 지원합니다.
테이블은 다음과 같이 분할되어 있습니다.“범위”키 열 또는 열 집합으로 정의되며, 서로 다른 파티션에 할당된 값 범위 간에 중복되지 않습니다. 예를 들어 날짜 범위 또는 특정 비즈니스 개체에 대한 식별자 범위를 기준으로 분할할 수 있습니다.
스포츠 토토 베트맨은 각 파티션에 나타나는 키 값을 명시적으로 나열하여 분할됩니다.
애플리케이션이 위에 나열되지 않은 다른 형태의 파티셔닝을 사용해야 하는 경우 상속과 같은 대체 방법을 사용하고유니온 올14038_14185
PostgreSQL스포츠 토토 베트맨을 파티션이라는 조각으로 나누는 방법을 지정하는 방법을 제공합니다. 분할된 스포츠 토토 베트맨을 a라고 합니다.분할된 스포츠 토토 베트맨. 사양은 다음과 같이 구성됩니다.파티셔닝 방법및 다음으로 사용할 열 또는 표현식 목록파티션 키.
분할된 스포츠 토토 베트맨에 삽입된 모든 행은 다음 중 하나로 라우팅됩니다.파티션파티션 키 값을 기준으로 합니다. 각 파티션에는 해당 파티션에 의해 정의된 데이터의 하위 집합이 있습니다.파티션 경계. 현재 지원되는 파티셔닝 방법에는 범위와 목록이 포함되며, 여기서 각 파티션에는 각각 키 범위와 키 목록이 할당됩니다.
파티션 자체는 소위 말하는 것을 사용하여 파티션된 테이블로 정의될 수 있습니다.하위 파티셔닝. 파티션에는 다른 파티션과 구별되는 고유한 인덱스, 제약 조건 및 기본값이 있을 수 있습니다. 인덱스는 각 파티션에 대해 별도로 생성되어야 합니다. 보다스포츠 토토 베트맨 생성분할된 스포츠 토토 베트맨 및 파티션 생성에 대한 자세한 내용은.
일반 테이블을 파티션된 테이블로 또는 그 반대로 전환하는 것은 불가능합니다. 그러나 데이터가 포함된 일반 테이블이나 분할된 스포츠 토토 베트맨을 분할된 스포츠 토토 베트맨의 파티션으로 추가하거나 분할된 스포츠 토토 베트맨에서 파티션을 제거하여 독립형 테이블로 전환하는 것이 가능합니다. 참조스포츠 토토 베트맨 변경에 대해 자세히 알아보려면파티션 연결그리고파티션 분리하위 명령.
개별 파티션은 배후에서 상속을 통해 파티션된 테이블에 연결됩니다. 그러나 분할된 스포츠 토토 베트맨과 파티션에는 이전 섹션에서 설명한 상속 기능 중 일부를 사용할 수 없습니다. 예를 들어, 파티션은 자신이 파티션인 분할된 스포츠 토토 베트맨 이외의 상위 항목을 가질 수 없으며 일반 테이블은 분할된 스포츠 토토 베트맨을 상위 항목으로 만드는 분할된 스포츠 토토 베트맨에서 상속할 수 없습니다. 이는 분할된 스포츠 토토 베트맨과 파티션이 일반 테이블과의 상속에 참여하지 않음을 의미합니다. 분할된 스포츠 토토 베트맨과 그 파티션으로 구성된 파티션 계층은 여전히 상속 계층이므로,스포츠 토토 베트맨로이드그리고 설명된 대로 모든 일반적인 상속 규칙이 적용됩니다.와이즈 토토 PostgreSQL : 문서 : 10 : 5.9. 계승몇 가지 예외가 있지만 특히 다음과 같습니다.
둘 다확인그리고NULL이 아님분할된 스포츠 토토 베트맨의 제약 조건은 항상 모든 파티션에 상속됩니다.확인표시된 제약조건상속 없음분할된 스포츠 토토 베트맨에서는 생성이 허용되지 않습니다.
사용 중만파티션이 없을 때 파티션을 나눈 테이블에만 제약 조건을 추가하거나 삭제하는 기능이 지원됩니다. 파티션이 존재하면 다음을 사용하여만파티션이 있는 경우 파티션을 나눈 테이블에만 제약 조건을 추가하거나 삭제하는 것은 지원되지 않으므로 오류가 발생합니다. 대신, 부모 테이블에 없는 제약 조건을 파티션에 직접 추가하거나 삭제할 수 있습니다. 분할된 스포츠 토토 베트맨에는 직접 데이터가 없으므로 다음을 사용하려고 합니다.잘라내기 만파티션을 나눈 테이블에서는 항상 오류가 반환됩니다.
파티션은 상위 파티션에 없는 열을 가질 수 없습니다. 를 사용하여 파티션을 생성할 때 열을 지정할 수 없습니다.스포츠 토토 베트맨 생성다음을 사용하여 나중에 파티션에 열을 추가하는 것도 불가능합니다.스포츠 토토 베트맨 변경. 테이블은 다음을 사용하여 파티션으로 추가될 수 있습니다.스포츠 토토 베트맨 변경...파티션 연결해당 열이 상위 항목을 포함하여 정확히 일치하는 경우에만oid열.
당신은 삭제할 수 없습니다NULL이 아님제약조건이 상위 테이블에 있는 경우 파티션 열에 대한 제약조건입니다.
파티션은 외부 테이블일 수도 있습니다(참조외부 스포츠 토토 베트맨 생성), 일반 테이블에는 없는 몇 가지 제한 사항이 있습니다. 예를 들어, 파티션을 나눈 테이블에 삽입된 데이터는 외부 테이블 파티션으로 라우팅되지 않습니다.
우리가 대형 아이스크림 회사를 위한 데이터베이스를 구축하고 있다고 가정해 보겠습니다. 회사는 매일 최고기온과 지역별 아이스크림 판매량을 측정하고 있다. 개념적으로 우리는 다음과 같은 테이블을 원합니다.
스포츠 토토 베트맨 측정 생성(
city_id int는 null이 아닙니다.
logdate 날짜가 null이 아닙니다.
피크 온도 정수,
단위 판매 정수
);
이 스포츠 토토 베트맨의 주요 용도는 관리를 위한 온라인 보고서를 준비하는 것이기 때문에 대부분의 쿼리는 지난 주, 월 또는 분기의 데이터에만 액세스한다는 것을 알고 있습니다. 저장해야 하는 오래된 데이터의 양을 줄이기 위해 가장 최근 3년치의 데이터만 보관하기로 결정했습니다. 매월 초에 가장 오래된 달의 데이터가 제거됩니다. 이러한 상황에서는 분할을 사용하여 측정 스포츠 토토 베트맨에 대한 다양한 요구 사항을 모두 충족할 수 있습니다.
이 경우 선언적 파티셔닝을 사용하려면 다음 단계를 따르십시오.
생성측정테이블을 지정하여 파티션을 나눈 테이블로파티션 기준20629_20680범위이 경우) 및 파티션 키로 사용할 열 목록입니다.
테이블 측정 생성(
city_id int는 null이 아닙니다.
logdate 날짜가 null이 아닙니다.
피크 온도 정수,
단위 판매 정수
) 범위별 파티션(logdate);
원하는 경우 범위 분할을 위해 파티션 키에 여러 열을 사용하도록 결정할 수 있습니다. 물론 이로 인해 더 많은 수의 파티션이 생성되고 각 파티션은 개별적으로 더 작아지는 경우가 많습니다. 반면에 더 적은 수의 열을 사용하면 더 적은 수의 파티션으로 더 거친 분할 기준이 발생할 수 있습니다. 분할된 스포츠 토토 베트맨에 액세스하는 쿼리는 조건에 이러한 열 중 일부 또는 전부가 포함되는 경우 더 적은 수의 파티션을 검색해야 합니다. 예를 들어 열을 사용하여 분할된 스포츠 토토 베트맨 범위를 생각해 보세요.성그리고이름(이 순서대로) 파티션 키로 사용됩니다.
파티션을 생성하십시오. 각 파티션의 정의는 상위 파티션의 파티션 키와 분할 방법에 해당하는 경계를 지정해야 합니다. 새 파티션의 값이 하나 이상의 기존 파티션의 값과 겹치도록 경계를 지정하면 오류가 발생합니다. 기존 파티션 중 하나에 매핑되지 않는 상위 테이블에 데이터를 삽입하면 오류가 발생합니다. 적절한 파티션을 수동으로 추가해야 합니다.
이렇게 생성된 파티션은 모든 면에서 정상입니다.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(파티션 제약 조건을 충족하는 경우)은 다음을 기반으로 파티션 중 하나로 추가로 리디렉션됩니다.최고온도열. 지정된 파티션 키는 상위 파티션 키와 겹칠 수 있지만 하위 파티션의 경계를 지정할 때는 허용되는 데이터 집합이 파티션 자체 경계에서 허용하는 하위 집합을 구성하도록 주의해야 합니다. 시스템은 그것이 실제로 사실인지 확인하려고 시도하지 않습니다.
키 열에 인덱스를 생성하고 모든 파티션에 대해 원하는 다른 인덱스를 생성하십시오. (키 인덱스는 꼭 필요한 것은 아니지만 대부분의 시나리오에서 도움이 됩니다. 키 값을 고유하게 만들려면 항상 각 파티션에 대해 고유 또는 기본 키 제약 조건을 만들어야 합니다.)
측정에 대한 인덱스 생성_y2006m02(로그 날짜); 측정에 대한 인덱스 생성_y2006m03(logdate); ... 측정에 대한 인덱스 생성_y2007m11(logdate); 측정에 대한 인덱스 생성_y2007m12(logdate); 측정에 대한 인덱스 생성_y2008m01(로그 날짜);
다음을 확인하세요.constraint_exclusion구성 매개변수는 다음에서 비활성화되지 않았습니다.postgresql.conf. 그렇다면 쿼리가 원하는 대로 최적화되지 않습니다.
위의 예에서는 매달 새 파티션을 생성하므로 필요한 DDL을 자동으로 생성하는 스크립트를 작성하는 것이 현명할 수 있습니다.
일반적으로 테이블을 처음 정의할 때 설정된 파티션 세트는 정적으로 유지되지 않습니다. 데이터의 오래된 파티션을 제거하고 새 데이터에 대해 주기적으로 새 파티션을 추가하려는 것이 일반적입니다. 파티셔닝의 가장 중요한 장점 중 하나는 대량의 데이터를 물리적으로 이동하는 대신 파티션 구조를 조작하여 이 힘든 작업을 거의 즉시 실행할 수 있다는 것입니다.
오래된 데이터를 제거하는 가장 간단한 옵션은 더 이상 필요하지 않은 파티션을 삭제하는 것입니다:
드롭 스포츠 토토 베트맨 측정_y2006m02;
모든 기록을 개별적으로 삭제할 필요가 없기 때문에 수백만 개의 기록을 매우 빠르게 삭제할 수 있습니다. 그러나 위 명령에는접속 독점상위 스포츠 토토 베트맨을 잠급니다.
흔히 선호되는 또 다른 옵션은 분할된 스포츠 토토 베트맨에서 파티션을 제거하지만 그 자체로 테이블로서 이에 대한 액세스를 유지하는 것입니다:
ALTER TABLE 측정 DETACH PARTITION 측정_y2006m02;
이를 통해 데이터가 삭제되기 전에 데이터에 대해 추가 작업을 수행할 수 있습니다. 예를 들어, 이는 종종 다음을 사용하여 데이터를 백업하는 데 유용한 시간입니다.복사, pg_dump또는 유사한 도구. 또한 데이터를 더 작은 형식으로 집계하거나, 다른 데이터 조작을 수행하거나, 보고서를 실행하는 데 유용한 시간이 될 수도 있습니다.
마찬가지로 우리는 새로운 데이터를 처리하기 위해 새로운 파티션을 추가할 수 있습니다. 위에서 원래 파티션을 생성한 것처럼 파티션된 테이블에 빈 파티션을 생성할 수 있습니다.
CREATE TABLE 측정_y2008m02 측정 파티션
('2008-02-01')부터 ('2008-03-01')까지의 값에 대해
TABLESPACE 빠른테이블스페이스;
대안으로 파티션 구조 외부에 새 테이블을 생성하고 나중에 적절한 파티션으로 만드는 것이 더 편리한 경우도 있습니다. 이를 통해 데이터가 분할된 스포츠 토토 베트맨에 표시되기 전에 데이터를 로드, 확인 및 변환할 수 있습니다.
스포츠 토토 베트맨 생성 측정_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' )까지의 값에 대해;
실행하기 전에파티션 연결명령을 생성하는 것이 좋습니다.확인원하는 파티션 제약 조건과 일치하는 연결될 테이블 제약 조건. 이렇게 하면 시스템은 암시적 파티션 제약 조건을 확인하기 위한 스캔을 건너뛸 수 있습니다. 없이확인제약 조건, 테이블을 스캔하여 파티션 제약 조건을 확인하는 동안접속 독점상위 스포츠 토토 베트맨을 잠급니다. 중복을 삭제하는 것이 바람직할 수 있습니다.확인이후 제약조건파티션 연결완료되었습니다.
파티션을 나눈 테이블에는 다음 제한 사항이 적용됩니다.
모든 파티션에 일치하는 색인을 자동으로 생성할 수 있는 기능은 없습니다. 별도의 명령을 사용하여 각 파티션에 인덱스를 추가해야 합니다. 이는 또한 모든 파티션에 걸쳐 기본 키, 고유 제약 조건 또는 제외 제약 조건을 생성할 수 있는 방법이 없음을 의미합니다. 각 리프 파티션을 개별적으로 제한하는 것만 가능합니다.
분할된 스포츠 토토 베트맨에서는 기본 키가 지원되지 않으므로 분할된 스포츠 토토 베트맨을 참조하는 외래 키는 지원되지 않으며, 분할된 스포츠 토토 베트맨에서 다른 테이블로의 외래 키 참조도 지원되지 않습니다.
사용충돌 중파티션된 테이블이 있는 절은 오류를 발생시킵니다. 고유 또는 제외 제약조건은 개별 파티션에서만 생성될 수 있기 때문입니다. 전체 분할 계층 구조에 걸쳐 고유성(또는 제외 제약 조건)을 적용하는 기능은 지원되지 않습니다.
안업데이트행의 새 값이 원래 파티션의 암시적 파티션 제약 조건을 충족하지 못하기 때문에 행을 한 파티션에서 다른 파티션으로 이동하는 것은 실패합니다.
행 트리거는 필요한 경우 파티션을 나눈 테이블이 아닌 개별 파티션에 정의되어야 합니다.
동일한 파티션 트리에서 임시 관계와 영구 관계를 혼합하는 것은 허용되지 않습니다. 따라서 분할된 스포츠 토토 베트맨이 영구적인 경우 해당 파티션도 영구적이어야 하며 분할된 스포츠 토토 베트맨이 임시인 경우에도 마찬가지입니다. 임시 관계를 사용할 때 파티션 트리의 모든 구성원은 동일한 세션에 속해야 합니다.
내장된 선언적 파티셔닝은 가장 일반적인 사용 사례에 적합하지만, 보다 유연한 접근 방식이 유용할 수 있는 몇 가지 상황이 있습니다. 파티셔닝은 테이블 상속을 사용하여 구현할 수 있으며, 이는 선언적 파티셔닝에서 지원되지 않는 다음과 같은 여러 기능을 허용합니다.
파티셔닝은 모든 파티션이 상위 파티션과 정확히 동일한 열 세트를 가져야 한다는 규칙을 시행하지만 테이블 상속을 통해 하위 항목은 상위 파티션에 없는 추가 열을 가질 수 있습니다.
스포츠 토토 베트맨 상속은 다중 상속을 허용합니다.
선언적 파티셔닝은 목록 및 범위 파티셔닝만 지원하는 반면, 테이블 상속을 사용하면 사용자가 선택한 방식으로 데이터를 나눌 수 있습니다. (그러나 제약 조건 제외로 파티션을 효과적으로 정리할 수 없는 경우 쿼리 성능이 매우 저하됩니다.)
일부 작업에는 테이블 상속을 사용할 때보다 선언적 파티셔닝을 사용할 때 더 강력한 잠금이 필요합니다. 예를 들어, 파티션을 나눈 테이블에 파티션을 추가하거나 제거하려면접속 독점상위 스포츠 토토 베트맨을 잠그는 반면 a업데이트 독점 공유정규 상속의 경우 잠금이면 충분합니다.
우리는 비파티션을 사용합니다측정위의 테이블. 상속을 사용하여 분할을 구현하려면 다음 단계를 따르세요.
생성“마스터”테이블. 모든 파티션이 상속됩니다. 이 테이블에는 데이터가 포함되지 않습니다. 모든 파티션에 동일하게 적용하려는 경우가 아니면 이 테이블에 검사 제약 조건을 정의하지 마세요. 인덱스나 고유 제약 조건을 정의하는 것도 의미가 없습니다. 이 예에서 마스터 테이블은 다음과 같습니다.측정원래 정의된 스포츠 토토 베트맨입니다.
여러 개 생성“아이”각 테이블은 마스터 테이블에서 상속됩니다. 일반적으로 이러한 테이블은 마스터에서 상속된 세트에 열을 추가하지 않습니다. 선언적 파티셔닝과 마찬가지로 이러한 파티션은 모든 면에서 정상입니다.PostgreSQL스포츠 토토 베트맨(또는 외부 스포츠 토토 베트맨).
CREATE TABLE 측정_y2006m02 () 상속(측정); CREATE TABLE Measurement_y2006m03 () INHERITS (측정); ... CREATE TABLE Measurement_y2007m11 () INHERITS (측정값); CREATE TABLE Measurement_y2007m12 () INHERITS (측정값); CREATE TABLE Measurement_y2008m01 () INHERITS (측정값);
각 파티션에서 허용되는 키 값을 정의하려면 파티션 테이블에 겹치지 않는 테이블 제약 조건을 추가하세요.
전형적인 예는 다음과 같습니다:
확인( x = 1 ) CHECK( 카운티 IN( '옥스퍼드셔', '버킹엄셔', '워릭셔' )) 확인( 콘센트 ID = 100 AND 콘센트 ID < 200 )
제약조건이 서로 다른 파티션에서 허용되는 키 값 사이에 중복이 없음을 보장하는지 확인하세요. 일반적인 실수는 다음과 같은 범위 제약 조건을 설정하는 것입니다.
확인( 콘센트 ID 100~200 사이) 확인(200~300 사이의 콘센트 ID)
키 값 200이 어느 파티션에 속하는지 명확하지 않기 때문에 이것은 잘못된 것입니다.
대신 다음과 같이 파티션을 생성하는 것이 더 나을 것입니다:
스포츠 토토 베트맨 생성 측정_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' )
) 상속(측정);각 파티션에 대해 키 열에 대한 인덱스와 원하는 다른 인덱스를 생성하십시오.
측정 인덱스 생성 측정_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(로그 날짜);
우리는 우리의 애플리케이션이 다음과 같이 말할 수 있기를 원합니다.측정에 삽입 ...그리고 데이터가 적절한 파티션 테이블로 리디렉션되도록 합니다. 마스터 테이블에 적절한 트리거 기능을 연결하여 이를 조정할 수 있습니다. 데이터가 최신 파티션에만 추가되는 경우 매우 간단한 트리거 함수를 사용할 수 있습니다.
함수 생성 또는 교체 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 값에 삽입(신규.*);
규칙은 트리거보다 훨씬 더 많은 오버헤드를 갖지만 오버헤드는 행당 한 번이 아닌 쿼리당 한 번 지불되므로 이 방법은 대량 삽입 상황에 유리할 수 있습니다. 그러나 대부분의 경우 트리거 방법이 더 나은 성능을 제공합니다.
주의하세요복사규칙을 무시합니다. 사용하고 싶다면복사데이터를 삽입하려면 마스터가 아닌 올바른 파티션 테이블에 복사해야 합니다.복사트리거를 실행하므로 트리거 방식을 사용하면 정상적으로 사용할 수 있습니다.
규칙 접근 방식의 또 다른 단점은 규칙 집합이 삽입 날짜를 포함하지 않는 경우 오류를 강제할 수 있는 간단한 방법이 없다는 것입니다. 대신 데이터는 자동으로 마스터 테이블로 이동합니다.
다음을 확인하세요.constraint_exclusion구성 매개변수는 다음에서 비활성화되지 않았습니다.postgresql.conf. 그렇다면 쿼리가 원하는 대로 최적화되지 않습니다.
우리가 볼 수 있듯이 복잡한 파티셔닝 체계에는 상당한 양의 DDL이 필요할 수 있습니다. 위의 예에서는 매달 새 파티션을 생성하므로 필요한 DDL을 자동으로 생성하는 스크립트를 작성하는 것이 현명할 수 있습니다.
오래된 데이터를 빠르게 제거하려면 더 이상 필요하지 않은 파티션을 삭제하세요.
드롭 스포츠 토토 베트맨 측정_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 측정;
다음 주의 사항은 상속을 사용하여 구현된 분할된 스포츠 토토 베트맨에 적용됩니다:
모든 내용을 확인하는 자동 방법은 없습니다.확인제약조건은 상호 배타적입니다. 파티션을 생성하고 관련 개체를 생성 및/또는 수정하는 코드를 직접 작성하는 것보다 만드는 것이 더 안전합니다.
여기에 표시된 체계는 행의 파티션 키 열이 절대 변경되지 않거나 적어도 다른 파티션으로 이동해야 할 만큼 충분히 변경되지 않는다고 가정합니다. 안업데이트그 시도는 실패할 것입니다.확인제약. 이러한 경우를 처리해야 하는 경우 파티션 테이블에 적절한 업데이트 트리거를 배치할 수 있지만 이로 인해 구조 관리가 훨씬 더 복잡해집니다.
수동을 사용하는 경우진공또는분석명령을 실행하려면 각 파티션에서 개별적으로 실행해야 한다는 점을 잊지 마세요. 다음과 같은 명령:
측정 분석;
마스터 테이블만 처리합니다.
삽입다음의 진술충돌 중절이 예상대로 작동하지 않을 것 같습니다.충돌 중하위 관계가 아닌 지정된 대상 관계에 대한 고유 위반의 경우에만 조치가 취해집니다.
애플리케이션이 파티션 구성표를 명시적으로 인식하지 않는 한 행을 원하는 파티션으로 라우팅하려면 트리거 또는 규칙이 필요합니다. 트리거는 작성하기가 복잡할 수 있으며 선언적 분할을 통해 내부적으로 수행되는 튜플 라우팅보다 훨씬 느립니다.
제약조건 제외은 위에서 설명한 방식으로 정의된 분할된 스포츠 토토 베트맨(선언적으로 분할된 스포츠 토토 베트맨과 상속을 사용하여 구현된 테이블 모두)의 성능을 향상시키는 쿼리 최적화 기술입니다. 예를 들어:
SET Constraint_exclusion = 켜기; SELECT 개수(*) FROM 측정 WHERE logdate = DATE '2008-01-01';
제약조건 제외 없이 위 쿼리는 다음의 각 파티션을 스캔합니다.측정테이블. 제약 조건 제외가 활성화되면 플래너는 각 파티션의 제약 조건을 검사하고 쿼리 조건을 충족하는 행을 포함할 수 없기 때문에 파티션을 스캔할 필요가 없다는 것을 증명하려고 시도합니다.어디에서절. 플래너가 이를 증명할 수 있으면 쿼리 계획에서 파티션을 제외합니다.
당신은 다음을 사용할 수 있습니다설명계획 간의 차이점을 표시하는 명령constraint_exclusion켜져 있고 꺼진 계획도 있습니다. 이러한 유형의 테이블 설정에 대한 일반적인 최적화되지 않은 계획은 다음과 같습니다.
SET Constraint_exclusion = 꺼짐;
EXPLAIN SELECT count(*) FROM 측정 WHERE logdate = DATE '2008-01-01';
쿼리 계획
---------------------------------------------------------------------
집계(비용=158.66..158.68행=1 너비=0)
- 추가(비용=0.00..151.88행=2715너비=0)
- 측정 시 Seq 스캔(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
- 측정 시 Seq 스캔_y2006m02 측정(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
- 측정 시 Seq 스캔_y2006m03 측정(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
...
- 측정 시 Seq 스캔_y2007m12 측정(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
- 측정 시 Seq 스캔_y2008m01 측정(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
파티션 중 일부 또는 전부는 전체 테이블 순차 스캔 대신 인덱스 스캔을 사용할 수 있지만 여기서 중요한 점은 이 쿼리에 응답하기 위해 이전 파티션을 스캔할 필요가 전혀 없다는 것입니다. 제약 조건 제외를 활성화하면 동일한 답변을 제공하는 훨씬 더 저렴한 계획을 얻을 수 있습니다.
SET Constraint_exclusion = 켜기;
EXPLAIN SELECT count(*) FROM 측정 WHERE logdate = DATE '2008-01-01';
쿼리 계획
---------------------------------------------------------------------
집계(비용=63.47..63.48행=1너비=0)
- 추가(비용=0.00..60.75행=1086너비=0)
- 측정 시 Seq 스캔(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
- 측정 시 Seq 스캔_y2008m01 측정(비용=0.00..30.38행=543너비=0)
필터: (로그 날짜 = '2008-01-01'::날짜)
제약조건 제외는 다음에 의해서만 구동됩니다.확인제약조건은 인덱스의 존재에 의한 것이 아닙니다. 따라서 키 열에 인덱스를 정의할 필요가 없습니다. 특정 파티션에 대해 인덱스를 만들어야 하는지 여부는 파티션을 검색하는 쿼리가 일반적으로 파티션의 큰 부분을 검색할지 아니면 작은 부분만 검색할지 여부에 따라 달라집니다. 후자의 경우에는 색인이 도움이 되지만 전자의 경우에는 도움이 되지 않습니다.
기본(권장) 설정은constraint_exclusion실제로 둘 다 아님켜짐아니요꺼짐, 그러나 중간 설정은파티션, 이는 분할된 스포츠 토토 베트맨에서 작동할 가능성이 있는 쿼리에만 이 기술이 적용되도록 합니다.켜짐설정으로 인해 플래너가 조사하게 됩니다.확인모든 쿼리에 제약이 있으며, 이점이 없을 것 같은 간단한 쿼리도 마찬가지입니다.
다음 주의 사항은 상속 및 분할된 스포츠 토토 베트맨 모두에서 사용되는 제약 조건 제외에 적용됩니다:
제약조건 제외는 쿼리가 다음과 같은 경우에만 작동합니다.어디절에 상수(또는 외부에서 제공되는 매개변수)가 포함되어 있습니다. 예를 들어, 다음과 같은 불변 함수와의 비교는 다음과 같습니다.CURRENT_TIMESTAMP플래너는 런타임 시 함수 값이 어느 파티션에 포함될 수 있는지 알 수 없으므로 최적화할 수 없습니다.
파티셔닝 제약 조건을 단순하게 유지하세요. 그렇지 않으면 계획자가 파티션을 방문할 필요가 없다는 것을 증명하지 못할 수도 있습니다. 이전 예제에 설명된 대로 목록 분할에는 간단한 동일 조건을 사용하고, 범위 분할에는 간단한 범위 테스트를 사용합니다. 경험에 따르면 분할 제약 조건에는 B-트리 인덱싱 가능 연산자를 사용하여 분할 열과 상수의 비교만 포함되어야 하며 이는 분할된 스포츠 토토 베트맨에도 적용됩니다. 왜냐하면 B-트리 인덱싱 가능 열만 분할 키에 허용되기 때문입니다. (선언적 분할을 사용할 때는 자동으로 생성된 제약 조건이 플래너가 이해할 수 있을 만큼 간단하므로 이는 문제가 되지 않습니다.)
마스터 테이블의 모든 파티션에 대한 모든 제약 조건은 제약 조건 제외 중에 검사되므로 파티션 수가 많으면 쿼리 계획 시간이 상당히 늘어날 수 있습니다. 이러한 기술을 사용한 파티셔닝은 최대 100개의 파티션에서도 잘 작동합니다. 수천 개의 파티션을 사용하려고 하지 마십시오.
질의 계획 및 실행 성능이 잘못된 설계로 인해 부정적인 영향을 받을 수 있으므로 스포츠 토토 베트맨 분할 방법을 신중하게 선택해야 합니다.
가장 중요한 설계 결정 중 하나는 데이터를 분할하는 열 또는 열입니다. 가장 일반적으로 나타나는 열 또는 열 집합으로 파티션을 나누는 것이 최선의 선택인 경우가 많습니다.어디에서파티션된 테이블에서 실행 중인 쿼리의 절.어디51784_52183
테이블을 나누어야 할 파티션의 목표 수를 선택하는 것도 중요한 결정입니다. 파티션이 충분하지 않으면 인덱스가 너무 크고 데이터 지역성이 좋지 않아 캐시 적중률이 낮아질 수 있습니다. 그러나 테이블을 너무 많은 파티션으로 나누면 문제가 발생할 수도 있습니다. 파티션이 너무 많으면 쿼리 계획 및 실행 중에 쿼리 계획 시간이 길어지고 메모리 소비가 높아질 수 있습니다. 테이블을 분할하는 방법을 선택할 때 향후 발생할 수 있는 변경 사항을 고려하는 것도 중요합니다. 예를 들어, 고객당 하나의 파티션을 선택하고 현재 소수의 대규모 고객을 보유하고 있는 경우, 몇 년 후에 다수의 소규모 고객을 만나게 될 경우의 영향을 고려하십시오. 이 경우 파티션을 선택하는 것이 더 나을 수 있습니다.범위파티션을 시도하는 대신 각각 고정된 수의 고객을 포함하는 합리적인 수의 파티션을 선택합니다.목록그리고 고객 수가 데이터를 분할하는 것이 실용적인 것 이상으로 증가하지 않기를 바라고 있습니다.
하위 분할은 다른 파티션보다 커질 것으로 예상되는 파티션을 추가로 분할하는 데 유용할 수 있습니다. 하지만 과도한 하위 분할은 쉽게 많은 수의 파티션으로 이어질 수 있으며 이전 단락에서 언급한 것과 동일한 문제를 일으킬 수 있습니다.
쿼리 계획 및 실행 중 파티셔닝 오버헤드를 고려하는 것도 중요합니다. 쿼리 플래너는 일반적으로 최대 수백 개의 파티션이 포함된 파티션 계층 구조를 처리할 수 있습니다. 파티션이 추가될수록 계획 시간이 길어지고 메모리 소비도 높아집니다. 이는 특히 그렇습니다.업데이트그리고삭제명령. 많은 수의 파티션을 갖는 것에 대해 우려해야 할 또 다른 이유는 특히 많은 세션이 많은 수의 파티션에 접근하는 경우 서버의 메모리 소비가 일정 기간 동안 크게 증가할 수 있다는 것입니다. 그 이유는 각 파티션에서 해당 파티션에 닿는 각 세션의 로컬 메모리에 해당 메타데이터를 로드해야 하기 때문입니다.
데이터 웨어하우스 유형의 작업 부하에서는 다른 작업 부하보다 더 많은 수의 파티션을 사용하는 것이 합리적일 수 있습니다.OLTP유형 작업 부하. 일반적으로 데이터 웨어하우스에서는 대부분의 처리 시간이 쿼리 실행 중에 소비되므로 쿼리 계획 시간은 그다지 중요하지 않습니다. 이 두 가지 유형의 워크로드 중 하나를 사용하면 대량의 데이터를 다시 분할하는 작업이 엄청나게 느려질 수 있으므로 조기에 올바른 결정을 내리는 것이 중요합니다. 의도한 작업 부하에 대한 시뮬레이션은 분할 전략을 최적화하는 데 도움이 되는 경우가 많습니다. 더 많은 파티션이 더 적은 파티션보다 낫다고 가정하지 마십시오. 그 반대의 경우도 마찬가지입니다.