2017-10-11 8 views
1

1 천만 레코드의 큰 테이블에서 숫자 열의 정밀도를 높이고 싶습니다. 표준 방식 인 ALTER TABLE mytable ALTER COLUMN mycolumn TYPE numeric(15,6)은 테이블을 잠글 것입니다. 이것은 매우 트랜잭션적인 테이블입니다. 테이블을 잠그지 않고 테이블을 다시 만들거나, 데이터를 복사하거나, 테이블의 이름을 바꾸거나 테이블을 바꾸지 않고이 작업을 수행 할 수 있습니까? 나는 현재 dockerized postgres를 실행하고있다.테이블을 잠그지 않고 숫자 데이터 유형의 정밀도를 높이십시오.

+0

원본 열 정의 란 무엇입니까? _precision_을 변경하지 않으면 테이블이 다시 작성되지 않습니다 **. '(12,6)'에서'(15,6)'까지는 다시 쓰지 않습니다. –

답변

0

나는 완전한 테이블 재 작성이 필요한 typmod를 변경한다고 생각하지 않았지만, 빠른 검사는 finish_heap_swap에 중단 점을 설정하면 사실상 재 작성을 수행한다. ALTER TABLE test_numeric ALTER COLUMN x TYPE numeric(8,4) 같은 cmd - 9.5 이상.


편집 : a_horse_with_no_name 당신이 정밀이 아닌 스케일을 변경하면 재 작성은 수행되는 것을 지적한다. 따라서 작업을 크게 방해하지 않는 단명의 독점적 인 잠금 기능으로이를 수행 할 수 있습니다.


그렇지 않으면 :

당신은 잠재적으로 속임수와 새 정밀도가 기존의 정밀도를 가진 모든 행에 대해 유효합니다 알고 있기 때문에 직접 시스템 카탈로그를 업데이트 할 수 있습니다. 그러나 나는 조금 주저합니다. PostgreSQL이 이미 그렇게했을 가능성이 있기 때문입니다. 나는 그것을 추천 할 수는 없지만, 실험하고, 테스트하고, 독서 등을하고 싶다면 거기에서 시작할 수 있습니다. 내가 ALTER 경우

test=> select atttypmod from pg_attribute where attrelid = 'test_numeric'::regclass AND attname = 'x'; 
atttypmod 
----------- 
    262150 
(1 row) 

15,6에 : 열 x numeric(4,2)있는 테이블 test_numeric를 들어

test=> select atttypmod from pg_attribute where attrelid = 'test_numeric'::regclass AND attname = 'x'; 
atttypmod 
----------- 
    983050 
(1 row) 

(나는 방법을 볼 수 typmod를위한 코드를 읽는 성가 시게 할 수없는 32 비트 typmod 필드는 정밀도와 배율로 분해되지만 원한다면 할 수 있습니다.)

It UPDATEpg_attribute 새 atttypmod 항목에 안전해야합니다. 하지만 제가 말씀 드렸듯이 먼저 독서와 연구를 해보십시오. 직접 typmod 업데이트에 대한 사전 토론을 찾을 수 있는지 알아보십시오. 연장 VARCHAR(n) 적용

건은 모두 내부 VARLENA 스토리지 유형은, 모두 큰 값이 더 작은 값의 순수한 수퍼 셋 typmods을 갖기 때문에, NUMERIC 적용된다. 재 작성없이 VARCHAR의 길이를 연장하는 것에 대해 묻는 사람들에 대한 정보를 더 많이 찾을 수 있습니다.

+1

정밀도를 변경하는 경우에만 재 작성이 발생합니다. 예 : '(8,2)'에서'(10,2)'로 갈 때 테이블은 ** 다시 쓰이지 않습니다 **. 그러나'(8,2)'에서'(10,4)'로 바뀌며 다시 쓰여집니다. –

+0

@a_horse_with_no_name 잘 잡으세요! –

+0

@a_horse_with_no_name 감사합니다! 나는 내 테스트에서 그것을 확인했다. 비록 문서화가 좀 더 명확해질 필요가 있다고 생각합니다. 그건 내가 읽는 방식이 아니야. 오, 그럼. –