首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql游标更新速度较慢

postgresql游标更新速度较慢
EN

Stack Overflow用户
提问于 2013-06-21 23:32:34
回答 1查看 1.1K关注 0票数 2

作为简短的前言,我是postgresql的新手。此外,我需要的postgresql版本是8.1。原因是PostgreSQL8.1是ParAccel实现和支持的该语言的最后一个版本。

Postgresql游标,至少在8.1中,对于DML操作是非常慢的,比如UPDATE或INSERT (还没有测试过DELETE,但假设它是一样的)。这只是一个示例来演示:

代码语言:javascript
复制
create table tab_cur_DML_test (col_key int,col_dml varchar(50));

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

代码语言:javascript
复制
insert into tab_cur_DML_test (col_key, col_dml)
select card_id, card_no
from card_dim;

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

代码语言:javascript
复制
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;

运行后:

代码语言:javascript
复制
select * from fn_cursor_DML_test();

速度大约是每30秒1000条记录。

同样,这只是一个普通的更新,可以作为基于集合的操作来完成。我在这里使用它只是为了模拟使用游标的逐行处理。在类似的实际任务中,当需要逐行处理时,在使用纯sql不能做到或将过于庞大和/或复杂的情况下,使用处理速度如此之低的游标根本就不是一个可行的选择。

我怀疑这是由于数据库引擎中的上下文切换造成的。我的问题是,在ParAccel (v4.0)中,有没有任何可能的变通办法(或者只是某种方式)来显著改善PostgreSQL8.1游标中的逐行逻辑,如果这很重要的话?

谢谢!

斯坦尼斯拉夫

EN

回答 1

Stack Overflow用户

发布于 2013-07-03 08:18:46

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

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

http://en.wikipedia.org/wiki/Column-oriented_DBMS

http://www.paraccel.com/resources/resources-2.php#.UdNv0m024V0

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17239071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档