powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить работу INSERT (faq читан)
18 сообщений из 68, страница 3 из 3
Ускорить работу INSERT (faq читан)
    #33027417
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Но вы писали: "смотрел на бегущие инсерты, через часа три бегут значительно медленне". Сколько строк было обработано в вашем тесте за три часа?

Беру таймаут на проведение тестов.

А вот про апдейты интересно. Действительно где дока?
А по задумке данное должно прыгать из таблицы в таблицу минимум 3 раза и только потом в архив.. Похоже плохая задумка :D
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33027463
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
короче я придумал нужно прыгнуть на ступеньку выше (от техн реализации)

2АК
приведи задачу полностью (без существующего решения)
откуда поступает инфа и что нужно получить в итоге (и если надо в промежутке) и тогда можно попробовать перестроить схему работы с наименьшими изменениями

кстати программера можно подключить :-))
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33029246
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
domanixв даенном случае судя по коду , идет заливка большого массива данных и на каждый инсерт срабатывает триггер который делает
update таблицы dev.current_data

а мне кажется из программы идет UPDATE через ХП в табл dev.current_data, а только потом срабатывает триггер на INSERT в arh.base_temp1

domanix
Так вот - каждый update - рождает в таблице dev.current_data
новую версию записи..
соответвенно при моллионе вставленных записей
будет миллион версий записей в dev.current_data,


ничего каждый UPDATE не рождает и ничего подобного вроде миллиона версий не будет. Те при простых UPDATE (как впрочем и INSERT зависимость будет линейная).

Пробовал просто UPDATE в таблицу с индексами и без оных и все впорядке ничего не тормозит

попробую еще через хранимку, а потом на все это дело повешу триггер (делаю так потому что интересно прогнать все блоки отдельно и только потом их соеденить)
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33029273
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здача глобальна :)
Контроль и управление тех процессом.
сбор информации, обработка, показ текущего среза на месте оператора.
сохранение в архив. Требуется телать некоторые расчеты, на основе принятых данных и отправлять их исполнительным механизмам.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33051582
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
появились новые интересные данные

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
[alexs:titan:~]>time perl -e 'printf "begin;\n"; for (my $i=1; $i<=10000; $i++) { printf
"select adding(%d, %d, %f, %d, %d, NULL, NULL);\n", rand(10), rand(10), rand(), rand(1000
), 1+rand(256); } printf "commit;\n";' | psql DEVDATA > /dev/null

real    2m21.050s
user    0m1.194s
sys     0m0.541s
[alexs:titan:~]>time perl -e 'printf "begin;\n"; for (my $i=1; $i<=10000; $i++) { printf
"select adding(%d, %d, %f, %d, %d, NULL, NULL);\n", rand(10), rand(10), rand(), rand(1000
), 1+rand(256); } printf "commit;\n";' | psql DEVDATA > /dev/null

real    2m23.314s
user    0m1.144s
sys     0m0.596s
[alexs:titan:~]>time perl -e 'printf "begin;\n"; for (my $i=1; $i<=10000; $i++) { printf
"select adding(%d, %d, %f, %d, %d, NULL, NULL);\n", rand(10), rand(10), rand(), rand(1000
), 1+rand(256); } printf "commit;\n";' | psql DEVDATA > /dev/null

real    1m50.266s
user    0m1.200s
sys     0m0.516s
[alexs:titan:~]>time perl -e 'printf "begin;\n"; for (my $i=1; $i<=100000; $i++) { printf
 "select adding(%d, %d, %f, %d, %d, NULL, NULL);\n", rand(10), rand(10), rand(), rand(100
0), 1+rand(256); } printf "commit;\n";' | psql DEVDATA > /dev/null
^[[G
real    141m42.463s
user    0m11.228s
sys     0m5.883s
[alexs:titan:~]>time perl -e 'printf "begin;\n"; for (my $i=1; $i<=10000; $i++) { printf
"select adding(%d, %d, %f, %d, %d, NULL, NULL);\n", rand(10), rand(10), rand(), rand(1000
), 1+rand(256); } printf "commit;\n";' | psql DEVDATA > /dev/null

real    2m55.779s
user    0m1.067s
sys     0m0.665s

Как видно быстрее сделать 10 раз по 10000 записей чем один раз 100000.
К чему бы это?
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33052372
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vfabr
domanixТак вот - каждый update - рождает в таблице dev.current_data
новую версию записи..
соответвенно при моллионе вставленных записей
будет миллион версий записей в dev.current_data,
ничего каждый UPDATE не рождает и ничего подобного вроде миллиона версий не будет. Те при простых UPDATE (как впрочем и INSERT зависимость будет линейная).

Ага, не рождает :-) Попробуй следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create table group_sum
(
    group_id int not null primary key,
    amount  float8 not null default  0 
) without oids;

