2017-02-02 14 views
3

Postgres-9.5를 실행 중입니다. 나는 큰 테이블을 가지고 있는데, 나는 ALTER TABLE table SET UNLOGGED을하고있다. FK 참조 테이블은 언 로그 될 수 없기 때문에 이미 테이블을 대상으로하는 모든 외래 키 제약 조건을 삭제했습니다. 쿼리는 약 20 분이 걸렸고 전체 시간 동안 CPU를 100 % 소비했습니다. 나는 테이블을 기록하기 위해 오랜 시간이 걸린다는 것을 이해할 수 있지만, 기록되지 않은 상태로 만드는 것은 어려운 것처럼 보이지 않는다 ... 그러나 그것인가?Postgres SET UNLOGGED에 시간이 오래 걸립니다.

테이블을 잠그지 않은 상태로 설정하는 것이 더 빠를 수 있습니까?

+0

자물쇠가 대기 중일 수 있습니까? https://wiki.postgresql.org/wiki/Lock_Monitoring –

+0

몇 초마다'pg_stat_activity'를 쿼리하여이를 모니터링하고 있었고'waiting' 컬럼이 true로 설정되어 있지 않은 것을 보았습니다. 그리고 계속해서 높은 CPU 사용량을 보았습니다. 그것은 기다리고 있지 않습니다. 또한 격리 된 테스트 데이터베이스에 있었기 때문에 다른 쿼리가 전혀 실행되지 않았다는 것을 알고 있습니다. – sudo

+0

@NickBarnes 아, 그게 해결책입니다. 언 로그 된 설정에 다시 쓰기가 필요하다는 이상한 것처럼 보이지만 Postgres가 어떻게 작동하는지 실제로 알지 못합니다. – sudo

답변

4

SET UNLOGGED에는 테이블 다시 쓰기가 포함되므로 큰 테이블의 경우 꽤 오래 걸릴 것으로 예상 할 수 있습니다.

당신이 말했듯이, 그것은 테이블을 만드는 것 같지 않습니다 UNLOGGED 그 어려운해야합니다. 그리고 테이블을 간단히 변환하면 은 어렵습니다.; 복잡하게 만드는 요인은 충돌 안전을 만들 필요가 있다는 것입니다. UNLOGGED 테이블에는 추가 파일 (init fork)이 연결되어있어이 파일의 작성을 나머지 커밋과 동기화 할 방법이 없습니다.

대신 SET UNLOGGED은 init 포크가 첨부 된 상태로 테이블의 복사본을 만든 다음 커밋이 원자 단위로 처리 할 수있는 새로운 relfilenode으로 바꿉니다. 더 효율적인 구현은 가능하지만, 잠긴 테이블 (표현식이 SET UNLOGGED 인 것) 또는 COMMIT 뒤에있는 논리의 표현을 변경하지 않아도됩니다.이 두 가지 모두이 비교적 사소한 기능에 너무 관입되지 않는 것으로 간주됩니다. pgsql-hackers list에있는 디자인이면의 토론을 읽을 수 있습니다. , 새로운 UNLOGGED 테이블을 생성에서 모든 레코드를 복사, 짧게는 지난 몇 변경 동기화하는 동안 이전 테이블을 잠글 : 당신이 정말로 다운 타임을 최소화해야하는 경우

, 당신은 SET UNLOGGED에 의해 촬영 된 것과 유사한 방법을 이용할 수있다 완료되면 RENAME으로 새 테이블을 바꿔 넣으십시오.