Performance PostgreSQL中的慢速插入

Performance PostgreSQL中的慢速插入,performance,postgresql,insert,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 RE

我在表中执行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' ;
CREATE或REPLACE函数doInserts()将整数返回为
$BODY$
声明
i整数;
开始
i:=1;
而我
(此字段有一个自动触发器
增量)

你为什么用扳机?你不能用序列号吗


具有相同值的100.000个insert是一个不错的测试,但与实际使用情况无关。这100.000个插入在同一个事务中运行,因此您必须为相当大的事务优化配置设置。内存、WAL等的设置是什么?

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

在使用第二个函数之前,请尝试使用“truncate”清空表-它将释放所有磁盘空间,并重置查找位置以插入新行的算法。
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' ;