2009-04-27 7 views
1

Comment insérer des données d'environ 2 millions de lignes dans une table de base de données Oracle où nous avons plusieurs index? Je sais qu'une option est la désactivation de l'index, puis l'insertion des données. Quelqu'un peut-il me dire quelles sont les autres options?Ajustement SQL

+0

Je pense que des informations supplémentaires sont nécessaires pour fournir une réponse significative. Si UNDO est suffisamment dimensionné, ce n'est pas un problème si l'insertion de l'insert est l'objectif * only *. Avez-vous besoin que l'insertion soit une transaction unique pour la cohérence de lecture/l'annulation? Y a-t-il un DML concurrent à la table provenant d'autres sources lors de l'insertion? La nature de l'application est-elle telle que le temps d'exécution de cette opération est prohibitif? – dpbradley

+0

Je voudrais que les données soient insérées dans une seule transaction – venkat

Répondre

0

Vous ne savez pas comment vous insérez les enregistrements; si tu peux; insérez les données dans des morceaux plus petits. Dans mon expérience de 50 ensembles de 20k dossiers est souvent plus rapide que 1 x 1000000

Assurez-vous que vos fichiers de base de données sont assez grandes avant de commencer à vous sauver de la croissance de la base de données au cours de l'insert ...

0

Si vous êtes sûr les données, outre l'index, vous pouvez désactiver les contrôles référentiels et de contraintes. Vous pouvez également réduire le niveau d'isolation des transactions.

Toutes ces options ont cependant un prix. Chaque option augmente votre risque d'avoir des données corrompues dans le sens où vous pouvez vous retrouver avec de null FK etc.

1

charge en vrac avec des données pré-triés dans l'index pour clé

1

Check SQL*Loader out (en particulier le paragraphe sur performance optimization): C'est l'utilitaire de chargement en vrac standard pour Oracle, et il fait du bon travail une fois que vous savez comment l'utiliser (comme toujours avec Oracle).

1

il y a beaucoup d'astuces pour fixer de insert, je l'ai écrit ci-dessous certains d'entre eux

  • si vous utilisez sequence.nextval pour l'insertion faire séquence a une grande valeur sûre du cache (1000 est généralement suffisant)
  • goutte indexes avant insertion et création après (assurez-vous d'obtenir les scripts de création des index avant de les déposer) lors de la création vous pouvez utiliser l'option parallèle
  • si la table cible a des dépendances fk les désactiver avant l'insertion et après l'activation de l'insertion à nouveau. si vous êtes sûr de vos données, vous pouvez utiliser novalidate l'option si vous sélectionnez et insérez vous pouvez donner (en option novalidate est valable pour oracle, d'autres systèmes SGBDR ont probablement une option similaire)
  • indice parallèle pour instruction select et insérez vous pouvez utiliser append indice (insert-chemin direct) (concept insertion chemin direct est valable pour oracle, d'autres SGBDR systèmes ont probablement une option similaire)
0

en tant une autre option, on peut utiliser Oracle Pompes de données avancées et plus rapides (expdp, impdp) disponibilité des utilitaires 10 G onward. Cependant, Oracle prend toujours en charge l'ancienne exportation/importation (exp, imp).

Oracle nous offre beaucoup de choix pour le chargement de données, d'une manière plus rapide que les autres:

  • Oracle10 Data Pump utilitaire d'importation Oracle
  • SQL insert et fusion
  • déclarations charges en vrac PL/SQL pour la forall opérateur PL/SQL
  • SQL * Loader

The pros/cons of each can be found here ..

Questions connexes