|
|
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Добрый день! Работаю с PostgreSQL в PgAdmin3. Помогите пожалуйста разобраться с двумя вопросами: 1) Как ускорить запись в таблицу из файла? Мне необходимо протестировать свою программу для этого поставлена задача добавить в одну таблицу порядка 1 600 000 произвольных записей. 2) Одно из полей в таблице с которой я работаю имеет тип serial и необходимо делать его инкремент. Так вот вопрос, как прописать команду COPY, чтобы значение в это поле вставлялось само. Так не работает COPY name_tab FROM 'C:/task1/testbd.txt' WITH DELIMITER ',' Относительно первого вопроса, попробовала настроить файл конфигураций, а именно увеличила sharred_buffers до 1024 Mb, разницы не почувствовала (до этого стояло 128Mb). ИНдексов нет, так как таблицы в БД не связаны между собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 10:02 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_rose, Также дополнительно добавила следующие настройки (оперативная память 3 ГБ): maintenance_work_mem = 128MB; checkpoint_completion_target = 0.7 effective_cache_size = 1536MB work_mem = 4MB wal_buffers = 4MB checkpoint_segments = 8 shared_buffers = 512MB max_connections = 500 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 10:23 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_rose, Emily_rose2) Одно из полей в таблице с которой я работаю имеет тип serial и необходимо делать его инкремент. команда COPY позволяет указывать имена полей для обработки COPY name_tab(filed1, filed2, filed3, ...) FROM 'C:/task1/testbd.txt' WITH DELIMITER ','; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 10:25 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_roseДобрый день! Работаю с PostgreSQL в PgAdmin3. интимные подробности можете оставить при себе Emily_roseПомогите пожалуйста разобраться с двумя вопросами: 1) Как ускорить запись в таблицу из файла? Мне необходимо протестировать свою программу для этого поставлена задача добавить в одну таблицу порядка 1 600 000 произвольных записей. снести индексы, триггера, чеки. ускорить дисковую. Emily_rose2) Одно из полей в таблице с которой я работаю имеет тип serial и необходимо делать его инкремент. Так вот вопрос, как прописать команду COPY, чтобы значение в это поле вставлялось само. Так не работает COPY name_tab FROM 'C:/task1/testbd.txt' WITH DELIMITER ',' а RTFM за вас пупкин будет читать http://www.postgresql.org/docs/current/static/sql-copy.html автор Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 10:28 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
qwwq, Спасибо за ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 10:30 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Спасибо огромное за ответы! Действительно указание полей для заполнения решило вопрос. НЕ внимательно документацию прочитала. Единственное, как бы еще ускорить вставку записей =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 10:36 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 11:02 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymous, Да, насколько мне это позволяет мой не оч хороший английский =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 11:17 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_rose, зачем произвольные данные вставлять из файла. не проще ли их нагенерить непосредственно в sql. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 11:30 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_roseСпасибо огромное за ответы! Действительно указание полей для заполнения решило вопрос. НЕ внимательно документацию прочитала. Единственное, как бы еще ускорить вставку записей =) Чтобы ускорять процесс надо понять во что оно упирается. Варианта два 1)в дисковую подсистему (тогда надо или диски побыстрее и побольше и/или сильно поднять checkpoint_segments/checkpoint_timeout) или 2)в процессор (тогда убрать индексы с таблицы внести в нее данные создать индексы или разбить copy на N кусков и заливать в N потоков чтобы много ядер использовать) Для анализа во что упираетесь полезно использовать top и iostat. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2015, 13:53 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, спасибо за ответ. А Вы еще не уточните следующее: поднимая checkpoint_segments насколько нужно поднимать checkpoint_timeout? Какая примерно должна быть соблюдена пропорция? Сейчас стоит 8 и 5 мин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 10:59 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_roseMaxim Boguk, спасибо за ответ. А Вы еще не уточните следующее: поднимая checkpoint_segments насколько нужно поднимать checkpoint_timeout? Какая примерно должна быть соблюдена пропорция? Сейчас стоит 8 и 5 мин. Нуууу.... если не жалко 10 минут потратить в случае если сервер с базой упадет (пока она будет накатываться) то можно и 1024/60min поставить. Вообще идеально так чтобы checkpoints шли раз в час по времени. Исходя из этого настраивать сегменты. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 13:57 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk ок, спсаибо! Единственное, что раз в час, это все же на мой взгляд достаточно редко, можно много информации потерять на мой взгляд. А можете подсказать, как часто необходимо делать бэкапы? ИЛи это вс еиндивидуально и зависит от проекта? Также не подскажите как лучше организовать систему, чтобы по минимуму исключить потерю данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 15:21 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_roseMaxim Boguk ок, спсаибо! Единственное, что раз в час, это все же на мой взгляд достаточно редко, можно много информации потерять на мой взгляд. А можете подсказать, как часто необходимо делать бэкапы? ИЛи это вс еиндивидуально и зависит от проекта? Также не подскажите как лучше организовать систему, чтобы по минимуму исключить потерю данных? >>можно много информации потерять на мой взгляд. А при чем тут checkpoints к потере данных? Данные записаны сразу после commit и дальше пока файловая система не побилась они уже никуда не денутся. >>backups по потребностям проекта делается. >>Также не подскажите как лучше организовать систему, чтобы по минимуму исключить потерю данных? Синхронная реплика + (basebackup+wal archiving) + регулярные pg_dump для архива + естественно не выключать fsync/syncronous_commit. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 15:36 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
checkpoint_segments – указывает количество транзакций, после которых происходит физический сброс данных на диск, при интенсивной записи параметр можно увеличить. На эту настройку стоит обратить внимание, если у Вас происходит немалое количество записей в БД (для высоконагруженных систем это нормальная ситуация). Postgres записывает данные в базу данных порциями (WALL сегменты) — каждая размером в 16Mb. После записи определенного количества таких порций (определяется параметром checkpoint_segments) происходит чекпойнт. Чекпойнт — это набор операций, которые выполняет postgres для гарантии того, что все изменения были записаны в файлы данных ( следовательно при сбое, восстановление происходит по последнему чекпойнту ). Выполнение чекпоинтов каждые 16Мб может быть весьма ресурсоемким, поэтому это значение следует увеличить хотя бы до 10. Для случаев с большим количеством записей, стоит увеличивать это значение в рамках от 32 до 256. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 16:02 |
|
||
|
Вставка большого объема записей в таблицу с помощью COPY
|
|||
|---|---|---|---|
|
#18+
Emily_rosecheckpoint_segments – указывает количество транзакций, после которых происходит физический сброс данных на диск, при интенсивной записи параметр можно увеличить. На эту настройку стоит обратить внимание, если у Вас происходит немалое количество записей в БД (для высоконагруженных систем это нормальная ситуация). Postgres записывает данные в базу данных порциями (WALL сегменты) — каждая размером в 16Mb. После записи определенного количества таких порций (определяется параметром checkpoint_segments) происходит чекпойнт. Чекпойнт — это набор операций, которые выполняет postgres для гарантии того, что все изменения были записаны в файлы данных ( следовательно при сбое, восстановление происходит по последнему чекпойнту ). Выполнение чекпоинтов каждые 16Мб может быть весьма ресурсоемким, поэтому это значение следует увеличить хотя бы до 10. Для случаев с большим количеством записей, стоит увеличивать это значение в рамках от 32 до 256. Не читайте русские переводы. Фраза "следовательно при сбое, восстановление происходит по последнему чекпойнту" значит в данном случае что после сбоя восстановление идет от последнего checkpoint и до самой последней записанной в wal транзакции. Поэтому если wal segments много и все упало оно может восстанавливаться заметное время. Основная задача база (любой нормальной) обеспечить гарантию того при при исправном оборудовании нельзя потерять закомиченную транзакцию как сервер не выключай по питанию. -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 16:41 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39007040&tid=1997882]: |
0ms |
get settings: |
10ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
181ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 541ms |

| 0 / 0 |
