1 천만 레코드의 큰 테이블에서 숫자 열의 정밀도를 높이고 싶습니다. 표준 방식 인 ALTER TABLE mytable ALTER COLUMN mycolumn TYPE numeric(15,6)
은 테이블을 잠글 것입니다. 이것은 매우 트랜잭션적인 테이블입니다. 테이블을 잠그지 않고 테이블을 다시 만들거나, 데이터를 복사하거나, 테이블의 이름을 바꾸거나 테이블을 바꾸지 않고이 작업을 수행 할 수 있습니까? 나는 현재 dockerized postgres를 실행하고있다.테이블을 잠그지 않고 숫자 데이터 유형의 정밀도를 높이십시오.
답변
나는 완전한 테이블 재 작성이 필요한 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 은 UPDATE
pg_attribute
새 atttypmod 항목에 안전해야합니다. 하지만 제가 말씀 드렸듯이 먼저 독서와 연구를 해보십시오. 직접 typmod 업데이트에 대한 사전 토론을 찾을 수 있는지 알아보십시오. 연장 VARCHAR(n)
적용
건은 모두 내부 VARLENA
스토리지 유형은, 모두 큰 값이 더 작은 값의 순수한 수퍼 셋 typmods을 갖기 때문에, NUMERIC
적용된다. 재 작성없이 VARCHAR
의 길이를 연장하는 것에 대해 묻는 사람들에 대한 정보를 더 많이 찾을 수 있습니다.
정밀도를 변경하는 경우에만 재 작성이 발생합니다. 예 : '(8,2)'에서'(10,2)'로 갈 때 테이블은 ** 다시 쓰이지 않습니다 **. 그러나'(8,2)'에서'(10,4)'로 바뀌며 다시 쓰여집니다. –
@a_horse_with_no_name 잘 잡으세요! –
@a_horse_with_no_name 감사합니다! 나는 내 테스트에서 그것을 확인했다. 비록 문서화가 좀 더 명확해질 필요가 있다고 생각합니다. 그건 내가 읽는 방식이 아니야. 오, 그럼. –
원본 열 정의 란 무엇입니까? _precision_을 변경하지 않으면 테이블이 다시 작성되지 않습니다 **. '(12,6)'에서'(15,6)'까지는 다시 쓰지 않습니다. –