|
|
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Добрый день! Возникла необходимость загрузки четко структурированного файла большого объема в таблицу. Так как использую компоненты ODAC, то грех не воспользоваться уже готовым компонентом. Только вот по примерам в демках не могу понять, каким именно образом в лоадер пищутся данные из файла. Вроде и не дремучий я, но все же... Небольшой кусок кода в качестве примера, как грузить данные из файла. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 16:56 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, Для Loader: 1. Указать таблицу, правой кнопкой мыши на компонете выбрать Create Columns. 2. Определить GetColumnData или OnPutData. GetColumnData будет вызываться для каждой колонки от первой строки до тех пор пока не вернешь EOF := True Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. в OnPutData делаешь всю работу сам Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2019, 17:36 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Dmitri Krizhanovski, это я видел, меня интересует как с файлом работать. Или же открывать его в потоке и заливать построчно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 09:05 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Например... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 09:11 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpubЛеонов Юрий, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Например... ну это понятно. Но у меня файлы большие... В теории могут быть по нескольку миллионов записей. А задача стоит ускорить заливку данных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 11:33 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
просто позанудствую: номер строки начинать с 1, а не с нуля, как в примере выше. procedure PutColumnData (by ColumnIndex) procedure PutColumnData (by ColumnName) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 11:50 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, Так она и ускорится, но без индексов и констрэйнов... Естественно для TOraLoader надо создать отдельный Session с ASyncMode'ом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:09 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Кроик Семёнпросто позанудствую: номер строки начинать с 1, а не с нуля, как в примере выше. procedure PutColumnData (by ColumnIndex) procedure PutColumnData (by ColumnName) Эт да, подзабыл-скопипастил :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:10 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Гугли bulk load/bulk insert. Не факт, что это вообще на Делфи стоит делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:30 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Я это делал через TOraLoader во времянку, а потом процедура на серваке, которая раскидывала данные по местам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:36 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрийну это понятно. Но у меня файлы большие... В теории могут быть по нескольку миллионов записей. А задача стоит ускорить заливку данных... Memory-Mapped Files и анализировать вручную?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:42 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
alekcvp, А чем помогут MemoryMapped files? Читать по одной записи и передавать компоненту... с кэшированием винда сама разбёрется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:46 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Или задача залить не все записи из файла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:47 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Человек не в состоянии разобраться как использовать готовый компонент, а вы предлагаете ему MMF и Direct Path... Оптимисты. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 12:55 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpubИли задача залить не все записи из файла? В идеале файлов будет штук 15 разных. У каждого своя структура, есть общие поля. Но итоговая таблица общая (44 колонки), есть зависимость, какие данные куда надо ложить. Но записи должны залиться все, пропуски не запланированы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 14:25 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЧеловек не в состоянии разобраться как использовать готовый компонент, а вы предлагаете ему MMF и Direct Path... Оптимисты. Ну это же хорошо, что вы в этом разобрались. Или все должны родиться со знаниями возможностей компонент ODAC? До сегодняшнего дня мне этот компонент не был нужен. Вот теперь разбираюсь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 14:28 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Вопрос еще такой, для самоуспокоения: если надо, чтобы загрузка проходила частями частями, то в цикле вызывать метод Load? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 14:37 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийzinpubИли задача залить не все записи из файла? В идеале файлов будет штук 15 разных. У каждого своя структура, есть общие поля. Но итоговая таблица общая (44 колонки), есть зависимость, какие данные куда надо ложить. Но записи должны залиться все, пропуски не запланированы Тогда 15 -> OraLoader'ов, 15 -> Session'ов к ним качают во временные таблицы, асинхронно. После запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 14:43 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийВопрос еще такой, для самоуспокоения: если надо, чтобы загрузка проходила частями частями, то в цикле вызывать метод Load? Load вызывается один раз, а конец итерации определяете в OnPutData ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 14:44 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpubТогда 15 -> OraLoader'ов, 15 -> Session'ов к ним качают во временные таблицы, асинхронно. После запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу. Не пойму зачем асинхронность, если и столько лоадеров. Есть механизм распознавания, куда и что писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 14:46 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpubПосле запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу. Осталось только придумать способ получить доступ к данным во временной таблице другой сессии. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 15:02 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийzinpubТогда 15 -> OraLoader'ов, 15 -> Session'ов к ним качают во временные таблицы, асинхронно. После запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу. Не пойму зачем асинхронность, если и столько лоадеров. Есть механизм распознавания, куда и что писать. Если данные(необходимые для загрузки) одинаковые во всех файлах, то количество потоков вещь подбираемая, в зависимости от сервера и того откуда берутся файлы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 15:02 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovzinpubПосле запускается процедура на сервере, которая агрегирует всё это счастье в итогувую таблицу. Осталось только придумать способ получить доступ к данным во временной таблице другой сессии. Я имел в виду ЛОГИЧЕСКИ временные таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 15:03 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
В смысле обычные таблицы, которые мы используем, как буферные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 15:04 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, По хорошему все должны рождаться с желанием и возможностями развиваться и учиться. Может, рано ещё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 15:08 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
GatorЛеонов Юрий, По хорошему все должны рождаться с желанием и возможностями развиваться и учиться. Может, рано ещё? А я вопрос здесь и задал для того, чтобы понять возможности и принцип работы компоненты. В официальном мануале практически ничего не сказано, кроме того что нужно определить одно из событий и вызвать метод Load. И пойми как оно работает... Как коммиты ставятся и ставятся ли вообще. В нете раскопал старый код Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Здесь один раз дергается одно из событий. Что человек, который только начал знакомиться с компонентом, должен понять ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 15:55 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, Это кривой код... Комитов при bulk load ,как таковых нету - это совсем другой механизм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:12 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, ну ты данные то "запутил" в БД? Обработчики событий (on...) написаны? что пишут? Контролируешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:12 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpub, другого кода у меня нету. Я не понимаю принципа. Вот в самом первом вашем посте был пример события onGetColumnData. Если данных 10 тысяч строк, сколько раз выполнится это событие и почему? Можете растолковать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:29 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрийzinpub, другого кода у меня нету. Я не понимаю принципа. Вот в самом первом вашем посте был пример события onGetColumnData. Если данных 10 тысяч строк, сколько раз выполнится это событие и почему? Можете растолковать? onGetColumnData - выполняется до тех пор пока вы не определите Eof = True ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:38 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов Юрий, при чем тут число строк? https://www.devart.com/unidac/docs/devart.dac.tdaloader.ongetcolumndata.htm Write the OnGetColumnData event handler to put column values. TDALoader calls the OnGetColumnData event handler for each column in the loop. Column points to a TDAColumn object that corresponds to the current loading column. Use its Name or Index property to identify what column is loading. The Row parameter indicates the current loading record. TDALoader increments the Row parameter when all the columns of the current record are loaded. The first row is 1. Set EOF to True to stop data loading. Fill the Value parameter by column values. To start loading call the Load method. Another way to load data is using the OnPutData event. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:38 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Мне было удобнее с PutData... То есть логика такова: Ты сам берёшь данные - откуда хочешь... из строки, стрима, файла, хоть рэндомом их генеришь Передаешь компоненту Он кладёт их в базу Как только тебе надоело выходишь из процедуры... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:40 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpubМне было удобнее с PutData... То есть логика такова: Ты сам берёшь данные - откуда хочешь... из строки, стрима, файла, хоть рэндомом их генеришь Передаешь компоненту Он кладёт их в базу Как только тебе надоело выходишь из процедуры... То есть командой Код: pascal 1. мы забиваем данные, а потом Load их пуляет по назначению? И после я сам вызываю коммит? Я правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:50 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
При установке ODAC по умолчанию устанавливаются и несколько демо проектов. Если вы откроете папку с Demo, то увидете там демо с названием OdacDemo. В этом демо есть и пример по работе с TOraLoader через GetColumnData и через PutData (исходники для демо по работе с TOraLoader находятся тут: OdacDemo\Loader\Loader.pas). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:50 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Да сорри за опечатку, я имел ввиду PutData ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:51 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
devartПри установке ODAC по умолчанию устанавливаются и несколько демо проектов. Если вы откроете папку с Demo, то увидете там демо с названием OdacDemo. В этом демо есть и пример по работе с TOraLoader через GetColumnData и через PutData (исходники для демо по работе с TOraLoader находятся тут: OdacDemo\Loader\Loader.pas). Да, я видел демку. По крайней мере смотрел код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:57 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийzinpubМне было удобнее с PutData... То есть логика такова: Ты сам берёшь данные - откуда хочешь... из строки, стрима, файла, хоть рэндомом их генеришь Передаешь компоненту Он кладёт их в базу Как только тебе надоело выходишь из процедуры... То есть командой Код: pascal 1. мы забиваем данные, а потом Load их пуляет по назначению? И после я сам вызываю коммит? Я правильно понял? Load и вызовет OnPutData... Пуляет данные PutColumnData.... Коммит "не нужен"(с) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:57 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
zinpubLoad и вызовет OnPutData... Пуляет данные PutColumnData.... Коммит "не нужен"(с) Спасибо огромное за разъяснения! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 16:59 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Оказывается рано обрадовался... При вызове Load бьет ошибку "Direct path loading is not supported in Direct mode" Основное требование заказчика при подключении к БД - никаких клиентов, только Direct... Обойти как-то можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 17:10 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Например промежуточный слой на сервере. Да хоть бы веб-сервер. Получает файл/ы, распарсивает и заливает в базу. Уж на сервере то оракл-клиент скорее всего установлен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 19:24 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийОказывается рано обрадовался... При вызове Load бьет ошибку "Direct path loading is not supported in Direct mode" Основное требование заказчика при подключении к БД - никаких клиентов, только Direct... Обойти как-то можно? Нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 20:09 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
BulkLoad можно выполнить со стороны Pl/Sql из блоба или файла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 20:11 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийОказывается рано обрадовался... При вызове Load бьет ошибку "Direct path loading is not supported in Direct mode" Основное требование заказчика при подключении к БД - никаких клиентов, только Direct... Обойти как-то можно? Можно выбрать режим lmDML : https://www.devart.com/odac/docs/devart.odac.tloadmode.htm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2019, 20:50 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
devartМожно выбрать режим lmDML а есть разница между imDML и серией INSERT'ов через dataset или query? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2019, 01:46 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Кроик СемёнdevartМожно выбрать режим lmDML а есть разница между imDML и серией INSERT'ов через dataset или query? В режиме lmDML используется вставка с помощью обычного INSERT, только параметры передаются как DML array (подробнее про DML arrays можно прочитать тут https://www.devart.com/odac/docs/work_dml.htm ). Режим lmDML у TOraLoader сделан для тех случаев, когда у кого-то реализована загрузка данных через TOraLoader, но в один прекрасный момент возникает необходимость работать в Direct режиме, в котором загрузка данных в режиме lmDirect не поддерживается. В этом случае достаточно переключить режим с lmDirect на lmDML и ничего не надо переписывать в своем приложении. Скорость загрузки данных в режиме lmDirect немного выше, чем в lmDML режиме, но разница в скорости столько мизерная, что можно ей можно принебречь и считать эти два режма полностью взаимозаменяемыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2019, 09:22 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
devartВ режиме lmDML используется вставка с помощью обычного INSERT, только параметры передаются как DML array. Если я правильно понял, то в Код: pascal 1. Value будет представлен как VarArray? Или же как в примере делаем через OraSQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2019, 15:04 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийЕсли я правильно понял, то в Код: pascal 1. Value будет представлен как VarArray? Или же как в примере делаем через OraSQL? Нет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2019, 15:26 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
devartНет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер. Тогда тоска... Миллион записей 10 минут гонял. За это же время SQLLoader загнал 20 лямов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2019, 15:43 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийЗа это же время SQLLoader загнал 20 лямов Так надо же сравнивать в равных условиях. Снеси с машины клиент Oracle (в соответствии с требованиями доступа без его установки) и посмотри как SQLoader выкрутится. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2019, 18:18 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЛеонов ЮрийЗа это же время SQLLoader загнал 20 лямов Так надо же сравнивать в равных условиях. Снеси с машины клиент Oracle (в соответствии с требованиями доступа без его установки) и посмотри как SQLoader выкрутится. Так это без клиента и было сделано... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2019, 15:09 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийdevartНет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер. Тогда тоска... Миллион записей 10 минут гонял. За это же время SQLLoader загнал 20 лямов Дык, режь данные на куски в виде файлов и запускай с ними SQLLoader-ы в отдельных потоках. Проведенные эксперименты показали, что быстрее все равно ничего не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2019, 15:54 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
Леонов ЮрийdevartНет, данные в PutColumnData вы заполняете одинаково в обоих режимах. В режиме lmDML компонент TOraLoader сам преобразует их в DML Array и в виде массива отправит на сервер. Тогда тоска... Миллион записей 10 минут гонял. За это же время SQLLoader загнал 20 лямов Мы исследовали описанное вами поведение. Такая разница в скорости вставки обусловленна тем, что в режиме lmDML вставка производится блоками по 100 записей. К сожалению опции, которая повлияла бы на данное поведение в настоящий момент нет. Поэтому для ускорения вставки мы можем вам порекомендовать два решенеия: Первое, если у вас ODAC с исходным кодом, то вы можете отрыть файл OraClasses.pas и найти там строчку (в методе TOCILoader.Prepare): Код: pascal 1. и попробовать заменить значение 100 на значение 1000 или на 10000. скорость вставки должна значительно увеличится. Второй способ - это самостоятельно реализовать вставку через DML arrays, как описано здесь https://www.devart.com/odac/docs/batchops.htm В этом случае также необходимо подобрать оптимальное значение для количества строк вставляемых за раз. При самостоятельной реализации вставки через DML array следует избегать использования метода ParamByName() и обращаться к параметрам по индексу, иначе вызов метода ParamByName() миллион раз для каждого араметра может очень сильно снизить производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2019, 17:13 |
|
||
|
TOraLoader
|
|||
|---|---|---|---|
|
#18+
devartМы исследовали описанное вами поведение. Такая разница в скорости вставки обусловлена тем, что в режиме lmDML вставка производится блоками по 100 записей. К сожалению опции, которая повлияла бы на данное поведение в настоящий момент нет. Поэтому для ускорения вставки мы можем вам порекомендовать два решения: Первое, если у вас ODAC с исходным кодом, то вы можете отрыть файл OraClasses.pas и найти там строчку (в методе TOCILoader.Prepare): Код: pascal 1. и попробовать заменить значение 100 на значение 1000 или на 10000. скорость вставки должна значительно увеличится. Второй способ - это самостоятельно реализовать вставку через DML arrays, как описано здесь https://www.devart.com/odac/docs/batchops.htm В этом случае также необходимо подобрать оптимальное значение для количества строк вставляемых за раз. При самостоятельной реализации вставки через DML array следует избегать использования метода ParamByName() и обращаться к параметрам по индексу, иначе вызов метода ParamByName() миллион раз для каждого араметра может очень сильно снизить производительность. Попробовал оба варианта. Немного причесал код (были проблемы со значениями, может поэтому грузило очень долго). Теперь миллионник залетает за 2 минуты)) Это через TOraLoader. Практически тот же код, но через TOraSQL и DML Array зашел за 4 минуты. Блоки по 65000 записей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 17:48 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2039211]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
189ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
106ms |
get tp. blocked users: |
2ms |
| others: | 247ms |
| total: | 594ms |

| 0 / 0 |
