LINUX.ORG.RU

[java][postgresql] Помогите советом по оптимизации

 ,


0

0

Помогите начинающему кодеру на этой связке. Вопроса 3:

1 - Надо как можно быстрее и "качественнее" добавить в базу много данных. Порядка 100-200млн. строк. По сравнению с обычным MySQL и MyISAM таблицей пишется просто в 10 раз медленее. Думаю что я делаю что-то не то. ну и что надо сделать после записи для того, чтобы потом данные быстро доставались? Предвижу что просто инсерт тут не рулит?

2 - Как лучше всего сравнить две такие таблицы, идентичные по стрктуре, и образно говоря вычесть из одной другую?

3 - для чего нужны транзакции впринципе понимаю. Мне они ни к чему впринципе для моей задачи, но есть ли профит в скорости от использования транзакций например при совершении 100 раз UPDATE например.

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

На период загрузки дропать или дизаблить индексы и констрейнты.

Использовать загрузку из файла, а не insert, как в mysql load data infile

ef37 ★★
()

Если много записей добавляется только раз - то лучше отключить индексы на таблице (перестроить их после загрузки данных на порядок быстрее). Так же в постгре есть метод для добавления множества записей без оверхеда INSERT-а, она, iirc, называется COPY. Также можно изменить параметр автозаписи на диск транзакций (в доке по постгре есть пример)

И ещё - постгря очень сильно нуждается в доработке напильником конфигов.

Транзакции нужны=) Если не нужны ни транзакции ни хранимые процедуры - то используй мускуль.

ЗЫ. с постгрей никогда не работал.

stpg
()
Ответ на: комментарий от ef37

> На период загрузки дропать или дизаблить индексы и констрейнты.

опередил;)

stpg
()
Ответ на: комментарий от stpg

>Если не нужны ни транзакции ни хранимые процедуры - то используй мускуль.

Вот тут можно поподробнее? Задача то простая. Один раз залить таблицу в виде id,value,status данных порядка 100-200млн.

потом их пачками доставать и апдетить status. Pgsql не будет "ускорять" эту задачу, по сравнению с mysql?

Borman3000
() автор топика
Ответ на: комментарий от Borman3000

И если не сложно - давайте плиз ваши советы немного уточняя, что ли=)) а то первый совет я так нагуглить и немогу=))))

Borman3000
() автор топика
Ответ на: комментарий от ef37

Из файлика, построчно.

Вообще как видите задача достаточно типовая примитивная - но "энергоемкая", может есть какие альтернативные технологии?

Borman3000
() автор топика
Ответ на: комментарий от Borman3000

>Из файлика, построчно. Просто возможны бы были варианты, если данные из другой базы. Хороший такой файлик на 100 миллионов записей :-)

А дляя чего данные затачкивать в базу ? Какие операции гонять потом на этом наборе ?

Можно еще посмотреть в сторону Berkeley DB, например.

ef37 ★★
()
Ответ на: комментарий от ef37

Ну какие операции - многопоточная программа будет массово проверять эти данные и потом ставить соответствующий статус, после проверки. Т.е. задача сводится в залить данные в бд, потом это все дело постоянно читать, апдейтить индексы.

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

Borman3000
() автор топика
Ответ на: комментарий от Borman3000

Кажется что Berkeley DB именно то, что нужно было, и ненадо городить никаких постгресов и мускулей. Сейчас будем тестировать.

Borman3000
() автор топика
Ответ на: комментарий от Borman3000

Посмотри на Berkeley DB. Есть Java API (несложный). Выдерживает большие объемы, кроме того

>все просто раскидывать по файликам, и просто вести индекс-файл, но вот есть задача еще и постоянно иметь сводную статистику ...

эту часть тебе там облегчили.

ef37 ★★
()

Я не в курсе PostgreSQL, но MySQL понимает его формат, что может оказаться удобным для быстрого импорта.

ef37 ★★
()
Ответ на: комментарий от ef37

Это как? Я видел только утилиту, выдающую статистику после полного просмотра БД. А поживее можно?

alexsaa
()

> Предвижу что просто инсерт тут не рулит?

insert штука хорошая при правильном использованиии, но есть такие слова как "журнал", "сегмент отката" и прочие околотранзакционные механизмы. Опять таки, insert insert'у рознь. Если лить данные из жабы, то можно например посмотреть в сторону PreparedStatement и batch job, что может заметно повысить производительность, ну и естественно уменьшить количество транзакций - то есть заливать блоками по 10-20 тысяч записей, с commit'ом после каждого блока.

Ну и, как правильно написали, отключить индексы и констрейнты.

> Может я вообще не в ту сторону смотрю? Может для моей задачи лучше использовать какие другие хранилища?

Oracle с его механизмами разеделения данных (партиционирование). Но это дорого, хотя на больших объемах оно того стоит.

no-dashi ★★★★★
()
Ответ на: комментарий от Borman3000

> Pgsql не будет "ускорять" эту задачу, по сравнению с mysql?

Тут я не могу ничего точно сказать. Но слышал рассказы о том что постгря на порядок быстрее мускуля, если её правильно настроить и использовать. Поэтому и смотрю сейчас в сторону этой БД (хочу попробовать на реальном примере сравнить эти базы). Очень уж привлекательны транзакции и хранимые процедуры. Также слышал, что постгря на порядок лучше работает, чем мускуль, с большим числом конкурентных апдейтов.

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

А в твоём случае действительно лучше использовать хеши (BerkeleyDB к примеру).

stpg
()

а ты сравни скорость инсертов не myisam vs postgres а innodb vs postgres :) . Ну и в постгрес грузи через COPY

true_admin ★★★★★
()
Ответ на: комментарий от stpg

>Очень уж привлекательны транзакции и хранимые процедуры

Вот некоторые повторяют - транзакции, хранимые процедуры... вы какую версию мускулю используете? Ау, народ, редхат 6.2 уже пора обновлять:))

Всё это есть в мускуле уже сто лет.

golodranez ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.