Медленные вставки в PostgreSQL - PullRequest
2 голосов
/ 07 февраля 2011

У меня проблема при выполнении 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 ВСТАВКИ, она работает хорошо и быстро:

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 регистров

С наилучшими пожеланиями,

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Используйте последовательность, а не триггер.Каждый раз, когда вы тестируете, убедитесь, что вы усекаете, не удаляете.

1 голос
/ 07 февраля 2011

(в этом поле есть триггер для автоматического увеличения)

Почему вы используете триггер?Вы не можете использовать SERIAL (иначе SEQUENCE)?

И 100.000 вставок с одинаковым значением - хороший тест, но он не имеет ничего общего с реальным использованием в реальном времени.Эти 100 000 операций вставки выполняются в рамках одной транзакции, поэтому вам необходимо оптимизировать параметры конфигурации для довольно крупных транзакций.Каковы ваши настройки памяти, WAL и т. Д.?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...