Comment insérer des données sur 2 millions de lignes dans une table de base de données Oracle où nous avons de nombreux index? Je sais qu'une option consiste à désactiver l'index puis à insérer les données. Quelqu'un peut-il me dire quelles sont les autres options?
Réponses
Trop de publicités?Vérifiez SQL*Loader (surtout le paragraphe sur l'optimisation des performances) : c'est l'utilitaire standard de chargement en masse pour Oracle, et il fait du bon travail une fois que vous savez comment l'utiliser (comme toujours avec Oracle).
Il existe de nombreuses astuces pour accélérer l'insertion, ci-dessous j'en ai écrit quelques-unes
- Si vous utilisez sequence.nextval pour l'insertion, assurez-vous que la séquence a une grande valeur de cache (1000 est généralement suffisant)
- Supprimez les index avant l'insertion et recréez-les ensuite (assurez-vous d'obtenir les scripts de création des index avant de les supprimer) lors de la création, vous pouvez utiliser l'option parallel
- Si la table cible a des dépendances fk, désactivez-les avant l'insertion et réactivez-les après l'insertion. Si vous êtes sûr de vos données, vous pouvez utiliser l'option novalidate (l'option novalidate est valide pour Oracle, d'autres systèmes de gestion de bases de données relationnelles ont probablement une option similaire)
- Si vous sélectionnez et insérez, vous pouvez donner un indice parallèle pour l'instruction select et pour l'insertion vous pouvez utiliser un indice d'ajout (insertion directe) (le concept d'insertion directe est valide pour Oracle, d'autres systèmes de gestion de bases de données relationnelles ont probablement une option similaire)
Je ne suis pas sûr de la manière dont vous insérez les enregistrements; si possible, insérez les données par petits morceaux. Selon mon expérience, 50 ensembles de 20 000 enregistrements sont souvent plus rapides que 1 x 1000000
Assurez-vous que vos fichiers de base de données sont suffisamment grands avant de commencer pour éviter une croissance de la base de données pendant l'insertion ...
Si vous êtes sûr des données, en plus de l'indice vous pouvez désactiver les vérifications référentielles et les contraintes. Vous pouvez également réduire le niveau d'isolation de la transaction.
Toutes ces options ont un coût, cependant. Chaque option augmente votre risque d'avoir des données corrompues dans le sens où vous pourriez vous retrouver avec des clés étrangères nulles, etc.
- Réponses précédentes
- Plus de réponses