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 :

Optimiser INSERT sur table cible contenant un INDEX UNIQUE


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 Optimiser INSERT sur table cible contenant un INDEX UNIQUE
    Bonjour,

    J'ai hérité d'une base, je suis en train d'essayer de faire quelques tests afin d'optimiser des chargements. Je découvre Oracle et pour le moment je n'ai pas les droits pour exécuter les plans de requêtes.

    J'ai donc une table A contenant un index unique sur 3 champs, cette table est alimentée, selon le besoin, par des utilisateurs chargeant des lots de 6 millions de lignes. Ce chargement prend plus de 6 minutes. La table source n'est pas indexée, c'est une table externe (on l’appellera table B).

    Ajouter un hint APPEND au chargement augmente les performances, on passe à 3"30 environ. J'ai tenté également de remplacer l'index unique par un index simple et d'effectuer un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    INSERT INTO TABLE_A A
    SELECT * FROM TABLE_B
    WHERE NOT EXISTS (
     SELECT 1 FROM TABLE_A
     WHERE A.COLONNE1 = COLONNE1
     AND A.COLONNE2 = COLONNE2
     AND A.COLONNE3 = COLONNE3
    )
    Les performances sont sensiblement identiques à celles où il y a l'index unique, soit 6 minutes environ. Je sèche un peu...

    Auriez-vous une idée sur la manière d'optimiser ce type de chargement et voir (lorsque j'aurai les droits...) comment voir où les perfs ne sont pas bonnes ? Par ailleurs je suis dans un cas de figure où les fichiers sources sont sur le réseau (et non sur le serveur local Oracle) et où je ne connais pas l'architecture matérielle, auriez-vous également une idée sur la manière dont on peut "auditer" l'implication du réseau et matériel dans les perfs ? Vous l'aurez compris, le cas de figure de devoir prendre en compte l'architecture est nouveau pour moi

    En vous remerciant,

    C. Tobini

  2. #2
    Membre à l'essai
    Homme Profil pro
    Stagiaire en développement delphi / oracle
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Stagiaire en développement delphi / oracle
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 23
    Points
    23
    Par défaut
    Tu pourrais essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    insert into table_A
    select distinct b.COLONNE1, b.COLONNE2, b.COLONNE3 
    from table_B b
    left outer join table_A a
    on b.COLONNE1=a.COLONNE1 and
    b.COLONNE2=a.COLONNE2 and
    b.COLONNE3=a.COLONNE3
    where a.COLONNE1 is null or
    	  a.COLONNE2 is null or
    	  a.COLONNE3 is null;
    (Lien : http://sqlpro.developpez.com/cours/optimiser/#L9)

  3. #3
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Que est-ce que vous essayer d'accomplir en termes d'optimisation ? C'est quoi votre cible d'optimisation ?
    Une autre piste à explorer consiste à chargez la table en parallèle.
    D'autre parte si vous avez besoin d'un index unique sur la table laisse-le en place.

    EDIT
    Je me suis rappelé ce lien "improving performance with pipelined table functions" qui traite des problèmes d'optimisation des chargement des données.

  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
    Citation Envoyé par Zephos Voir le message
    Tu pourrais essayer :

    [...]

    (Lien : http://sqlpro.developpez.com/cours/optimiser/#L9)
    Merci pour le code et le lien, je vais tester et je fais un retour

  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
    Citation Envoyé par mnitu Voir le message
    Que est-ce que vous essayer d'accomplir en termes d'optimisation ? C'est quoi votre cible d'optimisation ?
    Une autre piste à explorer consiste à chargez la table en parallèle.
    D'autre parte si vous avez besoin d'un index unique sur la table laisse-le en place.

    EDIT
    Je me suis rappelé ce lien "improving performance with pipelined table functions" qui traite des problèmes d'optimisation des chargement des données.
    Bonsoir et merci de votre réponse. Le but est le gain de temps, aujourd'hui les utilisateurs effectuent des chargements durant plusieurs dizaines de minutes en attendant que le traitement se termine (c'est un traitement en direct, il n'est pas envisageable de traiter par lots par la suite), je souhaite réduire ces délais. Par chargement en parallèle vous voulez dire en utilisant le hint PARALLEL ? Il y a bien une clause d'unicité sur 3 colonnes à conserver dans la table, donc l'index est nécessaire, je pensais plus à une désactivation ou suppression / recréation de l'index après insertion.

  6. #6
    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
    J'ai testé les 2 méthodes, pour ce qui est du JOIN ça n'améliore pas les perfs, pour ce qui est du hint PARALLEL non plus, je creuse.

Discussions similaires

  1. [AC-2003] Erreur Insertion sur table liée via ODBC
    Par Stephane84 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/01/2012, 18h29
  2. recherche sur table mysql avec deux index
    Par Invité1 dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/05/2010, 11h41
  3. Optimisation requete sur tables
    Par calou_33 dans le forum SQL
    Réponses: 1
    Dernier message: 07/10/2009, 14h27
  4. Optimiser delete sur table
    Par fulub dans le forum Administration
    Réponses: 13
    Dernier message: 16/06/2009, 22h05
  5. [debutant] select-insert sur tables de bases differentes
    Par RedMax dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/10/2004, 18h59

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