2010-11-22 7 views
2

Scénario:Oracle mise à jour la base de données de production

  • J'ai un énorme fichier .csv (millions de lignes).
  • Avec sqlldr (SQL Loader) Je dois créer une table temporaire avec toutes les données dans le fichier CSV. Après cela, je dois faire un peu de traitement sur la table temporaire (mise à jour majuscule de certaines colonnes, etc.).
  • Après traitement, je dois prendre chaque ligne de la table temporaire, faire des vérifications supplémentaires et insérer ces lignes dans une autre table (étant fortement utilisé en production).

Comment proposez-vous de faire tout ce traitement, afin que je n'affecte pas la performance globale de l'environnement de production?

(NOTE: je ne suis pas supposé pré-traiter le .csv avant la main).

Toute suggestion sera grandement appréciée!

+0

Y a-t-il une raison pour laquelle vous ne pouvez pas charger ceci en développement et le déployer à partir de là? – JNK

Répondre

10

Je sais que vous avez dit que vous voulez utiliser SQL Loader, mais vous pouvez envisager d'utiliser une table externe car cela pourrait faciliter les choses. Vous pouvez déclarer votre table externe comme quelque chose comme

create table EXTERNAL_HR_DATA (
    EMPNO NUMBER(4), 
    ENAME VARCHAR2(10), 
    JOB  VARCHAR2(9), 
    MGR  NUMBER(4), 
    HIREDATE DATE, 
    SAL  NUMBER(7,2), 
    COMM  NUMBER(7,2), 
    DEPTNO NUMBER(2)) 
    Organization external 
     (type oracle_loader 
     default directory testdir 
     access parameters (records delimited by newline 
          fields terminated by ‘,’) 
     location (‘emp_ext.csv’)) 
    reject limit 1000; 

Cela vous permettra de lire (mais pas modifier) ​​les données contenues dans votre fichier en utilisant des instructions SELECT standard. Vous pouvez ensuite SELECT de la table externe et insérer les données dans votre table « temp » directement, faisant au moins une partie de l'édition au cours de l'INSERT:

INSERT INTO TEMP_HR_DATA 
    SELECT EMPNO, 
     UPPER(TRIM(ENAME)), 
     UPPER(TRIM(JOB)), 
     MGR, 
     HIREDATE, 
     SAL, 
     COMM, 
     DEPTNO 
    FROM EXTERNAL_HR_DATA; 

Partager et profiter.

+0

J'ai utilisé des tables externes pour le téléchargement à partir de fichiers CSV - mon jeu comportait environ 100 000 enregistrements, et ce processus s'est déroulé sans problème.+1 – Sathya

+1

+1, mais pas convaincu que ce soit plus efficace/performant que SQL * Loader. – DCookie

+0

Vous ne pouvez pas faire autant de traitement dans les fichiers externes que dans sqlldr (SQL sur un champ pour le mettre à jour d'une manière particulière), mais c'est un bon choix si vous essayez d'utiliser moins de disque sur l'une de vos étapes, en particulier Si cela nécessite plus de tables temporaires. – orbfish

1

Vous pouvez charger les données et effectuer votre traitement dans votre base de données CERT. Lorsque vous avez terminé le traitement de la table temporaire, déplacez-la sur PROD w/export/import (datapump) ou sur le lien de la base de données. Ensuite, faites votre insertion dans la table PROD. Cela vous permettrait de faire votre traitement de données sans aucun impact sur PROD. Les insertions doivent être faites dans PROD, afin de minimiser l'impact, vous devriez jeter un oeil à tous les déclencheurs/contraintes/index qui peuvent être désactivés/supprimés pendant les insertions si vous pensez que ce sera un gros problème.

2

Vérifiez si votre base de données a suffisamment d'espace disque et n'est pas trop sollicitée sur sa RAM/CPU.

Si c'est OK: faites-le. Un million de lignes n'est pas spectaculaire. Le chargement du fichier dans une table de travail ne ressemble pas à quelque chose qui affecterait normalement les performances de production. Vous pouvez faire le to_upper() dans votre fichier de contrôle sqlldr (vous enregistre une mise à jour sur la table de travail). Peut-être qu'il y a plus de post-traitement qui peut être fait pendant le chargement? Une table externe (comme suggéré dans l'autre réponse) fonctionne bien aussi, mais n'a pas d'autre avantage que d'économiser de l'espace disque, alors qu'elle donne un peu plus de tracas à configurer (créer un répertoire, accorder l'accès, transférer le fichier au serveur DB).

2

Vous pouvez réellement faire un peu de post-traitement dans SQL * Loader lorsque vous chargez le fichier. Cela pourrait réduire une partie de la charge sur la base de données car la mise à jour de la table temporaire peut être lente et créer de grandes quantités de refaire/annuler/quoi que ce soit.

Questions connexes