2009-10-19 2 views
1

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

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

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

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

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

+1

Как вы загружаете файлы - SQL * Loader/Data Pump? – dpbradley

+0

В настоящее время используется SQL * Loader. Из-за большого объема данных производительность важна для меня. – user181903

ответ

5

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

EDIT: Да, как указано ниже, вы должны установить «плохой» файл для SQL * Loader для захвата недопустимых строк. Но я считаю, что создание уникального индекса, вероятно, является хорошей идеей с точки зрения целостности данных.

+0

Очень хороший момент - я должен был упомянуть, что я загружаю до 50 миллионов строк в день и поэтому хочу использовать SQL * Loader для выполнения загрузки данных. Я считаю, что SQL * Loader завершит сбой всего файла, если он содержит дубликаты, которые нарушают уникальный индекс. – user181903

+0

Вы можете сказать SQL * Loader, что делать с отклоненными строками. Попробуйте указать параметр «badfile» в командной строке с соответствующим параметром «ошибки». – Hobo

+0

@ Адам - ​​извините, это было направлено на ginsoakedboy, а не на вас. Я считаю комбинацию уникального индекса, и подходящие параметры SQL * Loader - это путь. – Hobo

2

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

2

Вы знаете, какой выпуск Oracle у вас есть. Посмотрите там на merge command.

В принципе, как это

---- 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); 
1

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

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

+0

Хороший подход, чтобы быть уверенным, но для удовлетворения моих потребностей в производительности (50 миллионов строк в день) Я использую SQL * Loader для загрузки строк. Я думаю, что SQL * Loader завершит сбой целых файлов, если они содержат дубликаты, если я добавлю такой индекс, что неприемлемо для моего приложения. – user181903

1

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

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

вы получите дубликаты записей в плохом файле.

sqlldr user/[email protected] CONTROL=file.ctl, LOG=file.log, BAD=file.bad 

 Смежные вопросы

  • Нет связанных вопросов^_^