2012-06-05 5 views
3

여기에는 중앙 서버와 노드가있는 시나리오가 있습니다. 서버와 노드 모두 PostgreSQL을 실행할 수 있지만 노드의 저장 공간은 제한되어 있습니다. 노드는 고속으로 데이터를 수집하고 데이터를 로컬 DB에 씁니다. 서버가 노드의 데이터를 복제해야합니다. 나는 이것을 Slony-I 또는 Bucardo으로 수행 할 계획입니다. 노드는 사용 된 디스크 공간을 최소화하기 위해 설정된 간격으로 테이블에서 모든 레코드를 삭제할 수 있어야합니다. 내가하루에 한 번씩 자동으로 PostgreSQL 테이블을 삭제합니다.

DELETE FROM tablex, tabley, tablez; 

같은 스크립트로 구성된 작업과 pgAgent을 사용해야 스크립트를 실행하는 실제 배치 파일이 될 경우

@echo off 
C:\Progra~1\PostgreSQL\9.1\bin\psql -d database -h localhost -p 5432 -U postgres -f C:\deleteFrom.sql 

같은?

이 작업을 수행하는 가장 좋은 방법인지 또는 누군가가 원격 DB에서 데이터를 가져 와서 원격 노드의 공간을 절약하기 위해 원격 DB를 지우는보다 효율적인 방법을 알고 있다면 의견을 찾고 있습니다. 시간 내 줘서 고마워.

답변

3

가장 효율적인 명령은 TRUNCATE 명령입니다. TRUNCATE와

을 수행 할 수 있습니다 체인 최대 테이블, 귀하의 예제와 같은 :

TRUNCATE 신속 테이블 세트에서 모든 행을 제거합니다

TRUNCATE tablex, tabley, tablez; 

여기에 포스트 그레스 문서에서 설명합니다. 각 테이블에 대한 규정되지 않은 DELETE와 동일한 효과가 있지만 실제로 테이블을 스캔하지 않으므로 더 빠릅니다. 또한 후속 VACUUM 작업을 요구하기보다는 즉시 디스크 공간을 재 확보합니다. 이것은 대형 테이블에서 가장 유용합니다. 또한 매개 변수로 CASCADE을 추가 할 수 있습니다

:

CASCADE 자동으로 명명 된 테이블 중 하나에 외래 키 참조가 모든 테이블을 절단, 또는 테이블로 인해 CASCADE에 그룹에 추가 .

+0

도움 주셔서 감사합니다. 삭제보다는 잘라내기를 사용합니다. – babcoccl

1

@Bohemian이 제시 한대로 정확한 요구 사항 및 워크 플로에 따라 두 가지 최상의 옵션이 잘 리거나 새 테이블을 만들고 이름을 변경 한 다음 놓습니다.

우리는 주요 프로젝트 중 하나에서 후자의 생성/이름 바꾸기/놓기 방법과 비슷한 것을 사용합니다. 이는 테이블에서 모든 데이터가 아닌 일부 데이터를 매우 빠르게 삭제할 수 있어야하는 경우에 이점이 있습니다. 기본 워크 플로우는 다음과 같습니다

  1. 는 이전

    CREATE NEW_TABLE LIKE 동일한 스키마를 새 테이블을 만들기 ...트랜잭션에서

  2. , 동시에 이전 및 새 테이블의 이름을 변경 :

    시작; RENAME 테이블 TO 이전 테이블; 테이블에 NEW_NAME 테이블을 갱신하십시오. COMMIT;

  3. [선택 사항] 이제 새 테이블이 새로운 삽입을 허용하는 동안 기존 테이블을 사용하여 작업 할 수 있습니다. 데이터를 중앙 집중화 된 서버로 덤프하거나 여기에서 쿼리를 실행할 수 있습니다.

  4. 은 이전 테이블을 OLD_TABLE

    DROP 삭제;

이는 예를 들어 7 일간의 데이터를 유지하고 동시에 8 일짜리 데이터 만 삭제하려는 경우 특히 유용한 전략입니다. 이 경우 DELETE을 수행하면 매우 매우이 될 수 있습니다. 파티션에 데이터를 저장하여 (하루에 하나씩) 전체 데이터를 한 번에 쉽게 삭제할 수 있습니다.

+0

테이블 위에 뷰가 정의되어있는 경우 포스트그레스에서 어떻게됩니까? 답변 :이 명령들은 폭발 할 것입니다. – Bohemian

+0

@ 보헤미안 : 뷰를 삭제하고 다시 만들 수 있습니다. 또는 부모 테이블을 사용하고 하위 테이블 만 삭제/다시 만들 수 있습니다. 우리는이 전략을 아주 효과적으로 사용합니다. – Flimzy

+0

그래, 네가 할 수있는 건 알지만, 재현 할 전망을 알아야 해. 어떻게 그걸 유지하니? 다른 사람이보기를 추가/삭제하는 경우 어떻게해야합니까? 스크립트를 수정해야합니다. 작업 프로세스를 스키마 문제로 불필요하게 밀어 넣었습니다. 그것은 불필요한 관리 번거 로움이됩니다. 게다가, 당신의 솔루션은 단순히 좋은 것이 아닙니다 - 성능이 좋지 않고 테이블이 방대한 경우 로그를 날릴 수 있습니다. TRUNCATE가 올바른 접근법입니다. 나는 너 스스로 그것을 시도하는 것이 좋습니다. 저를 믿으십시오 ... 당신은 기꺼이 해 주실 것입니다 – Bohemian

관련 문제