J'implémente une fonction d'importation de données spécifique à l'application d'une base de données à une autre.
J'ai un fichier CSV contenant disons 10000 lignes. Ces lignes doivent être insérées / mises à jour dans la base de données.
Il peut y avoir le cas, où quelques lignes peuvent se présenter dans la base de données, ce qui signifie qu'elles doivent être mises à jour. S'ils ne sont pas présents dans la base de données, ceux-ci doivent être insérés.
Une solution possible est que je peux lire une par une ligne, vérifier l'entrée dans la base de données et créer des requêtes d'insertion / mise à jour en conséquence. Mais ce processus peut prendre beaucoup de temps pour créer des requêtes de mise à jour / insertion et les exécuter dans la base de données. Parfois, mon fichier CSV peut contenir des millions d'enregistrements.
Existe-t-il un autre moyen plus rapide de réaliser cette fonctionnalité?
OutOfMemory
!Réponses:
Il existe une belle technologie disponible dans Oracle appelée Tables externes. Dans votre scénario, vous pouvez accéder à vos données externes en texte brut à l'aide de tables externes à partir de la base de données et mettre à jour vos données existantes dans la base de données avec des instructions SQL que vous aimez et auxquelles vous êtes habitué, par exemple
INSERT
,MERGE
etc.Dans la plupart des cas, l'utilisation des utilitaires fournis par Oracle est le meilleur moyen d'effectuer ETL. Et parce que votre question ressemble plus à une question administrative, je vous suggère de consulter mon précédent article sur DBA Stack Exchange "Mettre à jour la base de données Oracle à partir de CSV" .
MISE À JOUR: Cette approche fonctionne assez bien pour lire des données externes dans la base de données. En règle générale, vous définissez un format de données externe chaque fois que vous devez traiter le fichier en texte brut qui a un nouveau format. Une fois la table externe créée, vous pouvez l'interroger comme une vraie table de base de données. Chaque fois qu'il y a de nouvelles données à importer, il vous suffit de remplacer les fichiers sous-jacents à la volée sans avoir besoin de recréer des tables externes. Étant donné que la table externe peut être interrogée comme n'importe quelle autre table de base de données, vous pouvez écrire des instructions SQL pour remplir d'autres tables de base de données.
Les frais généraux liés à l'utilisation de tables externes sont généralement inférieurs à ceux d'autres techniques que vous implémenteriez manuellement, car cette technologie a été conçue en tenant compte des performances en tenant compte de l'architecture Oracle Database.
la source
Je pense que vous devez utiliser SQL * Loader pour charger le fichier CSV dans une table temporaire, puis utiliser l'instruction MERGE pour insérer des données dans la table de travail.
SQL * Loader vous donnera plus de flexibilité que les tables externes et si l'on utilise une charge de chemin directe, c'est vraiment rapide. Et MERGE fera exactement ce dont vous avez besoin - INSÉRER de nouveaux enregistrements et METTRE À JOUR les enregistrements existants.
Quelques liens pour commencer:
http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_concepts.htm
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016 .htm
la source
PreparedStatements rendra la création des requêtes d'insertion ou de mise à jour très rapide. Vous devez en avoir trois
PreparedStatements
: un pour l'insertion, un pour la mise à jour et un pour vérifier si la ligne est déjà dans le tableau. Si vous êtes en mesure de conserver les mêmes ID entre le fichier CSV et la nouvelle base de données, la vérification pour voir si une ligne est présente à l'aide du champ primaryID devrait également être très rapide.L'utilisation d'un insert en lot peut offrir un gain de performances. Au fur et à mesure que vous diffusez le fichier CSV, vous devez vérifier si la ligne est déjà là, puis effectuer une mise à jour ou ajouter la ligne à votre commande d'insertion par lots. Vous devriez vérifier cette question SO pour comparer la vitesse de ces deux approches.
Si cette importation de base de données doit être effectuée régulièrement et que les performances sont un problème en utilisant la méthode décrite ci-dessus, vous pouvez essayer de gérer la tâche avec plusieurs threads de travail. Utilisez autant de threads que de processeurs sur la machine exécutant ce code.
Chaque thread obtient sa propre connexion DB et au fur et à mesure que votre code parcourt le fichier, des lignes de CSV peuvent être transmises aux différents threads. C'est beaucoup plus compliqué, donc je ne ferais cela que si les exigences de performance m'y obligeaient.
la source