Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
17.10.2006, 16:54
|
|||
|---|---|---|---|
|
|||
Вставка в большие таблицы |
|||
|
#18+
Решая задачу хранения потока неких сообщений сталкнулся с несколько неожиданным поведением PostgreSQL. Итак, обо всем по порядку. Есть обычная таблица с первичным ключем, состоящим из двух полей (timestamp, bigint). Добавление новых строк выполняю командой "COPY FROM <file>" пакетами по 1000 строк. Пока таблица небольшая (примерно 200000 строк) все идет хорошо - скорость записи хорошая и кажется стабильной. Однако, постепенно скорость записи падает, и к 1 млн. становиться раза в 2 меньше той, которая была вначале. Чувствуется, что все упирается в винт. Осознаю следующие моменты: 1. Формируемые тестовым приложением значения ключевых полей гарантированно возрастают, т.е. совпадают с порядком их следования в индексе, поэтому расщепления страниц индекса происходить не должно (перед началом эксперимента таблица пустая); 2. Периодический запуск autovacuum проявляется в наблюдаемом временном провале в скорости, но временном - т.е. только на период работы autovacuum; Интересно то, что существуют еще один класс "провалов", который длится всего 2-3 секунды, зато шибко крут по своим тормозам (падение скорости раз в 5-10). Он присуствует стабильно, даже если отключить autovacuum и сбор статистики вообще. Появляется где-то каждые 70000 записей. Может у кого-нить есть соображения о причинах такого поведения Postgres? ( PostgreSQL 8.1.4 и старше ) Заранее, Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.10.2006, 18:52
|
|||
|---|---|---|---|
|
|||
Вставка в большие таблицы |
|||
|
#18+
Интересно, а если попробывать сделать таблицу без ключей и индексов, и провести ваши тесты, что будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.10.2006, 19:02
|
|||
|---|---|---|---|
Вставка в большие таблицы |
|||
|
#18+
Я думаю, что ключевое слово - checkpoint ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.10.2006, 08:06
|
|||
|---|---|---|---|
|
|||
Вставка в большие таблицы |
|||
|
#18+
ilejnЯ думаю, что ключевое слово - checkpoint Кстати, да. Чему равен checkpoint_segments в postgresql.conf? У меня, например, 8, и загрузка 500-600 тыс. записей объёмом 40-50 мегабайт, выполняемая в одной транзакции, занимает не более 30 сек. Пробовал загружать намного больше (уже в нескольких транзакциях, конечно) - заметного падения производительности не наблюдал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
19.10.2006, 16:03
|
|||
|---|---|---|---|
|
|||
Вставка в большие таблицы |
|||
|
#18+
Выполнил еще раз тщательное тестирование. При этом исследовал как изменяется среднее значение скорости записи на всем протяжении работы тестового приложения, т.е. вплоть до заполнения таблицы 10 млн-ами строк. Выполнил 5 прогонов: 1. Отключено все: индексы, сбор статистики, autovacuum; 2. Отключены только индексы; 3. Отключен autovacumm и сбор статистики; 4. Включен autovacuum, но отключен сбор статистики; 5. Все включено. Вывод, который я для сделал, анализируя полученные результаты: все дело в autovacuum, именно его периодический запуск (1 раз/мин) "подсаживает" скорость. Самое интересное, что отключение сбора статистики (stats_start_collector=off) на скорость абсолютно не повлияло. Хотя мне это кажется странным - чем-же тогда так усердно занимается autovacuum? checkpoint_segments = 3, т.е. по умолчанию. Просветите, плз, каким образом может помочь увеличение checkpoint_segments, если транзакции гарантировано небольшие: 1000 строк, каждая строка ~300 байт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
20.10.2006, 08:27
|
|||
|---|---|---|---|
|
|||
Вставка в большие таблицы |
|||
|
#18+
zsmcheckpoint_segments = 3, т.е. по умолчанию. Просветите, плз, каким образом может помочь увеличение checkpoint_segments, если транзакции гарантировано небольшие: 1000 строк, каждая строка ~300 байт? checkpoint не выполняется после каждой транзакции. Так что размер отдельной транзакции не имеет значения - важно количество вносимых изменений. Впрочем, Вы уже выяснили, что checkpoint здесь не при чём. Я так думаю, что если autovacuum мешает, то может его отключить, а vacuum делать по крону в период наименьшей нагрузки на базу? Если, конечно, такой период существует... Можно ещё поменять utovacuum_naptime, чтобы autovacuum выполнялся реже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&tablet=1&tid=2006026]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 417ms |

| 0 / 0 |
