作为一个简短的前言,我是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
什么都喜欢,如果你只是通过1000环在功能重复的单行更新的时机?我们先排除一般的缓慢。 –
我在suse linux X86_64的postgreSQL 8.1.9上测试过,结果是:1000行在3秒内更新。每增加1000条记录添加timeofday()函数并将结果发送给我们。 – AndreaBoc
感谢您对版本进行了清晰的说明;它确实有帮助,因为当人们说“PostgreSQL”的时候,他们的意思是“Greenplum”或者“ParAccel”,这是非常令人沮丧的。你真的在运行“基于PostgreSQL 8.1的ParAccel”。 –