2013-06-18 3 views
2

불행히도 일부 무거운 bytea 유형 필드를 포함하여 고객 데이터 (~ 500K 고객)가 포함 된 테이블이있는 postgresql 9.2 설치가 있습니다.Postgresql : update 명령이 중지되지 않습니다.

CUSTOMERS1 | id | first name | last name | ... 
----------------------------------------------------- ... 
       c1005   ...   ...   ... 

데이터를 외부 소스와 병합하는 작업이 있습니다. 불행히도 정확히 동일한 외래 키를 사용하지는 않습니다.

CUSTOMERS2 | id | first name | last name | ... 
----------------------------------------------------- ... 
       101005   ...   ...   ... 

그래서 customers1customers2의 ID c1005있는 동안 동일한 이드 즉 c 단지 드롭되고 100000 이드에 첨가하고, 101005이다.

이제 customers2에있는 것과 동일한 ID를 포함하는 customers2_idcustomers1 열을 추가하려고합니다. 나는 다음과 같은 SQL 명령과 함께 올라와있다 : 나는 영원히 걸리는 명령을 실행할 때

ALTER TABLE customers1 ADD COLUMN customers2_id numeric(15,0); 
UPDATE customers1 
SET customers2_id = to_number(trim(leading 'c' from id), '9999') + 100000; 

불행하게도 (우리가> 15시간와 아직도 완성을 위해 실행하자). 또한 포스트 그레스 프로세스는 유휴 상태 인 것 같습니다 (활동 모니터에 따라).

일부 노트 : 우리는 예를 들어, 함께 UPDATE 명령을 실행하는 인덱스

  • 을 제거한

    • WHERE id = 'c1005'은 WHERE 절에서 ~ 10 개의 요소까지 빠르게 실행되며 20 개의 요소가 속도가 크게 저하됨
    • 이 실험을 통해이 작업을 빠르게 수행 할 수 있음을 알 수있었습니다 : INSERT INTO 새 테이블을 작성하고 select 문을 삽입 한 값으로 지정했습니다. SELECT id, to_number(trim(leading 'c' from id), '9999') + 100000 FROM customers2; 그것은 우리가 bytea와 필드

    우리가 어떻게 일을 속도와이 문제를 해결할 수있는 주요 문제가 있다는 인상을 < 십초

  • 에서 실행? 그렇게 느린 진정한 문제는 무엇일까요?

  • +0

    대개 'ALTER TABLE'은이 테이블의 일부 작업에 의해 차단됩니다. –

    +0

    @IgorRomanchenko : 의심 스럽습니다. 교착 상태가 발생하면 결국 쿼리가 오류를 일으 킵니다. –

    답변

    2

    테이블이 손상된 것으로 보입니다. 우리는 스키마를 다시 만들고 INSERT INTO을 수행하여 테이블을 복사했습니다. 편의상 새 스키마에 새 ID 필드를 추가하고 삽입시 새 ID를 계산하도록했습니다. 이제 모든 것이 원활하게 작동합니다.

    +0

    손상된 테이블? 정말로 이상하게 들린다. Postgres가 테이블을 손상시키는 것에 대해 들어 본 적이 없습니다. (디스크 또는 파일 시스템 오류가 발생한 경우 제외) –

    관련 문제