insert into group_sum(group_id) select generate_series( 1 , 200 );

create table things_selled
(
    id_thing serial primary key,
    group_id int not null,
    ru          float8 not null
) without oids;

create function tr_things_insert_a_sum_update() returns trigger as $$
begin
    update group_sum set amount=amount+NEW.ru where group_id=NEW.group_id;
    return NULL;
end;
$$
language plpgsql;

create trigger tr_things_insert_a after insert 
    on things_selled for each row
    execute procedure tr_things_insert_a_sum_update();

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 200000 ) as it) t;
--INSERT отработал за 59 секунд без триггера
-- А с триггером ?!!!!
-- Уже прошло 4970 секунд и не завершилось!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- Не могу больше ждать - комп тормозит

-- Ну а теперь:
vacuum full verbose things_selled;
-- И наконец-то
vacuum full verbose group_sum;
Размеры таблиц: 10MB things_selled и 9MB group_sum.
При это логов накаталось на 8*16MB=128MB . Кто сказал, что логгирование не тормозит? :-)

Настройки постгресса-по умолчанию. Кто добьется хорошего улучшения результата - сообщите.

Как кто-то сказал (извини, что поленился найти), да и я сам пробовал, дешевле оказывается использовать plperl и его %_SHARED для накопления результата в FOR EACH ROW и потом сбрасывать результат в FOR EACH STATEMENT. Или еще где-нибудь.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33052511
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 1000 ) as it) t;

--Запрос успешно завершён: строк изменено: 1000, время: 2390 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 1000 ) as it) t;

--Запрос успешно завершён: строк изменено: 1000, время: 3187 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 1000 ) as it) t;

--Запрос успешно завершён: строк изменено: 1000, время: 1250 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 1000 ) as it) t;

Запрос успешно завершён: строк изменено:  1000 , время:  1406  мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 1000 ) as it) t;

Запрос успешно завершён: строк изменено:  1000 , время:  1141  мс.
DELETE и VACUUM FULL обе таблицы и INSERT в group_sum.
Затем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 5000 ) as it) t;
--Запрос успешно завершён: строк изменено: 5000, время: 7515 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 5000 ) as it) t;
--Запрос успешно завершён: строк изменено: 5000, время: 9015 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 5000 ) as it) t;
--Запрос успешно завершён: строк изменено: 5000, время: 11515 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 5000 ) as it) t;
--Запрос успешно завершён: строк изменено: 5000, время: 12297 мс.
Снова чистим таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 10000 ) as it) t;
--Запрос успешно завершён: строк изменено: 10000, время: 21641 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 10000 ) as it) t;
--Запрос успешно завершён: строк изменено: 10000, время: 28578 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 10000 ) as it) t;
--Запрос успешно завершён: строк изменено: 10000, время: 34515 мс.
И самый последний тест(снова почистились):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 20000 ) as it) t;
--Запрос успешно завершён: строк изменено: 20000, время: 70094 мс.

insert into things_selled (group_id,ru)
    select gr,sin(it+gr) from (select generate_series( 1 , 200 ) as gr,generate_series( 1 , 20000 ) as it) t;
--Запрос успешно завершён: строк изменено: 20000, время: 104688 мс.
Впечатляет ...
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33052558
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КлючниковКак видно быстрее сделать 10 раз по 10000 записей чем один раз 100000.Это можно было заметить и по моим результатам : 4m59.599s / 100 000 > 0m18.317s / 10 000. Но мы не заметили. :)

Алексей КлючниковК чему бы это?К вопросу выбора оптимальной длины транзакции. Почему так происходит, не знаю.

Funny_Falconupdate group_sum set amount=amount+NEW.ru where group_id=NEW.group_id

-- Уже прошло 4970 секунд и не завершилось!попробуйте создать индекс на group_sum.group_id
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33052603
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй день играю с параметрами в postgresql.conf
пока не нашел что бы что то сильно влияло на скорость инсертов.
тюнинг операционной системы совсем видимо не скоро удасться сделать
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33052616
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ключниковпока не нашел что бы что то сильно влияло на скорость инсертовfsync?
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33052674
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat
fsync


Неа :)

checkpoint_segments
#checkpoint_timeout
Вот этими параматрами можно сильно попортить скорость..
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33053434
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat Funny_Falcon
update group_sum set amount=amount+NEW.ru where group_id=NEW.group_id

-- Уже прошло 4970 секунд и не завершилось!
попробуйте создать индекс на group_sum.group_id

Извини, а group_id int PRIMARY KEY по твоему этого не делает ????????
Если нет, то я барсук. Но это еще надо доказать.

Построй таблицу, залей в нее много данных (чтоб seqscan не выбирался) и сделай EXPLAIN запроса, содержащего условие по PRIMARY KEY. Там ты увидешь INDEX SCAN.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33054001
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falcon vfabr
domanixТак вот - каждый update - рождает в таблице dev.current_data
новую версию записи..
соответвенно при моллионе вставленных записей
будет миллион версий записей в dev.current_data,
ничего каждый UPDATE не рождает и ничего подобного вроде миллиона версий не будет. Те при простых UPDATE (как впрочем и INSERT зависимость будет линейная).

Ага, не рождает :-) Попробуй следующее:


первая причина почему не буду пробовать твой пример заключается хотя бы в том, что он не соответствует тому как действительно работает программа АК (смотри страницу 2). У тебя совершенно другая структура. Прежде чем ответить, возьми лист бумаги и нарисуй то что написал АК и то что придумал ты. А после этого посмотри еще раз мой пост [1488436]...

И еще я придерживаюсь мнения что если запрос умещается в одну строку в экран то никакую ХП под него лепить не надо, а если не лепить ХП то в случае АК (основываясь на его примере см стр.2) ничего подобного ввиде миллиона записей не будет.

далее почему процедура (тригерная) написана как plpgsql? почему не просто sql??? по моему есть разница ...
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33054972
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vfabr

А ты пробовал триггерную функцию на SQL написать? Лично у меня (Postgres 8.0.2) выдаёт:
ERROR: SQL functions cannot return type "trigger"
на следующую конструкцию:
Код: plaintext
1.
2.
3.
4.
5.
CREATE OR REPLACE FUNCTION tr_things_insert_a_sum_update_sql()
  RETURNS "trigger" AS
$BODY$
    update group_sum set amount=amount+NEW.ru where group_id=NEW.group_id;
$BODY$
  LANGUAGE 'sql' VOLATILE;
Если из моно создать как-то ещё, подскажи.
А по поводу структуры: не один икс, вставлять в А, потом апдейтить в Б или апдейтить в Б, а потом вставлять в А?
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33055075
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
про trigger на SQL меня бить надо потому что в доке написано что можно реализовать trigger на любом языке встроенном кроме как на чистом SQL :-/

спасибо FF я был не прав

насчет А и Б
я не скажу прям щас точно насчет логирования и пт но разница есть

миллиона записей Update в случае АК не будет потому что происходит автокомит после вызова функции. Может и залогируется 1000000 Insertov, а может и нет.

И вообще (ИМХО) структура не совсем верная у базы ... поэтому и тормоза
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33055752
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vfabrмиллиона записей Update в случае АК не будет потому что происходит автокомит после вызова функции. Может и залогируется 1000000 Insertov, а может и нет.
будут, но делаются по очереди а не пачкой, поэтому и автокоммит.

vfabrИ вообще (ИМХО) структура не совсем верная у базы ... поэтому и тормоза
Как же производить обработку информации?
на current_data навешены набор правил и триггер который переклабывает в архив. ХП нужны в любом случае.
Некоторые данные через правила проходят через 5-6 ХП до того как лягут в архив. Поэтому в любом случае нужна такая таблица как current_data, иначе все оберации придется делать в прямо в архиве..
на Данный момент обработке подвергаются 1-0.5% данных.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33057036
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_Falcon LeXa NalBat Funny_Falcon
update group_sum set amount=amount+NEW.ru where group_id=NEW.group_id

-- Уже прошло 4970 секунд и не завершилось! попробуйте создать индекс на group_sum.group_idИзвини, а group_id int PRIMARY KEY по твоему этого не делает ???????? Угу, слона то я и не заметил. Сорри, беру свой совет назад.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33060844
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АКпоэтому и автокоммит

автокоммит всегда происходит если не сказанно BEGIN [TRANSACTION] те явным образом не объявлена транзакция.

Насчет структуры ...

мне кажеться что нужна некоторая буферная таблица (без индексов и прочей мутотени) куда складываются данные (грязные) и потом их обрабатывать и раскидывать куда нужно.

Вопрос в скорости отображения результатов полученных от датчиков. Может актуальность в 30 сек или 1 мин вполне приемлема тогда и тригеров и хранимок может меньше понадобится да и загрузка сервака меньше (ИМХО) должна быть ну и тд. (но поскольку я незнаю постановку задачи и темболее не знаю реализацию то все вышесказанное может быть совершенным бредом :-)))
...
Рейтинг: 0 / 0
18 сообщений из 68, страница 3 из 3
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить работу INSERT (faq читан)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]