2014-02-27 3 views
2

나는 매우 느리게 작동 postgresql 기능이 있습니다. 쿼리 중 하나에 문제가 있습니다. 최적화 할 방법이 있습니까? 내가 만든 색인은별로 도움이되지 못했습니다. 매우 느린 SQL 삽입 쿼리

INSERT INTO aa_c_axis_doc_oper 
SELECT a.pool_id, 
     l.lane_id, 
     a.axis_id, 
     l.id AS src_row_id, 
     a.running_sum_abs, 
     a.running_sum_abs_begin_max, 
     l.program_id 
FROM aa_oper_axis AS a 
     INNER JOIN aa_src1 AS l 
       ON a.pool_id = l.pool_id 
WHERE l.running_sum_abs_begin <= a.running_sum_abs_begin_max 
     AND a.running_sum_abs <= l.running_sum_abs 

Insert on aa_c_axis_doc_oper (cost=0.00..19727005.41 rows=345535083 width=84) (actual time=5428290.637..5428290.637 rows=0 loops=1) 
    -> Nested Loop (cost=0.00..19727005.41 rows=345535083 width=84) (actual time=235.809..5348024.371 rows=9954308 loops=1) 
     -> Seq Scan on aa_oper_axis a (cost=0.00..50396.63 rows=6085633 width=72) (actual time=0.040..3351.155 rows=6012431 loops=1) 
     -> Index Scan using aa_src1_pool_id_running_sum_abs_begin_running_sum_abs_idx on aa_src1 l (cost=0.00..2.75 rows=57 width=34) (actual time=0.881..0.887 rows=2 loops=6012431) 
       Index Cond: ((pool_id = a.pool_id) AND (running_sum_abs_begin <= a.running_sum_abs_begin_max) AND (a.running_sum_abs <= running_sum_abs)) 
Total runtime: 5428290.775 ms 
+0

아마도 여기에 더 많은주의를 기울일 것입니다. (http://codereview.stackexchange.com/) 또는 [여기] (http://dba.stackexchange.com/) – Alexander

+0

@Alexander ...하지만 당신은 할 수 있습니다. 마이그레이션을 위해 플래그를 지정하십시오. Madbw, 다른 곳에 다시 게시 할 필요는 없습니다. –

+0

@CraigRinger 나는 그것을 몰랐다. 고마워. 사실, 그건 단지 제안이었습니다. 확실하지 않습니다. – Alexander

답변

0

내가 SELECT 또는 INSERT가 bottleeneck인지 알아낼 제안 설명한다. SELECT가 느린 경우 WHERE에 사용 된 필드에 인덱스를 추가하십시오 (예 : running_sum_abs_begin). 인서트가 뿌리면 예를 들어 있는지 확인하십시오. aa_c_axis_doc_oper 테이블에 트리거를 삽입하십시오.

삽입 할 레코드가 많은 경우 단일 트랜잭션 문제 일 수 있습니다. 삽입을 여러 개의 작은 트랜잭션으로 분할해야합니다.

0

aa_c_axis_doc_oper에 인덱스 또는 트리거가 있습니까? 그렇다면 임시로 비활성화하십시오.

aa_oper_axis 및 aa_src1에 pool_id에 대한 인덱스가 있습니까? 그렇지 않은 경우 추가하십시오.

+0

aa_src1에는 색인이 있습니다 (pool_id, running_sum_abs_begin ASC, running_sum_abs ASC). aa_oper_axis 및 aa_src1에는 색인이 있습니다 (pool_id, running_sum_abs ASC, running_sum_abs_begin_max ASC). aa_c_axis_doc_oper에는 하나의 색인이 있습니다. 나는 그것을 막으려 고 노력할 것이다. 모두 3은 트리거가없는 임시 테이블입니다. –

+0

가능한 경우 고유 한 pool_id에 대해서만 aa_oper_axis 및 aa_src1에 대한 색인을 시도 할 수 있습니다. – Owen