>

테이블을 파티션으로 병합하려고하는데 병합이 작동하지만 성능이 좋지 않습니다. 이 링크, 특히이 인용문을 읽었습니다. .

Before running the ATTACH PARTITION command, it is recommended to create a CHECK constraint on the table to be attached describing the desired partition constraint. That way, the system will be able to skip the scan to validate the implicit partition constraint. Without such a constraint, the table will be scanned to validate the partition constraint while holding an ACCESS EXCLUSIVE lock on the parent table. One may then drop the constraint after ATTACH PARTITION is finished, because it is no longer necessary.

사용중인 SQL은 다음과 같습니다 ....

ALTER TABLE mess_201811 ADD CONSTRAINT const_201811 CHECK ( loadedtime >=  DATE '2018-11-01' AND loadedtime < DATE '2018-11-23' );
ALTER TABLE mess ATTACH PARTITION mess_201811 FOR VALUES FROM ('2018-11-01') TO ('2018-11-23'); 
ALTER TABLE mess_201811 DROP CONSTRAINT const_201811 ;

가능한 한 가깝게 언급 한 링크에서 SQL을 복사했습니다. 세 명령은 모두 문제없이 작동하며 문제는시간입니다. 제약 조건을 추가하는 데 약 60 초가 걸립니다 (충분히 표에는 약 2 백만 개의 레코드가 있습니다). 그러나 ATTACH PARTITION 명령도 약 60 초가 걸리므로 파티션을 두 번 검사 할 때 테이블을 스캔하고 있음을 나타냅니다. CHECK 제약 조건을 사용하면 ATTACH는 간단한 DDL 문이어야하며 1 분의 1 만 소요됩니다.

문제는 ATTACH PARTITION에 60 초 동안 레코드를 삽입 할 수없는mess테이블에 대한 독점 잠금이 필요하다는 것입니다.

postgres v10.5를 사용하고 있습니다. 테이블 혼란에 대한 정의는

PARTITIONED BY loadedtime;

내가 테스트 할 당시 데이터베이스에 다른 사용자가 없었고 잠금 문제가 없었습니다.

<시간>

jjanes 솔루션에 이어 원본 문서를 확인했는데 인용 된 예제는 필수 사항은 아니지만 NOT NULL 필드 제약 조건을 사용합니다. 추가 제약 조건 이이 테이블의 일반적인 삽입에 눈에 띄는 영향을 미치지 않기를 바랍니다.

  • 답변 # 1

    mess_201811.loadedtime이 nullable 인 경우에만 이것을 재현 할 수 있습니다.이 경우 첨부시 NULL 값을 스캔해야합니다. 열이 NULL이 아니면 첨부시 스캔을 건너 뜁니다.

관련 자료

  • 이전 innodb - frm 파일 및 데이터베이스 페이지와 관련하여 SELECT 쿼리를 보낼 때 DBMS는 정확히 무엇을 수행합니까? (MySQL)
  • 다음 mysql로드 데이터 인파 일이 너무 오래 걸리고 db 파일이 너무 커짐