2008-09-27 9 views
7

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.Quel est le moyen le plus rapide d'insérer des données dans une table Oracle?

Pour préparer les données pour la charge, je POPULATE une variable en utilisant la rowtype de la table, puis l'insérer dans la table comme ceci:

insert into mytable values r_myRow;

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

  • Tourner la fermeture de session au cours de l'insert
  • Insérer plusieurs enregistrements à la fois

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

Répondre

14

Il est il est préférable d'insérer quelques centaines de lignes à la fois, en utilisant les tables PL/SQL et FORALL pour lier dans l'instruction insert. Pour plus de détails à ce sujet, voir here.

Faites également attention à la manière dont vous construisez les tables PL/SQL. Dans la mesure du possible, préférez faire toutes vos transformations directement dans SQL en utilisant "INSERT INTO t1 SELECT ..." car les opérations ligne par ligne dans PL/SQL seront toujours plus lentes 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 les fichiers de données. Cela peut également réduire la quantité de journalisation, en fonction de la façon dont vous l'utilisez. Cela a également certaines implications, alors s'il vous plaît lire le fine manual d'abord.Enfin, si vous êtes en train de tronquer et de reconstruire la table, il peut être utile d'abandonner d'abord (ou de marquer inutilisable) et de reconstruire les index plus tard.

0

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

+0

L'utilisation d'un gros insetr méthodologie permettra d'atténuer l'effet de l'indice là-bas cependant. –

0

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

  1. principaux points à prendre en compte pour votre cas est d'utiliser cette touche AJOUT comme va directement ajouter dans la table au lieu d'utiliser freelist. Si vous pouvez vous permettre de désactiver la journalisation plutôt que d'utiliser l'ajout d'un indice nologging pour le faire
  2. Utilisez plutôt un insert en bloc au lieu d'itérer en PL/SQL
  3. Utilisez sqlloaded pour charger les données directement dans la table si vous obtenez des données à partir d'un fichier file
2

Les instructions d'insertion régulières sont le moyen le plus lent d'obtenir des données dans une table et non pour des insertions en bloc. L'article suivant fait référence à un grand nombre de techniques différentes pour amélioration de la performance: http://www.dba-oracle.com/oracle_tips_data_load.htm

+0

Ce lien est plein de conseils horribles. –

0

Peut-être l'une de vos meilleures options est d'éviter autant que possible Oracle. J'ai été déconcerté par moi-même, mais très souvent un processus Java peut surpasser de nombreux utilitaires d'Oracle qui utilisent soit OCI (lire: SQL Plus) ou prendront beaucoup de temps pour avoir raison (lire: SQL * Chargeur).

Cela ne vous empêche pas d'utiliser des indications spécifiques (par exemple/APPEND /).

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

Cheers,

Rollo

1

Supposons que vous avez pris eid, Ename, sal, emploi. Donc, créer une table d'abord comme:

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

Maintenant insérer des données: -

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

Voici mes recommandations sur insertion rapide. Déclencheur - Désactive tous les déclencheurs associés à une table. Activer après que les insertions sont terminées. Index: supprimez l'index et recréez-le une fois vos insertions terminées. Statistiques obsolètes - Ré-analyse des statistiques de table et d'index.

Indexation de la fragmentation - Reconstruire l'index si nécessaire Utiliser No Logging -Insert using INSERT APPEND (Oracle uniquement). Cette approche est une approche très risquée, aucun journal de redo n'est généré, donc vous ne pouvez pas faire de rollback - faites une sauvegarde de la table avant de commencer et n'essayez pas sur les tables live. Vérifiez si votre db a une option similaire

Insertion parallèle: L'insertion parallèle active le travail plus rapidement.

bulk Insérer Contraintes - Pas de frais généraux au cours des inserts mais toujours une bonne idée de vérifier, si elle est encore lent après, même après l'étape 1

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

Questions connexes