|
Модераторы: LSD, AntonSaburov |
|
cube |
|
|||
Опытный Профиль Группа: Участник Сообщений: 291 Регистрация: 11.4.2007 Репутация: 2 Всего: 3 |
Вставляю в таблицу базы данных Оракл большое количество строк, процесс занимает не много времени. Текстовый файл csv размером 400 мб, и 800 000 записей, загружается в бд, за 3 минуты.
Но хотелось бы еще быстрее. Код выполняется на серверной jre, на сервере с огромным числом процессоров и оперативной памяти, бд тоже крутится на этом же сервере. Таблица индексов, ключей не имеет. Перед загрузкой данных происходит очищение всей таблицы. К сожалению весь код привести не могу, но для понимания, процессы разделил на потоки. Один поток читает файл использует ArrayBlockingQueue (10000, false). 2 других производят вставку в таблицу. Каждый процесс коннекшен берет из пула, использует PreparedStatement и batch. Для чистоты эксперимента (чтобы понять какой процесс происходит дольше остальных), заменил метод put() на add() и увеличил размер очереди до 100 000, не проходит и 15 секунд как очередь переполняется и вываливается эксепшен. Добавил еще 10 потоков для вставки в бд, всеравно вываливается эксепшен о переполнении очереди, заменил обратно add() на put() замерил время, с 10 потоками на вставку ушло еще на 2 минуты больше. Я понимаю что в этот системе узкое место вставка, но как ускорить ее? Свойства таблицы менять NOLOGGING задаю, никаких измененений в скорости не наблюдаю.
Это сообщение отредактировал(а) cube - 17.4.2015, 14:58 |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Скорее всего тут узкое место не Java а Oracle. На стороне Java достаточно батчинга. Запусти один поток и посмотри нагрузку CPU, если нагрузка на ядро со стороны Java не превышает 50%, то больше потоков не нужно. Если превышает, то можно попробовать добавить.
Со стороны Oracle надо смотреть, что у него там тупит, но скорее всего это IO. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
cube |
|
|||
Опытный Профиль Группа: Участник Сообщений: 291 Регистрация: 11.4.2007 Репутация: 2 Всего: 3 |
да там загрузка 3,7% это смешно. IO имеете ввиду что? Вообще это база данных, к тому же очень шустрая.
|
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Запись на диск. Иди к DBA пусть смотрит, что там тупит. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
AntonSaburov |
|
|||
Штурман Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
1. Надо проверить как очищается таблица - если прямолинейно delete from table - то это может быть проблемой при большом числе записей.
2. Остальное LSD уже посоветовал - я тоже склоняюсь к тому, что здесь узкое место именно сам Оракл. |
|||
|
||||
cube |
|
|||
Опытный Профиль Группа: Участник Сообщений: 291 Регистрация: 11.4.2007 Репутация: 2 Всего: 3 |
таблица перед загрузкой очищается sql запросом TRUNCATE TABLE, это достаточно быстрая процедура. Тем более что без commit'a.
есть идеи создавать временные таблицы, закидать быстренько туда, а уже потом процедурой на сервере зааппендить к реальной, как думаете в целом ускорит процесс? Возможности потерять данные велики? |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
Что значит "зааппендить"? Ты же truncate делаешь, она должна быть пустая. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
cube |
|
|||
Опытный Профиль Группа: Участник Сообщений: 291 Регистрация: 11.4.2007 Репутация: 2 Всего: 3 |
имел ввиду hint /*+ APPEND */
сорри в pl/sql не силен |
|||
|
||||
LSD |
|
|||
Leprechaun Software Developer Профиль Группа: Модератор Сообщений: 15709 Регистрация: 24.3.2004 Репутация: 209 Всего: 537 |
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |