2011-02-07 130 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等的設置是什麼?