2011-02-07 84 views
2

在表中执行INSERT时出现问题。在PostgreSQL中插入缓慢

表结构是:

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操作,它是在现在5小时运行...

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个寄存器

问候功能,

+0

尝试使用“TRUNCATE”在使用第二个函数之前清空表 - 它将释放所有磁盘空间并重置用于查找插入新行的某处的算法。 – araqnid 2011-02-07 17:00:06

回答

1

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

1

(此字段有一个触发器,以汽车 增量)

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

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