Quel est le moyen le plus rapide d'insérer des données dans une table Oracle?

StackOverflow https://stackoverflow.com/questions/143872

  •  02-07-2019
  •  | 
  •  

Question

J'écris une conversion de données en PL / SQL qui traite les données et les charge dans une table. Selon le profileur PL / SQL, l’une des parties les plus lentes de la conversion est l’insertion réelle dans la table cible. La table a un seul index.

Pour préparer les données au chargement, je remplis une variable à l'aide du type de ligne de la table, puis je l'insère dans la table comme suit:

  

insérer dans les valeurs de ma table r_myRow;

Il semble que je puisse gagner en performance en procédant comme suit:

  • Désactiver la journalisation lors de l'insertion
  • Insérer plusieurs enregistrements à la fois

Ces méthodes sont-elles recommandables? Si oui, quelle est la syntaxe?

Était-ce utile?

La solution

Il est bien préférable d’insérer quelques centaines de lignes à la fois, en utilisant des tables PL / SQL et FORALL pour se lier à une instruction insert. Pour plus de détails, voir ici .

Faites également attention à la façon dont vous construisez les tables PL / SQL. Si possible, préférez effectuer toutes vos transformations directement en SQL en utilisant "INSERT INTO t1 SELECT ...". effectuer des opérations ligne par ligne dans PL / SQL sera toujours plus lent que SQL.

Dans les deux cas, vous pouvez également utiliser des insertions de chemin direct en utilisant INSERT / * + APPEND * / , qui contourne fondamentalement le cache de la base de données et alloue et écrit directement de nouveaux blocs dans des fichiers de données. Cela peut également réduire la quantité de journalisation, selon l'utilisation que vous en faites. Cela a également des implications, merci de lire le bien manuel en premier.

Enfin, si vous tronquez et reconstruisez la table, il peut être intéressant de commencer par supprimer (ou de marquer inutilisable), puis de reconstruire les index.

Autres conseils

Les instructions d'insertion standard sont le moyen le plus lent d'obtenir des données dans une table et ne sont pas destinées aux insertions en bloc. L'article suivant fait référence à différentes techniques d'amélioration des performances: http: //www.dba-oracle .com / oracle_tips_data_load.htm

Si la suppression de l'index n'accélère pas suffisamment les choses, vous avez besoin de Oracle SQL * Loader :

.

http://www.oracle.com/technology /products/database/utilities/htdocs/sql_loader_overview.html

Supposons que vous ayez pris eid, ename, sal, job. Donc, créez d'abord une table en tant que:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));

Insérez maintenant les données: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job');

Supprimez l'index, insérez les lignes, puis recréez-le.

Vérifiez ce lien http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. points principaux à considérer pour votre cas est d'utiliser append hint comme cela ajoutera directement dans le tableau au lieu d'utiliser freelist. Si vous pouvez vous permettre de désactiver la journalisation, utilisez plutôt l’ajout d’une astuce Nologging pour le faire.
  2. Utilisez une insertion en bloc au lieu d'itérer dans PL / SQL
  3. Utilisez sqlloaded pour charger les données directement dans la table si vous obtenez des données à partir d'un flux de fichiers

Peut-être qu'une de vos meilleures options est d'éviter Oracle autant que possible. Je suis moi-même déconcerté par cela, mais très souvent, un processus Java peut surpasser de nombreux utilitaires Oracle qui utilisent OCI (lire: SQL Plus) ou prennent beaucoup de temps pour bien faire (lire: SQL * Loader ).

Cela ne vous empêche pas d'utiliser des astuces spécifiques (comme / APPEND /).

J'ai été agréablement surpris chaque fois que je me suis tourné vers ce type de solution.

A bientôt,

Rollo

Voici mes recommandations sur l'insertion rapide.

Déclencheur - Désactive les déclencheurs associés à une table. Activer une fois les insertions terminées.

Index - Supprimez Index et recréez-le une fois vos insertions terminées.

Statistiques obsolètes: analysez à nouveau les statistiques de table et d'index.

Dé-fragmentation de l'index - Reconstruisez l'index si nécessaire Utilisez No Logging -Insert en utilisant INSERT APPEND (Oracle uniquement). Cette approche est très risquée, aucun journal de rétablissement n’est généré. Par conséquent, vous ne pouvez pas effectuer de restauration, effectuez une sauvegarde de la table avant de démarrer et n’essayez pas sur des tables actives. Vérifiez si votre base de données a une option similaire

Insertion parallèle: l'exécution d'une insertion parallèle accélérera le travail.

Utiliser une insertion en bloc Contraintes - Pas de frais généraux lors des insertions, mais une bonne idée de vérifier si le ralentissement persiste même après l'étape 1

Vous pouvez en savoir plus sur http://www.dbarepublic.com/2014 /04/slow-insert.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top