2009-10-19 11 views
1

J'ai quelques grandes tables (des millions de lignes). Je reçois constamment des fichiers contenant de nouvelles lignes à ajouter à ces tables - jusqu'à 50 millions de lignes par jour. Environ 0,1% des lignes que je reçois sont des doublons de lignes que j'ai déjà chargées (ou sont des doublons dans les fichiers). Je voudrais empêcher ces lignes d'être chargées dans la table.Comment empêcher le chargement de lignes dupliquées dans une table Oracle?

Actuellement j'utilise SQL Loader afin d'avoir des performances suffisantes pour faire face à mon grand volume de données. Si je prends l'étape évidente et ajoute un index unique sur les colonnes qui goven si une rangée est ou non une copie, SQL Loader commencera à échouer le fichier entier qui contient la ligne dupliquée - alors que je veux seulement empêcher la rangée dupliquée lui-même étant chargé. Je sais que dans SQL Server et Sybase je peux créer un index unique avec la propriété 'Ignore Duplicates' et que si j'utilise ensuite BCP, les lignes dupliquées (comme définies par cet index) ne seront simplement pas chargées.

Existe-t-il un moyen d'obtenir le même effet dans Oracle?

Je ne veux pas supprimer les lignes en double une fois qu'elles ont été chargées - il est important pour moi qu'elles ne devraient jamais être chargées en premier lieu.

+1

Comment chargez-vous les fichiers - SQL * Loader/Data Pump? – dpbradley

+0

Actuellement en utilisant SQL * Loader. En raison du grand volume de données, la performance est importante pour moi. – user181903

Répondre

5

Que voulez-vous dire par "double"? Si vous avez une colonne qui définit une ligne unique, vous devez définir une contrainte unique par rapport à cette colonne. On crée généralement un index unique sur cette colonne, qui va automatiquement mettre en place la contrainte.

EDIT: Oui, comme indiqué ci-dessous, vous devez configurer un "mauvais" fichier pour SQL * Loader pour capturer les lignes non valides. Mais je pense que l'établissement de l'index unique est probablement une bonne idée du point de vue de l'intégrité des données.

+0

Un très bon point - j'aurais dû mentionner que je charge jusqu'à 50 millions de lignes par jour et que je veux donc utiliser SQL * Loader pour effectuer la charge de données. Je crois que SQL * Loader échouera le fichier entier s'il contient des doublons qui violent un index unique. – user181903

+0

Vous pouvez dire à SQL * Loader ce qu'il faut faire des lignes rejetées. Essayez de spécifier un paramètre 'badfile' sur la ligne de commande, avec un paramètre 'errors' suffisamment élevé. – Hobo

+0

@Adam - désolé, cela a été dirigé à ginsoakedboy, pas vous. Je pense qu'une combinaison d'un index unique et de paramètres SQL * Loader adaptés est la voie à suivre. – Hobo

2

Utilisez l'instruction Oracle MERGE. Quelques explications here.

2

Vous dinez informer sur quelle version d'Oracle vous avez. Jetez un oeil là-bas pour merge command.

essentiellement comme

---- 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

J'utiliserais les contraintes d'intégrité définies sur les colonnes de table appropriées.

Cette page du manuel des concepts Oracle donne un aperçu, si vous faites défiler vers le bas, vous verrez quels types de contraintes sont disponibles.

+0

Une bonne approche pour être sûr, mais afin de répondre à mes besoins de performance (50 millions de lignes/jour) J'utilise SQL * Loader pour charger les lignes. Je pense que SQL * Loader va échouer des fichiers entiers s'ils contiennent des doublons si j'ajoute un tel index, ce qui n'est pas acceptable pour mon application. – user181903

1

utilisez l'option ci-dessous, si vous obtenez ce beaucoup d'erreur 9999999 après que votre sqlldr se terminera.

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

vous obtiendrez des doublons dans le fichier mauvais.

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