Посоветуйте как ускорить загрузку в базу из плоского файла!

Lisiansky

   Люди, кто знает, как можно существенно повысить импорт в данных в оракловые таблицы из плоского файла (от 4 Гбайт и более)? Опробованный мной софт, найденный гуглом, существенного прироста скорости не дал (OraLoader, Visual Importer другой софт хочет лицензию. Можно ли как то решить проблему?

yroslavasako

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

Lisiansky

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

yroslavasako

насколько я понял тенденции корпоративного сектора, искать софт нужно не от стороннего разработчика, а от того же оракла. Общая практика продавать сравнительно дёшево базу и брать большие деньги за надстройки, конфигураторы, сопряжённые проги и прочее окружение и поддержку. Ведь самим авторам проприетарного софта сделать это намного проще.

katrin2201

Формат файла фиксирован, или произвольный?

Andbar

"тяжелые" вычисления типа извлечения числа из текста
Текст в картинке? :grin:

Vantucha

OraLoader
это ты родной Oracle Loader имеешь ввиду?
какого рода данные в файле?

Lisiansky

 
Формат файла фиксирован, или произвольный?

формат- delimited, данные- числа, текст, дата в каждой записи. Общий случай. Текущая скорость закачки в 500 записей в секунду никуда не годится (объемы исчисляются десятками миллионов записей).

kruzer25

формат- delimited, данные- числа, текст, дата в каждой записи.
Ну так напиши на коленке соответствующую утилиту разбора. Думаю, тут что угодно (перл/питон/c#/ява) даст скорость, несравнимую с 500 строками в секунду.

Lisiansky

дело в том, что таблиц много а не одна, они разные, писать для каждой свою прогу не эффективно т. к. задача разовая :confused: Тем более я не уверен, что это даст сильный выигрыш в скорости т. к. ни о каком распараллеливании тут и речи идти не может (ибо не силен я в таком программировании).

okis

Ты пробовал стандартный load data infile? А что, если разбить твой большой файл на мелкие (по несколько десятков МБ) и попробовать так их поочерёдно залить?
Апд. А, так вот какая у тебя задача ... А если скриптом делать замену во входном файле?

kruzer25

писать для каждой свою прогу не эффективно т. к. задача разовая
Сколько у тебя там эти данные загружаются?
Для написания такой наколенной поделки полчаса - завышенная оценка.

Dasar

Для написания такой наколенной поделки полчаса - завышенная оценка.
с загрузкой данных в базу, основная проблема не в разборе данных, а именно в тормозах в самой базе при загрузке.
поэтому наколенная поделка скорее всего будет резко медленнее, если будет вставлять обычными инсертами.
везде как раз, наоборот, пишут, что если хотите из программы вставить большой объем данных, то выгрузите его в файл, и утилитой закиньте его в базу.
ps
вот идея с разбиением на мелкие файлы мне кажется разумной, т.к. сейчас получается, что база пытается все эти 4гб удержать как откатываемую транзакцию, а так у нее будут маленькие транзакции.

kruzer25

если будет вставлять обычными инсертами
Оракл не поддерживает большие инсерты?
везде как раз, наоборот, пишут, что если хотите из программы вставить большой объем данных, то выгрузите его в файл, и утилитой закиньте его в базу.
Ну так я понял, они тут какими-то левыми приблудами для этого пользуются (фактически, теми же наколенными поделками, но написанными хз кем и хз как). А можно своей наколенной поделкой перегнать это в специальный формат (одной строчкой на перле/powershell а потом без всяких левых примочек сделать COPY или что там в оракле есть.

Dasar

Оракл не поддерживает большие инсерты?
что такое большие инсерты?
массовую загрузки поддерживает, например, array binding, но это уже будет не наколенная поделка
А можно своей наколенной поделкой перегнать это в специальный формат (одной строчкой на перле/powershell а потом без всяких левых примочек сделать COPY или что там в оракле есть.
так они фактически сразу этот COPY и делают, и именно этот COPY тормозит. в целом понятно почему... потому что Oracle все эти 4гб пытается от версионить.

kruzer25

что такое большие инсерты?
INSERT INTO ... (..., ...) values(..., ... values(..., ... values(..., ...)
как-то так, кажется.

Vantucha

500 записей в секунду медленно очень
если в файле у всех строк один и тот же формат, юзай oracle external tables или SQL LOADER(одна херня)
даже на моей дохлой вмварине без распараллеливания поллимона записей (12 мегов) импортится за 3 секунды
я не особо в этих темах спец, но, вроде, это самым быстрым способом импорта из файлов считается

klyv

так они фактически сразу этот COPY и делают, и именно этот COPY тормозит. в целом понятно почему... потому что Oracle все эти 4гб пытается от версионить.
думаю, как раз эти массовые операции не подвержены транзакциям. ибо затем они и делались.

sinet

В нормальном слое надо было написать.
Искомая утилита называется SQL*Loader поставляется вместе с самой базой или клиентом оракла.
sqlldr parallel=true direct=true ...
Оно загрузит данные прямо в блоки датафайлов да еще и распараллелит этот процесс.
Быстрее в принципе нельзя.
Только после такой операции эту табличку желательно сразу забекапить. :)

pitrik2

INSERT INTO ... (..., ...) values(..., ... values(..., ... values(..., ...)
так нельзя
можно вот так:

INSERT INTO ... (..., ...)
select (..., ...) from dual
union all
select (..., ...) from dual
union all
select (..., ...) from dual

kruzer25

Уг какое-то.

VoodooXP

проблема похоже не там, где вы ищете :)
вы отключаете все констрейнты и индексы при загрузке?

Lisiansky

все, всем спасибо, проблему решил! SQLLoader-это вешь! Скорость реально возросла в несколько сотен раз (!). Что помогло - откулючил констрейнты, снес индексы с таблиц, помогли опции multithreading и direct. Parallel почему-то не заработал. Единственное неудобство- приходится управляющий файл ручками создавать, хотя наверняка есть и софт для этого. Привык за день и теперь все круто!
Оставить комментарий
Имя или ник:
Комментарий: