Как пропустить повторные записи?
Я работаю над сценарием SQL*Loader для загрузки огромных объемов данных в таблицу.
Сценарий работает следующим образом: он подключается к FTP-серверу и зеркалирует каталог, чтобы получить все новые файлы, которые были сгенерированы, затем он берет все файлы CSV и сохраняет их в один, а затем выгружает данные из этого больший файл CSV.
По сути, я ищу способ, с помощью которого SQL*Loader даже не пытается вставить запись, если первая из записей уже существует в таблице.
Дело в том, что в таблице будет храниться до 10 миллионов записей, и иногда эти файлы будут ошибочно загружаться, если не должны, что будет означать, что некоторые записи будут повторяться.
Я поместил уникальные ключи в два поля, которые требовали этого.
Я попытался изменить максимальное количество ошибок на количество строк, которые будет пытаться вставить сценарий, но я заметил, что выполнение этого и возвращение им ошибки "Нарушение ограничения" работает намного медленнее, чем при отсутствии повторяющихся записей, и создает действительно большой журнал. файл.
Есть ли способ, внутри управляющего файла SQL*Loader, поместить условие (в два поля, так как любое из них может повторяться, но не оба одновременно)?
Или, как вы думаете, может помочь мне ускорить этот процесс?
Дополнительный вопрос: лучше ли мне, скажем, 10 CSV-файлов отправить каждый в SQL*Loader или создать один файл, содержащий данные из этих 10?
2 ответа
Согласно ответу solllodolllo, импортируйте записи во временную таблицу, но затем
DELETE FROM temptable WHERE id IN (SELECT id FROM yourtable)?
После этого вы можете вставить соблазнительный в свой стол.
Это, конечно, зависит от того, как ваши строки могут отличаться друг от друга. Возможно, было бы хорошо указать это в вопросе.
Чтобы предотвратить загрузку SQL Loader записи, если она уже существует в таблице, вы можете использовать оператор условия, который заставит SQL Loader пропустить запись, если она не удовлетворяет вашим необходимым условиям. Например:
LOAD DATA
INFILE 'YourData.dat'
BADFILE 'YourBadData.bad'
APPEND INTO TABLE YourTable
WHEN (Condition 1 = TRUE) AND (Condition 2 = FALSE)
{
...
Чтобы ускорить начальный процесс загрузки, вы можете вставить все записи во временную таблицу, а затем использовать оператор select для вставки всех отдельных строк в постоянную таблицу.
INSERT INTO YourTable
SELECT DISTINCT [fields]
FROM tempYourTable