Как предотвратить загрузку повторяющихся строк в таблицу Oracle?

У меня есть несколько больших таблиц (миллионы строк). Я постоянно получаю файлы, содержащие новые строки для добавления в эти таблицы — до 50 миллионов строк в день. Около 0,1% строк, которые я получаю, являются дубликатами строк, которые я уже загрузил (или дублируются в файлах). Я хотел бы предотвратить загрузку этих строк в таблицу.

В настоящее время я использую SQLLoader, чтобы иметь достаточную производительность для обработки большого объема данных. Если я сделаю очевидный шаг и добавлю уникальный индекс для столбцов, определяющих, является ли строка дубликатом, SQLLoader начнет сбой всего файла, содержащего повторяющуюся строку, тогда как я хочу только предотвратить загружается сама повторяющаяся строка.

Я знаю, что в SQL Server и Sybase я могу создать уникальный индекс со свойством «Игнорировать дубликаты», и что если я затем использую BCP, повторяющиеся строки (как определено этим индексом) просто не будут загружены.

Есть ли способ добиться такого же эффекта в Oracle?

Я не хочу удалять повторяющиеся строки после их загрузки — для меня важно, чтобы они вообще никогда не загружались.


person user181903    schedule 19.10.2009    source источник
comment
Как вы загружаете файлы - SQL*Loader/Data Pump?   -  person dpbradley    schedule 19.10.2009
comment
В настоящее время используется SQL*Loader. Из-за большого объема данных для меня важна производительность.   -  person user181903    schedule 21.10.2009


Ответы (5)


Что вы подразумеваете под "дубликатом"? Если у вас есть столбец, который определяет уникальную строку, вы должны установить уникальное ограничение для этого столбца. Обычно для этого столбца создается уникальный индекс, который автоматически устанавливает ограничение.

РЕДАКТИРОВАТЬ: Да, как указано ниже, вы должны настроить «плохой» файл для SQL * Loader для захвата недопустимых строк. Но я думаю, что создание уникального индекса, вероятно, является хорошей идеей с точки зрения целостности данных.

person Adam Hawkes    schedule 19.10.2009
comment
Очень хороший момент — я должен был упомянуть, что я загружаю до 50 миллионов строк в день и поэтому хочу использовать SQLLoader для загрузки данных. Я считаю, что SQLLoader не сможет загрузить весь файл, если он содержит дубликаты, которые нарушают уникальный индекс. - person user181903; 21.10.2009
comment
Вы можете указать SQL*Loader, что делать с отклоненными строками. Попробуйте указать параметр «плохой файл» в командной строке с соответствующим высоким параметром «ошибки». - person Hobo; 21.10.2009
comment
@ Адам - ​​извините, это было адресовано ginsoakedboy, а не вам. Я считаю, что комбинация уникального индекса и подходящих параметров SQL * Loader - это путь. - person Hobo; 21.10.2009

Используйте оператор Oracle MERGE. Некоторые пояснения здесь.

person Cătălin Pitiș    schedule 19.10.2009

Вы не сообщаете, какая у вас версия Oracle. Взгляните на команду объединения.

В основном так

---- Loop through all the rows from a record temp_emp_rec
MERGE INTO hr.employees e
     USING temp_emp_rec t
     ON (e.emp_ID = t.emp_ID)
     WHEN MATCHED THEN
    --- _You can update_
    UPDATE
     SET first_name = t.first_name,
          last_name = t.last_name
    --- _Insert into the table_
    WHEN NOT MATCHED THEN
    INSERT (emp_id, first_name, last_name)
    VALUES (t.emp_id, t.first_name, t.last_name); 
person Guru    schedule 19.10.2009

Я бы использовал ограничения целостности, определенные для соответствующих столбцов таблицы.

Эта страница из концепции Oracle руководство дает обзор, если вы также прокрутите вниз, вы увидите, какие типы ограничений доступны.

person Ian Carpenter    schedule 20.10.2009
comment
Безусловно, хороший подход, но для удовлетворения моих потребностей в производительности (50 миллионов строк в день) я использую SQLLoader для загрузки строк. Я думаю, что SQLLoader не сможет выполнить целые файлы, если они содержат дубликаты, если я добавлю такой индекс, что неприемлемо для моего приложения. - person user181903; 21.10.2009

используйте опцию ниже, если вы получите такую ​​ошибку 9999999, после чего ваш sqldr завершится.

OPTIONS (ERRORS=9999999, DIRECT=FALSE )
LOAD DATA

вы получите повторяющиеся записи в плохом файле.

sqlldr user/password@schema CONTROL=file.ctl, LOG=file.log, BAD=file.bad
person abhishek Kumar    schedule 07.06.2017