2010-08-17 6 views
3

나는 다음과 같은 쿼리가 3시간 + 출마 있습니다PostgreSQL에서 UPDATE 쿼리 결과 시간을 향상시키는 방법?

UPDATE eop_201007 
set coord_x = gi.x_etrs89, coord_y = gi.x_etrs89,gr_type = 4 
from eop_201007 as eop, geoindex201001 as gi 
where eop.cp7=gi.cp7 AND eop.gr_type=0; 

EOP 테이블이 300K + 기록을 가지고 있으며, GI 테이블 100,000의 +.

cp7 필드는 두 테이블에서 모두 인덱싱되며 완료하는 데 너무 많은 시간이 걸립니다.

내가 잘못 했습니까? 어떻게 개선 할 수 있습니까?

답변

1

this topic을 확인하고 EXPLAIN을 사용하여 진행 상황을 확인하십시오. WAL을 더 잘 구성하면 업데이트하는 동안 메모리 사용량과 쓰기 속도를 확인할 수 있습니다.

편집 : 그리고 다른 트랜잭션이 영원히 기다릴 필요가, 테이블을 잠글 수 없는지 확인 ...

SELECT 
    relname, 
    * 
FROM 
    pg_locks 
     JOIN pg_class ON pg_locks.relation = pg_class.oid 
1

당신은 당신의 FROM에서 "EOP로 eop_201007"을 필요가 없습니다. 다음은 작동합니다

UPDATE eop_201007 
set coord_x = gi.x_etrs89, coord_y = gi.x_etrs89,gr_type = 4 
from geoindex201001 as gi 
where eop_201007.cp7=gi.cp7 AND eop_201007.gr_type=0; 

내가 여분의 EOP 그것이 "입니다 원래 EOP 테이블에 대해 제한되지 않기 때문에 A는 (거대하다 두 테이블의 기본적 외적)을 교차 결합의 원인이되는 생각 자동으로 "를의 목록이 이미

FROM 그 일을 해결되지 않으면, 여기에 몇 가지 다른 생각입니다 :

당신은 아마 당신이하지 않은 경우 진공이 처음에 분석을 수행하고자합니다. postgresql.conf에서 모든 메모리 설정을 조정했는지 확인하십시오. 작업 메모리, 공유 버퍼 등은 큰 차이를 만들 수 있습니다.

야간 작업이 아닌 일회성 작업 인 경우 fsync를 꺼야합니다. 또한 fsync를 해제 한 경우 너무 많은 체크 포인트 세그먼트가 구성되어 있지 않은지 확인하십시오 (그렇지 않으면 24 번). 그렇지 않으면 디스크 캐시가 오염됩니다.

@Frank Heikens가 말했듯이, 당신은 설명을보아야합니다. 또한 EXPLAIN ANALYZE를 점검하십시오 (조회가 끝나면).

+1

EXPLAIN ANALYZE를 사용하는 경우 트랜잭션 내에서 확인하십시오! UPDATE는 EXPLAIN ANALYZE에 의해 실행되며 쿼리 플랜 뿐만이 아닙니다. 조심해. –

+0

입력 mi와 Frank의 Ty. 쿼리가 여전히 ad eternum을 실행하고있는 것처럼 보이기 때문에 메모리 조정 부분을 지금 시도하고 있습니다. – Rui

+0

루이, 설명 계획을 붙여 넣을 수 있습니까? (분석 없음) – mikelikespie

관련 문제