2013-07-25 2 views
0

100GB 크기의 postgresql 데이터베이스가 있습니다. 테이블 중 하나에 약 5 억 항목이 있습니다. 빠른 데이터 입력을 위해 일부 데이터가 반복되어 나중에 정리 된 상태로 남았습니다. 열 중 하나를 사용하여 행을 고유 한 것으로 식별 할 수 있습니다. PostgreSQL를위한 유사한 아무것도큰 postgresql 데이터베이스 테이블에서 중복 행을 삭제합니다.

ALTER IGNORE TABLE table_name ADD UNIQUE (location_id, datetime) 

있습니까 :

나는 MySQL을위한 솔루션을 제안 this stackoverflow question 발견?

그룹별로 행 번호를 삭제하려고 시도했지만 두 경우 모두 몇 시간이 지나면 컴퓨터의 메모리가 부족합니다.

SELECT reltuples FROM pg_class WHERE relname = 'orders'; 
    reltuples 
------------- 
4.38543e+08 
(1 row) 
+0

실행중인 테이블 DDL 및 삭제 명령문을 표시 할 수 있습니까? 삭제 횟수를 선택 개수 (*)로 변경하면 삭제 타겟팅의 행 수가 얼마나됩니까? – Kuberchaun

+0

@JustBob select count (1)가 멈추기까지 1 시간 이상이 걸렸습니다. – nurettin

+0

제 아이디어는 일괄 적으로 삭제하는 것이 었습니다. 나는 당신의 삭제가 2 개의 줄 또는 3 억을 지나고 있는지 궁금했다. 시퀀스 인 멋진 인덱스 열이있는 경우 행 집합에서 스 와이프하고 거기에서 삭제할 수 있습니다. min과 max 사이의 id를 테이블에서 루프 삭제하려면 python 스크립트 나 다른 것을 작성해야합니다. min과 max가 마지막보다 높은 범위로 변경되지만 여전히 50,000 개의 레코드만을 말하는 테이블의 끝을 칠 때까지 이것을하십시오. 이해가 되니? – Kuberchaun

답변

1

두 솔루션은 즉시 마음에 와서 :

이 내가 테이블의 행 수를 추정 할 때 내가 무엇을 얻을

1). 고유 한 행을 판별하려면 WHERE 절이있는 소스 테이블에서 select *로 새 테이블을 작성하십시오. 원본 테이블과 일치하는 인덱스를 추가 한 다음 트랜잭션에서 둘 다 이름을 바꿉니다. 이 기능이 작동할지 여부는 사용 가능한 디스크 공간, 테이블이 지속적으로 사용되고 액세스가 중단되는 경우 등 여러 가지 요인에 따라 달라집니다. 새 테이블을 만들면 데이터와 인덱스를 긴밀히 묶는 이점이 있습니다 고유하지 않은 행이 생략되어 테이블이 원본보다 작습니다.

2). 열 위에 부분 고유 색인을 만들고 WHERE 절을 추가하여 비 고유 항목을 필터링하십시오. 예 :

test=# create table t (col1 int, col2 int, is_unique boolean); 
CREATE TABLE 

test=# insert into t values (1,2,true), (2,3,true),(2,3,false); 
INSERT 0 3 

test=# create unique index concurrently t_col1_col2_uidx on t (col1, col2) where is_unique is true; 
CREATE INDEX 

test=# \d t 
     Table "public.t" 
    Column | Type | Modifiers 
-----------+---------+----------- 
col1  | integer | 
col2  | integer | 
is_unique | boolean | 
Indexes: 
    "t_col1_col2_uidx" UNIQUE, btree (col1, col2) WHERE is_unique IS TRUE 
관련 문제