여기에 몇 가지 오해가 있습니다.
널 비트 맵 입니다 하지 힙 튜플 헤더의 일부입니다. 문서 당 :
고정 크기 헤더 (대부분의 컴퓨터에서 23 바이트를 차지함)와 선택적 null 비트 맵이 있습니다 ...
32 개의 널 입력 가능 열은 다음 두 가지 이유로 의심되지 않습니다.
널 비트 맵은 행당 추가 되며 행에 실제 NULL
값 이 하나 이상있는 경우에만 추가 됩니다 . 널 입력 가능 컬럼은 직접적인 영향을 미치지 않으며 실제 NULL
값만 영향을 줍니다. 널 비트 맵이 할당되면 항상 완전히 할당됩니다 (모두 또는 아무것도 아님). 널 비트 맵의 실제 크기는 열당 1 비트 이며 다음 바이트로 올림됩니다 . 현재 소스 코드 당 :
#define BITMAPLEN(NATTS) (((int)(NATTS) + 7) / 8)
널 비트 맵은 힙 튜플 헤더 뒤에 할당되고 선택적 OID와 행 데이터가 뒤 따릅니다. OID 또는 행 데이터의 시작은 t_hoff
헤더에 표시됩니다 . 주석 당 소스 코드 :
t_hoff는 MAXALIGN의 배수 여야합니다.
힙 튜플 헤더 뒤에는 23 바이트를 차지하는 사용 가능한 바이트가 하나 있습니다. 따라서 최대 8 열의 행에 대한 널 비트 맵은 추가 비용없이 효과적으로 제공됩니다. 표 9 번째 열이, t_hoff
다른 전진 MAXALIGN
(보통 8) 다른 열 (64)을 제공하기 위해 바이트. 따라서 다음 경계는 72 열입니다.
MAXALIGN
데비안 머신에서 Postgres 9.3의 일반적인 설치 예를 포함하여 PostgreSQL 데이터베이스 클러스터 (포함 ) 의 제어 정보를 표시하려면 :
sudo /usr/lib/postgresql/9.3/bin/pg_controldata /var/lib/postgresql/9.3/main
인용 한 관련 답변의 지침을 업데이트했습니다 .
모든 것을 제외하고, ALTER TABLE
명령문이 전체 테이블 다시 쓰기를 트리거 하더라도 (데이터 유형 변경) 250K는 실제로 그다지 크지 않으며 중간 정도의 기계에서 몇 초가됩니다 (행이 비정상적으로 크지 않은 경우) . 10 분 이상이 완전히 다른 문제를 나타냅니다. 당신의 진술은 아마도 테이블을 잠그려고 기다리고 있습니다.
증가하는 항목 수는 pg_stat_activity
더 많은 공개 트랜잭션 을 의미합니다. 작업이 완료되기를 기다려야하는 테이블에 대한 동시 액세스 (대부분 가능성이 있음)를 나타냅니다.
어둠 속에서 몇 발
가능한 테이블 팽창을 확인하고, 온화 VACUUM mytable
하거나 더 공격적인 시도 VACUUM FULL mytable
– 동일한 동시성 문제가 발생할 수 있습니다.이 양식은 독점 잠금을 획득하기 때문입니다. 대신 pg_repack 을 사용해보십시오 ...
인덱스, 트리거, 외래 키 또는 기타 제약 조건, 특히 열과 관련된 문제와 관련하여 가능한 문제를 검사하는 것으로 시작합니다. 특히 손상된 인덱스가 관련되어 있습니까? 시도 REINDEX TABLE mytable;
또는 DROP
그들과의 모든 후에 다시는-추가 ALTER TABLE
동일한 트랜잭션에서 .
밤이나 부하가 많지 않을 때마다 명령을 실행하십시오.
무차별 대입 방법은 서버에 대한 액세스를 중지 한 후 다시 시도하는 것입니다.
그것을 고정시킬 수 없다면, 현재 버전이나 다가오는 9.4로 업그레이드하는 것이 도움 이 될 수 있습니다. 큰 테이블 및 잠금 세부 사항에 대한 몇 가지 개선 사항이 있습니다. 그러나 DB에 손상된 것이 있으면 먼저 알아 내야합니다.
SET NOT NULL
유형을 변경하지 않고 제약 조건을 추가하기 만하지만 제약 조건을 테이블과 비교하여 확인 해야하며 전체 테이블 스캔이 필요합니다. 9.4는 약한 자물쇠를 사용하여 이러한 경우 중 일부를 개선하지만 여전히 꽤 무겁습니다.