powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить работу INSERT (faq читан)
25 сообщений из 68, страница 1 из 3
Ускорить работу INSERT (faq читан)
    #32996439
Vasily_s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Нужно вставить в таблицу более миллиона строк, с ростом количества
postgre начинает все более и более медленно работать, почему?
Если бы скорость не падал, то было бы и ничего.
COPY не катит, нужно вставлять данные связанные с другими таблицами и
есть поле serial. Индексов нет.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32996493
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasily_s нужно вставлять данные связанные с другими таблицами и
есть поле serial
ну, сериал вряд ли тормозит. А вот вторичные ключи и чеки могут. Можете в начале транзакции снести чеки и форейгн кеи, а в конце создать правила (чеки и фк) наново (и даже предварительно провернуть удаление "неправильных" (не соответствующих чекам и ф.к.) строк). Но, боюсь, это может потребовать ровно столько же времени (надо пробовать).
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32996598
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vacuum analuze делай перед пачкой Insert'ов
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32996628
Vasily_s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321 Vasily_s нужно вставлять данные связанные с другими таблицами и
есть поле serial
ну, сериал вряд ли тормозит. А вот вторичные ключи и чеки могут. Можете в начале транзакции снести чеки и форейгн кеи, а в конце создать правила (чеки и фк) наново (и даже предварительно провернуть удаление "неправильных" (не соответствующих чекам и ф.к.) строк). Но, боюсь, это может потребовать ровно столько же времени (надо пробовать).
Хм, вставка происходит в пустую базу/таблицу, т.е. сразу после установки
Postgree, да, версия 7.4.7.

wbearvacuum analuze делай перед пачкой Insert'ов
Они по одному идут, без всяких замудрений, при направлении в ноль, софтина
отрабатывает шустро.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32997271
roottim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
при миллионе, я бы временно загрузил сначала напрямую
затем insert into NunaTable select * from NenunaTable и так по всей иерархии связанных таблиц
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32999355
Vasily_s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roottimпри миллионе, я бы временно загрузил сначала напрямую
затем insert into NunaTable select * from NenunaTable и так по всей иерархии связанных таблиц
Это все понятно, но это кусок хороший переписывать.
Вопрос немного в другом, ПОЧЕМУ с ростом базы INSERT работает все медленнее
и медленнее??????????
Если бы скорость не падала, то и проблем бы не было. А так более 5 раз
замедление и прогрессирует!
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32999599
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasily_s
Вопрос немного в другом, ПОЧЕМУ с ростом базы INSERT работает все медленнее
и медленнее??????????
Если бы скорость не падала, то и проблем бы не было. А так более 5 раз
замедление и прогрессирует!
А вставки делаются в одну таблицу или в несколько связанных?

Замедление, кроме того, может происходить в случае, если выполняется CHECKPOINT. После того, как он закончит выполняться, всё снова будет быстро...
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #32999773
Vasily_s
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sad Spirit Vasily_s
Вопрос немного в другом, ПОЧЕМУ с ростом базы INSERT работает все медленнее
и медленнее??????????
Если бы скорость не падала, то и проблем бы не было. А так более 5 раз
замедление и прогрессирует!
А вставки делаются в одну таблицу или в несколько связанных?

