PostgreSQL中的慢插入

时间:2011-02-07 16:39:03

标签: performance postgresql insert

在表格中执行INSERT时遇到问题。

表结构是:

uri (varchar 10000) PK
id_language (varchar 10) PK
id_category (int4) PK
id_data (varchar 50) PK
id_ordinal (int4) PK (this field have a trigger to auto increment)
n_text (text)

当我运行此功能来执行900000 INSERT时,它运行良好且快速:

CREATE OR REPLACE FUNCTION doInserts() RETURNS integer AS
$BODY$
DECLARE
   i integer;
BEGIN
       i := 1;

       while i <= 900000 loop
               insert into tdir_uris_text (uri, id_language, id_category, id_data, n_text) values ('http://localhos/teste' || i, 'PORT', '2', 'pagetitle', 'Pagina teste ' || i);

               i := i + 1;
       end loop;
   RETURN i;
END
$BODY$
LANGUAGE 'plpgsql' ;

但是当我使用100000 INSERT时,它似乎永远不会结束 INSERT的操作,它现在在5h运行......

CREATE OR REPLACE FUNCTION doInserts() RETURNS integer AS
$BODY$
DECLARE
   i integer;
BEGIN
       i := 1;

       while i <= 100000 loop
               insert into tdir_uris_text (uri, id_language, id_category, id_data, n_text) values ('http://localhos/teste' || i, 'PORT', '2', 'pagetitle', 'Pagina teste ' || i);
               insert into tdir_uris_text (uri, id_language, id_category, id_data, n_text) values ('http://localhos/teste' || i, 'PORT', '2', 'country_ad', 'italy');
               insert into tdir_uris_text (uri, id_language, id_category, id_data, n_text) values ('http://localhos/teste' || i, 'PORT', '2', 'services_available', 'service 1');
               insert into tdir_uris_text (uri, id_language, id_category, id_data, n_text) values ('http://localhos/teste' || i, 'PORT', '2', 'services_available', 'service 2');

               i := i + 1;
       end loop;
   RETURN i;
END
$BODY$
LANGUAGE 'plpgsql' ;

这可能是什么问题?有线索吗?可能是钥匙问题?

还有一个信息。插入900000寄存器后,我使用“DELETE FROM”删除寄存器,然后运行只插入100000寄存器的函数

最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

  

(此字段触发自动   增量)

为什么使用触发器?你不能使用SERIAL(a.k.a。SEQUENCE)吗?

并且具有相同值的100.000插入是一个不错的测试,但与真实的实时使用无关。这些100.000插入在同一事务中运行,因此您必须优化大型事务的配置设置。你对内存,WAL等有什么设置?

答案 1 :(得分:1)

使用序列而不是触发器。每次测试时,请确保截断不删除。