2013-06-21 67 views
2

作为一个简短的前言,我是postgresql的新手。此外,我需要的建议是8.1的postgresql版本。原因是postgresql 8.1是ParAccel最后实现和支持的这种语言版本。postgresql光标更新缓慢

Postgresql游标至少在8.1中对于DML操作(如UPDATE或INSERT(未测试DELETE,但假定它将相同))非常慢。这只是一个例子来说明:

insert into tab_cur_DML_test (col_key, col_dml) 
select card_id, card_no 
from card_dim; 

tab_cur_DML_test现在有几千条记录有两个字段仅

create or replace function fn_cursor_DML_test() returns void as 
$body$ 
declare 
    v_col_key     card_dim.card_id%type; 
    v_col_dml     card_dim.card_no%type; 
    cur      refcursor; 
    v_count_proccessed_recs   bigint := 0 ; 
begin 
    open cur for select card_id, card_no from card_dim; 
    loop 
     fetch cur into v_col_key, v_col_dml; 
     if not found then exit; end if; 

     update tab_cur_DML_test 
     set col_dml = v_col_dml 
     where col_key = v_col_key; 

     v_count_proccessed_recs := v_count_proccessed_recs + 1; 

     if v_count_proccessed_recs%10 = 0 then 
       raise info '%', v_count_proccessed_recs; 
     end if; 
    end loop; 

end; 
$body$ 
language plpgsql volatile; 

运行后:

create table tab_cur_DML_test (col_key int,col_dml varchar(50)); 

从一些表中的一些记录填充它它:

select * from fn_cursor_DML_test(); 

速度每30秒约有一千条记录。

此外,这只是一个普通的更新,可以作为基于集合的操作来完成。我在这里使用它只是为了模拟游标的逐行处理。在类似的真实任务情况下,当需要逐行处理时,在使用普通的sql不会执行的情况下,否则将会过于庞大和/或复杂,仅使用具有如此低处理速度的光标变成不可行的选择。

我怀疑这是由于数据库引擎中的上下文切换。我的问题是,是否有任何可能的解决方法(或者只是某种特定的方式)显着改善postgresql 8.1游标中的逐行逻辑,如果这很重要 - 在ParAccel(v。4.0)中?

谢谢!

Stanislav

+0

什么都喜欢,如果你只是通过1000环在功能重复的单行更新的时机?我们先排除一般的缓慢。 –

+0

我在suse linux X86_64的postgreSQL 8.1.9上测试过,结果是:1000行在3秒内更新。每增加1000条记录添加timeofday()函数并将结果发送给我们。 – AndreaBoc

+0

感谢您对版本进行了清晰的说明;它确实有帮助,因为当人们说“PostgreSQL”的时候,他们的意思是“Greenplum”或者“ParAccel”,这是非常令人沮丧的。你真的在运行“基于PostgreSQL 8.1的ParAccel”。 –

回答

2

ParAccel不是PostgreSQL。这些是针对不同目的设计的具有不同特征的两种不同产品。 ParAccel基于PostgreSQL,但它使用列式存储,MPP和优化器被完全重写。只是碰巧他们保留了PL扩展(最有可能的原因是在某些情况下减轻了ETL的编排),但他们放弃了支持。 Vertica等其他竞争对手甚至没有在其产品中使用pgPL扩展。

您遇到的症状与PostgreSQL无关。这就是ParAccel不支持pgPL/SQL解析器的原因。该数据库不是为行逐行处理而设计的,因为它是列式的。单次更新/插入/删除将占用尽可能多的资源,因为您会在数百万行上执行相同的操作。你为什么需要在这里使用PL?只需运行更新。 ...并阅读更多关于柱状数据库的信息。如果您需要逐行操作并且您没有太多选择,ParAccel不是您需要的正确产品。

http://en.wikipedia.org/wiki/Column-oriented_DBMS
http://www.paraccel.com/resources/resources-2.php#.UdNv0m024V0