2014-04-15 2 views
1

쿼리를 최적화하려고합니다. vwml_premelissa를 업데이트하는 테이블에는 3.5mil 레코드가 있습니다. 어떤 레코드를 업데이트해야 하는지를 지정하는 두 번째 테이블 (50k 레코드)이 있습니다.index postgres를 사용하지 않음

"vin"열에 vwml_premelissa에 대한 고유 색인이 있습니다.

CREATE UNIQUE INDEX pkey_vwml_premelissa 
    ON extras.vwml_premelissa 
    USING btree 
    (vin COLLATE pg_catalog."default"); 

쿼리 ...

update extras.vwml_premelissa 
    set suppress = 'THREE' where vin in (select vin from extras.vwml_threes) 

내 dev에 상자에 시간 이상하고있다. 내가 쿼리에 설명 할 때 나는

Update on vwml_premelissa (cost=1837.07..412393.58 rows=52892 width=182) 
    -> Hash Semi Join (cost=1837.07..412393.58 rows=52892 width=182) 
     Hash Cond: ((vwml_premelissa.vin)::text = (vwml_threes.vin)::text) 
     -> Seq Scan on vwml_premelissa (cost=0.00..219004.32 rows=3685132 width=176) 
     -> Hash (cost=865.92..865.92 rows=52892 width=24) 
       -> Seq Scan on vwml_threes (cost=0.00..865.92 rows=52892 width=24) 

왜 포스트 그레스는 vwml_premelissa의 서열 스캔을하는 대신이 업데이트해야 레코드를 찾기 위해 인덱스를 사용하여 주장 않는거야?

포스트 그레스 9.2 창

+0

통계가 최신 상태입니까 ('analyze')? 'IN' 대신 join을 시도 할 수도 있습니다. –

답변

0

엔진이 그것의 생각하면 나는 DBMS 전문가가 아니에요, 나는 PostgreSQL을의 모든 시간을 보낸 이후 수년이 지난 지금,하지만 일부의 RDBMS에서 쿼리가 항상 인덱스를 사용하지 않는 어쨌든 테이블 스캔을 수행해야합니다. 예를 들어, vwml_threes의 카디널리티가 높고 행 수가 vwml_premelissa 인 경우 엔진에서 vwml_threes의 각 레코드에 대한 인덱스 조회를 수행하는 것과 같이 테이블 스캔을 수행하는 것이 효율적일 수도 있습니다.

전체 기준 업데이트가 완료 될 때까지 날짜별로 청킹 한 다음 추가 청크를 반복 할 수 있습니다. 물론 성능 향상을 원한다면 이러한 기준을 인덱싱해야하므로 전체 쿼리 비용에 누락 된 인덱스 추가가 포함되므로 일회성 쿼리에는 적합하지 않을 수 있습니다.

나는이 설명이 PostgreSQL에 적용된다면 듣고 싶다. 나는 틀렸을 것이다.

관련 문제