|
|
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. В связи с производственной необходимостью возникла задача грузить при помощи SQL Loader в Oracle текстовый документ с разделителями, содержащий порядка 5 млн. записей. И в случае, если хотя бы в одной из записей имеется ошибка (длина поля не совпадает с заявленной, недопустимые символы и т.д.), в базу Oracle не попала бы ни одна запись из этого файла. Другими словами если в момент импорта 5 млн. встречается ошибочная запись, должен выполняться ROLLBACK, а если после импорта 5 млн. ошибок не было выявлено, то COMMIT ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2012, 18:20 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
askkas, эта задача решается предварительной очисткой данных, а не движком СУБД. Perl - идеально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2012, 20:28 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
1. Грузи свой файл в BLOB (STORE AS SECUREFILE в Oracle 11g) для уверенности можешь считать MD5 этого файла, считать MD5 BLOBа и сравнивать. Потом из BLOBa растаскивай в нужную таблицу одной транзакцией. Стартовать проверку MD5 и ратаскивание может триггер на таблицу с BLOBом типа AFTER INSERT 2. Создай внешнюю таблицу (external table ... ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER ...)...), загружай данные через нее одной транзакцией, анализируй наличие bad-файла, используй PREPROCESSOR 3. Другие варианты думай, камрад ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2012, 20:31 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
askkas, А что же это за файл такой у тебя могучий, камрад? Сам его генегишь или получаешь от кого-то, кто его генерит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2012, 20:34 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
askkas, А с DB сервера файл доступен? Если да, то можно external table c reject limit 0. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2012, 21:00 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, будем пробовать) А файлик - это ежедневный отчет, который формируется другой программой и в другом формате - локально. Результаты вычислений планируется хранить на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2012, 11:31 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
SYА с DB сервера файл доступен? Если да, то можно external table c reject limit 0 . Да, точно! Это оно! Спасибо, камрад! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2012, 12:54 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
askkasА файлик - это ежедневный отчет, который формируется другой программой и в другом формате - локально. Результаты вычислений планируется хранить на сервере. Загрузку етого одного (?) файла раз в день делать надо? Или как? Ету программу ты можешь модернизировать так, чтобы в самом конце была строчка вида Код: plsql 1. Тут 5123456 - ето число строк которые нужно загрузить из твоего файла То есть ты еще как-то должен при формировании их посчитать Ну, или руками добавлять такую строку сможешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2012, 13:01 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
Да, все верно. Файл формируется на локальной машине в виде DBF таблицы VisualFoxpro. Количество записей известно. Загружаем его один раз в сутки. Метод с external table "политика партии" использовать не разрешает. Хотелось бы подробнее узнать про строку MY_FILE_END - для чего и где ее использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2012, 17:49 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
Изя КацманЕту программу ты можешь модернизировать так, чтобы в самом конце была строчка вида А что это даст? У SQL*Loader буфер не резиновый, посему как наполнится так и будет commit. Посему все равно нужна staging table. Это типичная ETL задача. Грузи в staging table. Анализируй SQL*Loader лог. Нет ошибок, запускай следующий шаг - insert из staging table в основную. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2012, 18:44 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
SYИзя КацманЕту программу ты можешь модернизировать так, чтобы в самом конце была строчка вида А что это даст? У SQL*Loader буфер не резиновый, посему как наполнится так и будет commit. Посему все равно нужна staging table. Это типичная ETL задача. Грузи в staging table. Анализируй SQL*Loader лог. Нет ошибок, запускай следующий шаг - insert из staging table в основную.Ето даст возможность последнюю строчку загружать в другую таблицу, у которой будет триггер, который выполнит всю необходимую обработку То есть: 1. Если в позициях 1:11 не содержится MY_FILE_END, грузим данные в staging table 1 2. Если в позициях 1:11 содержится MY_FILE_END, грузим ету строку в staging table 2 3. Запускается триггер AFTER INSERT FOR EACH ROW, имеющийся у staging table 2 Етот триггер проверяет число загруженных строк - если оно совпадает с указанным в строке MY_FILE_END 5123456, то данные из staging table 1 переписываются в target table - если оно НЕ совпадает с указанным в строке MY_FILE_END 5123456, то данные из staging table 1 НЕ переписываются в target table, а в таблицу лога загрузки записывается информация о возникшей коллизии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2012, 17:50 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
Изя КацманSYпропущено... А что это даст? У SQL*Loader буфер не резиновый, посему как наполнится так и будет commit. Посему все равно нужна staging table. Это типичная ETL задача. Грузи в staging table. Анализируй SQL*Loader лог. Нет ошибок, запускай следующий шаг - insert из staging table в основную.Ето даст возможность последнюю строчку загружать в другую таблицу, у которой будет триггер, который выполнит всю необходимую обработку Недостаток етого подхода в том, что придется выставить для SQL*Loader параметр ROWS=1 Тогда COMMIT будет после каждой строки и всё сработает штатно Но COMMIT после каждой строки, выполненный 50 млн. раз может сильно повысить нагрузку на БД А как иначе сделать, чтобы триггер, имеющийся у staging table 2, получил консистентное состояние staging table 1 я не знаю Хотя вроде бы оно все равно должно получиться, даже если COMMIT будет через произвольное число строк. Нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.09.2012, 17:56 |
|
||
|
sql *loader. Commit в конце
|
|||
|---|---|---|---|
|
#18+
askkas, не пробовали поиграться с параметром "commit_discontinued -- фиксировать загруженные строки, когда загрузка прекращена (По умолчанию FALSE)"? вроде как можно загрузить все без коммита, а потом сделать проверку лога, например. Если есть, транк таблички. правда хд может умереть от коммита на 5 млн строк.. не претендую на самый лучший совет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2016, 12:56 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=37942725&tid=1887291]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 525ms |

| 0 / 0 |