Замедление, кроме того, может происходить в случае, если выполняется CHECKPOINT. После того, как он закончит выполняться, всё снова будет быстро...
в одну, более 95-97% простые инсерты, есть немного инсертов со связями.
так, нормально не становится, чем дальше, тем хуже :(
Тут собственно я грешу на размеры файлов базы, можно ли как задать их
размер менее чем 1Gb по умолчанию.
Блин, неужели на больших размерах ни у кого не тормозят инсерты на базах
более нескольких миллионов записей???
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33001505
Croco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно из-за особенностей работы файловой структуры. Если таблица большая (а она хранится в системе в виде файла с именем OID), то влияет дефрагментация файла и прочие фишки для файлов большой длины.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33001657
NECTIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Crocoто влияет дефрагментация файла и прочие фишки для файлов большой длины.

На Линуксе дефрагментация отсутствует.
Или у вас есть предложения?
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33003017
neko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, вставка происходит в пустую базу/таблицу, т.е. сразу после установки

исходя вот из этого заявления:

во-первых это таблиц(у/ы) нужно создать без constraints, без check, и без индексов. (если непонятно, это также означает и без первичного ключа)

во-вторых надо обязательно использовать COPY и наче никак.

в-третьих можно увеличить значения checkpoint_segments, wal_buffers

дальше, когда будут создаваться индексы и ключи, имеет смысл задрать maintenance_work_mem, если конечно это не слишком занятая машина
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33006348
джанкер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
избавься от вторичных ключей
по возможности разумееца
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33006744
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nekoво-первых это таблиц(у/ы) нужно создать без constraints, без check, и без индексов. (если непонятно, это также означает и без первичного ключа)

во-вторых надо обязательно использовать COPY и наче никак.

в-третьих можно увеличить значения checkpoint_segments, wal_buffers


И еще можно fsync=off. Сам не экспериментировал, хотя скоро может встать потребность (~100000 строк возможно единовременно и желательно без больших задержек, т.к. реал-тайм).

Моё глубокое убеждение, что тормозит логгирование.

Кроме того, попробовал как-то раз триггер повесить на суммирование поля в другой таблице, так он для каждой строчки, вставляемой в target таблицу, вставлял в sum таблицу, а потом её ещё раз переписывал и т.д. Версионник это хорошо, но если б он на винт сбрасывал только конечные версии, было бы совсем замечательно. Тогда я написал систему триггеров на perl, которая суммировала это дело, а потом сбрасывало в sum таблицу.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33009589
neko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Funny_Falcon
И еще можно fsync=off. Сам не экспериментировал, хотя скоро может встать потребность (~100000 строк возможно единовременно и желательно без больших задержек, т.к. реал-тайм).

Моё глубокое убеждение, что тормозит логгирование.


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

суть теста
сделать поочереди несколько измерений времени при INSERTе в PG записей (правда 8.0 у меня может поэтому и рез такие. Хотя большие сомнения у меня что они ядро настолько переписали)
10 000
100 000
500 000
1000 000
потом снова
10 000
100 000
500 000
(дальше не стал - место на винте кончилось да и ждать долго а ночью комп спать мешает)

Комп обычный домашний
- Celeron 1.7 ГГц
- памяти 512
- винт какойто IBM если мне память не изменяет
- база PostgreSQL 8.0.0 установка по дефолту (те ничего не настраивал поставил и все)
- ОС WindowsXP (дефрагментация не делалась никогда ОС стоит около года причем на диске где стоит Postgre и где находится tablespace всевремя чего нить записывают а потом стирают например кино)
- клиент Java 1.4
- DDL таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create table test_insert(
id serial NOT NULL,
mtext text,
mvarchar varchar( 255 ),
mint2 int2,
mint4 int4,
mfloat4 float8,
mfloat8 float4,
mvarchar2 varchar( 255 ),
mvarchar3 varchar( 255 ),
mint2_2 int2,
mint4_2 int4,
mvarchar4 varchar( 255 ),
mtext2 text
)
--------------------------
код на java
Код: 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.
...
try{
      Class.forName(driver);
      dbCon = DriverManager.getConnection(sourceURL, login, passwd);
      String text = "wetwt wetwert vwe we .... ryher"; //(размер  1 .5Кб)
      String str = "sjdhfk js ksjg ojsg osg js dgsjbdg sg s gslkdjgb slkdjgb ";
      String query = "INSERT INTO public.test_insert (mtext, mvarchar, mint2, mint4, mfloat4, mfloat8, mvarchar2, mvarchar3, mint2_2, mint4_2,  mvarchar4, mtext2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
      PreparedStatement st = dbCon.prepareStatement(query);
      for(int i =  0 ; i <  100000 ; i++){
        st.setString( 1 , text);
        st.setString( 2 , str);
        st.setInt( 3 ,  10000 );
        st.setInt( 4 , i);
        st.setFloat( 5 , i* 1 .0f);
        st.setFloat( 6 , i* 1 .0f);
        st.setString( 7 , str);
        st.setString( 8 , str);
        st.setInt( 9 ,  10000 );
        st.setInt( 10 , i);
        st.setString( 11 , str);
        st.setString( 12 , text);
        st.execute();
      }
    }catch(SQLException e){
      System.out.println(e.toString());
    }catch(ClassNotFoundException e){

    }
...

как видим операция выполняется с помощью так называемого биндинга (PrepareStatement)

и результаты (все последовательно добавляется в одну таблицу)
10 000 - 34 сек
100 000 - 322 сек
500 000 - 1473 сек
1000 000 - 3233 сек
потом опять
10 000 - 33 сек
100 000 - 312 сек
500 000 - 1522 сек

замерял наручным секундомером ( вот я лох надо было в проге считать ) но думаю картина бы не изменилась ...
что же мы увидели ... линейную зависимость при вставке данных те не важно 100, 1000, 10 000 или 1000 000 вставляем зависимость линейная (хотя опять повторьсь постгрес 8.0)

Вопрос тогда людям у которых проблемы на чем клиент к базе писан и каким образом идет INSERT??? как у меня биндинг или просто стрингами???
Кстати недавно читал в какойто книжке чтото типа:
Хотите поставить на колени ЛЮБУЮ базу??? НЕ используйте биндинг!

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

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

ну и что что много зачем сессию то менять?
открыл коннект к базе а потом с ним работай хоть из 100 источников пиши!

если делать как вы написали (да еще стринги (INSERT) в базу лить) то никаких ресурсов на 1000000 строк не хватит!!! (если хотите чтото напечатать в ворде из 10 разных книжек тоже 10 раз будете его закрывать и открывать???)

биндинг насколько я знаю есть точно в перле, на сях и в яве. пхп, питон и чего нить еще смотреть надо (с другими не работал).
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33019869
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про биндинг надо у програмера спросить :)
А если источники разные то как на них открыть одну сессию.
Или это тоже к программеру..
Тут еще вопрос надежности, одна сессия может, в следствии потери связи, оборваться. и что тогда?
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33019873
Алексей Ключников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишем на сях через библиотечку pglib.so кажется так завется.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33019880
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КлючниковА если источники разные то как на них открыть одну сессию.


