IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

INSERT : performances très dégradées en ajoutant une séquence auto-incrémentée [11g]


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut INSERT : performances très dégradées en ajoutant une séquence auto-incrémentée
    Bonjour,

    Je charge une table globale depuis une table externe (6 millions d'enregistrements) en utilisant un hint APPEND, le chargement prends quelques secondes, il n'y pas d'index sur la table globale cible et cette table subit un TRUNCATE avant chaque chargement.

    Souhaitant utilisant une PK numérique auto-incrémentée, j'ai créé une séquence (détruite et recréée à chaque chargement afin de démarrer à 1) et un trigger sur la table globale. Mon temps de chargement passe de quelques secondes à 8 minutes ! N'ayant pas de droits suffisants, je ne peux vérifier les traces ou visualiser le plan d'exécution.

    Sauriez-vous s'il est "normal" qu'un ralentissement de cet ordre soit constaté en utilisant une séquence ?

    En vous remerciant,

  2. #2
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    2 solutions s'offrent à vous

    1°) donner un cache large à la séquence
    2°) utiliser le numéro de ligne (et donc la pseudo colonne rownum) pour générer votre numéro

  3. #3
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Il faut éviter le trigger. Il désactive le mode APPEND.
    Cordialement,
    Franck.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci de la réponse, le temps de chargement est tout à fait correct en utilisant rownum

    En revanche j'ai essayé d'augmenter le cache (j'ai mis 1000000 afin de pré-valoriser 1000000 en mémoire mais je ne sais pas si j'ai bien interprété le comportement) mais ça ne change rien au temps de chargement.

    Citation Envoyé par ojo77 Voir le message
    2 solutions s'offrent à vous

    1°) donner un cache large à la séquence
    2°) utiliser le numéro de ligne (et donc la pseudo colonne rownum) pour générer votre numéro

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour, merci de l'information, je ne savais pas. Le différentiel de temps reste quand même énorme, le temps de chargement sans index et sans trigger est de quelques secondes avec APPEND et une trentaine de secondes sans APPEND mais reste à 8 minutes avec le trigger, je n'ai pas de recul mais ça me semble quand même anormalement démultiplié.

    Citation Envoyé par pachot Voir le message
    Bonjour,
    Il faut éviter le trigger. Il désactive le mode APPEND.
    Cordialement,
    Franck.

  6. #6
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Cet écart ne m'étonne pas.
    En direct-path (avec append) on remplit des blocs complets (sans passer du temps à trouver de l'espace libre), on les écrit, on génère très peu d'undo (car comme on insère à la fin, et qu'on est les seuls à modifier la table, pour rollbacker il sufit de baisser le high water mark). On vérouille toute la table mais c'est plus rapide.
    Avec le trigger, en plus de l'exécution du trigger pour chaque ligne (switch de contexte entre SQL et PL/SQL) chaque insert va trouver la bonne place, mettre à jour les index, générer du redo, de l'undo, etc.
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Il faut être vigilant effectivement ! Je suis passé par une autre table, d'un point de vue modélisation c'est d'ailleurs plus juste et les performances sont bonnes en insert et en utilisant le rownum. Merci de votre réponse

  8. #8
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par ctobini Voir le message
    Bonjour,

    Je charge une table globale depuis une table externe (6 millions d'enregistrements) en utilisant un hint APPEND, le chargement prends quelques secondes, il n'y pas d'index sur la table globale cible et cette table subit un TRUNCATE avant chaque chargement.

    Souhaitant utilisant une PK numérique auto-incrémentée, j'ai créé une séquence (détruite et recréée à chaque chargement afin de démarrer à 1) et un trigger sur la table globale. Mon temps de chargement passe de quelques secondes à 8 minutes ! N'ayant pas de droits suffisants, je ne peux vérifier les traces ou visualiser le plan d'exécution.

    Sauriez-vous s'il est "normal" qu'un ralentissement de cet ordre soit constaté en utilisant une séquence ?

    En vous remerciant,
    Le problème semble résolu, mais pourquoi utiliser un trigger avec la séquence ?
    Est-ce qu'en virant simplement le trigger et en utilisant juste la séquence, ça ne fonctionne pas tout aussi bien ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème requete insert en vba, impossible d'ajouter une date.
    Par GarnierFlorian dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 07/09/2010, 08h58
  2. [rose] Ajouter une séquence
    Par zev dans le forum Rational
    Réponses: 2
    Dernier message: 30/05/2008, 02h01
  3. Ajouter Une Cle Auto Dans Le Dbgrid
    Par coucoulido dans le forum Bases de données
    Réponses: 4
    Dernier message: 22/06/2007, 10h50
  4. Réponses: 1
    Dernier message: 26/05/2006, 11h11
  5. [help!] comment faire une séquence ki incrémente ....
    Par romtrash dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 19/04/2005, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo