非常慢的sql插入查询

时间:2014-02-27 05:20:28

标签: sql postgresql query-optimization

我有postgresql功能,工作非常慢。其中一个查询存在问题。有没有办法优化它?我做的索引没多大帮助。

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

2 个答案:

答案 0 :(得分:0)

我建议弄清楚SELECT或INSERT是否是瓶颈。如果SELECT很慢,请尝试将索引添加到WHERE中使用的字段(如running_sum_abs_begin)。如果插入是播种,请检查您是否有例如在aa_c_axis_doc_oper表上插入触发器。

如果要插入大量记录,则可能是单个事务问题。您应该尝试将插入分成多个较小的事务。

答案 1 :(得分:0)

aa_c_axis_doc_oper上是否有索引或触发器?如果是这样,请尝试暂时禁用它们。

aa_oper_axis和aa_src1上是否有pool_id的索引?如果没有,请尝试添加它们。

相关问题