SQL을 사용하여 postgres 테이블을 완전히 복사

DISCLAIMER : 이 질문은 스택 오버플로 질문 여기 와 유사하지만 해당 답변 중 어느 것도 작동하지 않습니다. 내 문제에 대해서는 나중에 설명하겠습니다.

많은 열이 인덱싱 된 postgres에서 큰 테이블 (~ 4 천만 행, 100+ 열)을 복사하려고합니다. 현재이 SQL 비트를 사용합니다.

CREATE TABLE _copy (LIKE  INCLUDING ALL);
INSERT INTO _copy SELECT * FROM ;

이 방법에는 두 가지 문제가 있습니다.

  1. 데이터 수집 전에 인덱스를 추가하므로 인덱스없이 테이블을 생성 한 다음 모든 데이터를 복사 한 후 인덱싱하는 것보다 훨씬 오래 걸립니다.
  2. 복사되지 않습니다. `SERIAL '스타일 컬럼이 적절합니다. 새 테이블에 새'카운터 '를 설정하는 대신 새 테이블의 컬럼 기본값을 과거 테이블의 카운터로 설정하므로 행으로 증가하지 않습니다. 테이블 크기로 인해 인덱싱이 실시간으로 문제가되며 파일에 덤프 한 다음 다시 처리하는 것도 불가능합니다. 또한 명령 줄의 이점이 없습니다. . SQL로이 작업을 수행해야합니다.

    기적 명령으로 정확한 복사본을 만들거나, 가능하지 않은 경우 모든 금기 사항이 있지만 인덱스없이 테이블을 복사하고 확인하는 것입니다. 그것들은 '정신'(일명 SERIAL 컬럼의 새로운 카운터)의 제약입니다. 그런 다음 SELECT * 를 사용하여 모든 데이터를 복사 한 다음 모든 인덱스를 복사합니다.

    소스

    1. 데이터베이스 복사에 대한 스택 오버플로 질문 : 이건 제가 아닙니다. 세 가지 이유를 묻습니다

      • 명령 줄 옵션을 사용합니다. pg_dump -t x2 | sed 's / x2 / x3 / g'| psql 그리고이 설정에서는 명령 줄에 액세스 할 수 없습니다.
      • 지수 사전 데이터 수집을 생성합니다. 느린 속도입니다
      • 의 증거로 직렬 열을 올바르게 업데이트하지 않습니다. default nextval ( 'x1_id_seq':: regclass)
    2. postgres 테이블의 시퀀스 값을 재설정하는 방법 : 이것은 훌륭하지만 안타깝게도 매우 수동입니다.

67
задан Community 23 May 2017 в 12:26
поделиться