Посоветуйте как ускорить загрузку в базу из плоского файла!
Насколько я помню бесплатный оракл не умеет такие базы держать. Так что вместе с ораклом покупайте и его среду обитания.
это разве от базы зависит? Я думал нужен софт, который распараллелит "тяжелые" вычисления типа извлечения числа из текста, что ускорит читаемость файла и, соответственно, импорт данных. Наверняка есть что-то от сторонних разработчиков...
насколько я понял тенденции корпоративного сектора, искать софт нужно не от стороннего разработчика, а от того же оракла. Общая практика продавать сравнительно дёшево базу и брать большие деньги за надстройки, конфигураторы, сопряжённые проги и прочее окружение и поддержку. Ведь самим авторам проприетарного софта сделать это намного проще.
Формат файла фиксирован, или произвольный?
"тяжелые" вычисления типа извлечения числа из текстаТекст в картинке?
OraLoaderэто ты родной Oracle Loader имеешь ввиду?
какого рода данные в файле?
Формат файла фиксирован, или произвольный?
формат- delimited, данные- числа, текст, дата в каждой записи. Общий случай. Текущая скорость закачки в 500 записей в секунду никуда не годится (объемы исчисляются десятками миллионов записей).
формат- delimited, данные- числа, текст, дата в каждой записи.Ну так напиши на коленке соответствующую утилиту разбора. Думаю, тут что угодно (перл/питон/c#/ява) даст скорость, несравнимую с 500 строками в секунду.
дело в том, что таблиц много а не одна, они разные, писать для каждой свою прогу не эффективно т. к. задача разовая Тем более я не уверен, что это даст сильный выигрыш в скорости т. к. ни о каком распараллеливании тут и речи идти не может (ибо не силен я в таком программировании).
Апд. А, так вот какая у тебя задача ... А если скриптом делать замену во входном файле?
писать для каждой свою прогу не эффективно т. к. задача разоваяСколько у тебя там эти данные загружаются?
Для написания такой наколенной поделки полчаса - завышенная оценка.
Для написания такой наколенной поделки полчаса - завышенная оценка.с загрузкой данных в базу, основная проблема не в разборе данных, а именно в тормозах в самой базе при загрузке.
поэтому наколенная поделка скорее всего будет резко медленнее, если будет вставлять обычными инсертами.
везде как раз, наоборот, пишут, что если хотите из программы вставить большой объем данных, то выгрузите его в файл, и утилитой закиньте его в базу.
ps
вот идея с разбиением на мелкие файлы мне кажется разумной, т.к. сейчас получается, что база пытается все эти 4гб удержать как откатываемую транзакцию, а так у нее будут маленькие транзакции.
если будет вставлять обычными инсертамиОракл не поддерживает большие инсерты?
везде как раз, наоборот, пишут, что если хотите из программы вставить большой объем данных, то выгрузите его в файл, и утилитой закиньте его в базу.Ну так я понял, они тут какими-то левыми приблудами для этого пользуются (фактически, теми же наколенными поделками, но написанными хз кем и хз как). А можно своей наколенной поделкой перегнать это в специальный формат (одной строчкой на перле/powershell а потом без всяких левых примочек сделать COPY или что там в оракле есть.
Оракл не поддерживает большие инсерты?что такое большие инсерты?
массовую загрузки поддерживает, например, array binding, но это уже будет не наколенная поделка
А можно своей наколенной поделкой перегнать это в специальный формат (одной строчкой на перле/powershell а потом без всяких левых примочек сделать COPY или что там в оракле есть.так они фактически сразу этот COPY и делают, и именно этот COPY тормозит. в целом понятно почему... потому что Oracle все эти 4гб пытается от версионить.
что такое большие инсерты?INSERT INTO ... (..., ...) values(..., ... values(..., ... values(..., ...)
как-то так, кажется.
если в файле у всех строк один и тот же формат, юзай oracle external tables или SQL LOADER(одна херня)
даже на моей дохлой вмварине без распараллеливания поллимона записей (12 мегов) импортится за 3 секунды
я не особо в этих темах спец, но, вроде, это самым быстрым способом импорта из файлов считается
так они фактически сразу этот COPY и делают, и именно этот COPY тормозит. в целом понятно почему... потому что Oracle все эти 4гб пытается от версионить.думаю, как раз эти массовые операции не подвержены транзакциям. ибо затем они и делались.
Искомая утилита называется SQL*Loader поставляется вместе с самой базой или клиентом оракла.
sqlldr parallel=true direct=true ...
Оно загрузит данные прямо в блоки датафайлов да еще и распараллелит этот процесс.
Быстрее в принципе нельзя.
Только после такой операции эту табличку желательно сразу забекапить.
INSERT INTO ... (..., ...) values(..., ... values(..., ... values(..., ...)так нельзя
можно вот так:
INSERT INTO ... (..., ...)
select (..., ...) from dual
union all
select (..., ...) from dual
union all
select (..., ...) from dual
Уг какое-то.
вы отключаете все констрейнты и индексы при загрузке?
все, всем спасибо, проблему решил! SQLLoader-это вешь! Скорость реально возросла в несколько сотен раз (!). Что помогло - откулючил констрейнты, снес индексы с таблиц, помогли опции multithreading и direct. Parallel почему-то не заработал. Единственное неудобство- приходится управляющий файл ручками создавать, хотя наверняка есть и софт для этого. Привык за день и теперь все круто!
Оставить комментарий
Lisiansky
Люди, кто знает, как можно существенно повысить импорт в данных в оракловые таблицы из плоского файла (от 4 Гбайт и более)? Опробованный мной софт, найденный гуглом, существенного прироста скорости не дал (OraLoader, Visual Importer другой софт хочет лицензию. Можно ли как то решить проблему?