открыть соединение с БД (1 сессия)
первый источник (данные)
запись
второй источник (данные)
запись
и тд
закрыть соединение с БД

ну я так себе представляю это. Те БД пополам откуда ты в нее пишеш лишь бы все правильно с ее точки зрения было (порядок там типы всякие)


Тут еще вопрос надежности, одна сессия может, в следствии потери связи, оборваться. и что тогда?

если потеряли связь с БД то у тебя все сессии отвалятся
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33019982
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А commit делать не пробовали? Например каждую 2000-ю запись? Иногда помагает. Иначе Вы в процессе вставки просто немеряно раздуваете сегмент отката (или что там у PG). Естессна ему нехорошо.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33019992
vfabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вообще надо читать про библиотеки как они там с commit работают мож если не указанно явно то они его автоматом лепят
а вообще если BEGIN TRANSACTION нет то по идее и commit не нужен
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33019997
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vfabrвообще надо читать про библиотеки как они там с commit работают мож если не указанно явно то они его автоматом лепят
а вообще если BEGIN TRANSACTION нет то по идее и commit не нужен
Как это не нужен? Щас прийдут FB-шники и станут размахивать серпами. Я не местный, поэтому не знаю насколько кретична для PG длинная транзакция со вставками, но абсолютно уверен в том, что ему будет существенно легче если Вы будете подтверждать вставки пачками. На www.ibase.ru есть очень хорошая статья на эту тему.

ЗЫ: насколько я понимаю, подтверждение каждой записи тоже может быть чревато.
...
Рейтинг: 0 / 0
Ускорить работу INSERT (faq читан)
    #33020053
v fabr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
документация PGIn PostgreSQL, a transaction is set up by surrounding the SQL commands of the transaction with BEGIN and COMMIT commands. So our banking transaction would actually look like

Код: plaintext
1.
2.
3.
4.
BEGIN;
UPDATE accounts SET balance = balance -  100 . 00 
    WHERE name = 'Alice';
-- etc etc
COMMIT;
If, partway through the transaction, we decide we do not want to commit (perhaps we just noticed that Alice's balance went negative), we can issue the command ROLLBACK instead of COMMIT, and all our updates so far will be canceled.

PostgreSQL actually treats every SQL statement as being executed within a transaction. If you do not issue a BEGIN command, then each individual statement has an implicit BEGIN and (if successful) COMMIT wrapped around it. A group of statements surrounded by BEGIN and COMMIT is sometimes called a transaction block.
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 1 из 3
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Ускорить работу INSERT (faq читан)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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