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

 Oracle Discussion :

Choix d'utilisation d'un index


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut Choix d'utilisation d'un index
    Bonjour,

    j'ai une requête SQL qui porte sur une colonne indexée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE m2oequipement eq
    SET eq.m2oCodeSup = 'SUP_INCO'
    WHERE eq.sysClass = 'm2oModule'
    Le résultat de cette requête porte sur environ 93% de la table, l'index n'est pas donc pas très discriminant.
    Lorsque j'affiche le plan d'exécution, je vois qu'il exécute un FULL SCAN.

    Lorsque j'affiche le plan d'exécution de la même requête mais avec une condition sur une valeur plus discriminante (6%):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE m2oequipement eq
    SET eq.m2oCodeSup = 'SUP_INCO'
    WHERE eq.sysClass = 'm2oRepeteur'
    Je vois qu'il fait un RANGE SCAN.

    Est-ce qu'ORACLE décide ou non d'utiliser l'index pour sa requête en fonction du fait qu'il soit discriminant ou pas ?
    Dans ce cas il va quand même interroger l'index au préalable ?

    merci !

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Est-ce qu'ORACLE décide ou non d'utiliser l'index pour sa requête en fonction du fait qu'il soit discriminant ou pas ?
    Oui, Au moment où la requête est parsée, il choisit le meilleur accès.
    Dans ce cas il va quand même interroger l'index au préalable ?
    Oui et non. Il interroge les statistiques (qui elles sont calculées auparavant en interrogeant l'index). Ou s'il n'y a pas de statistiques, il fait du dynamic sampling (en interrogeant un échantillon de l'index).

    Ici c'est les stats sur les colonnes, probablement des histogrammes, qui lui permettent d'estimer la selectivité de chaque valeur.

    Cordialement,
    Franck.

  3. #3
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    merci pour la réponse, c'est très clair.

    Est-il possible d'optimiser une requête aussi simple ?
    La table fait environ 400 000 lignes à l'heure actuelle mais va progressivement grossir jusqu'à environ 5 millions de lignes...

    Le premier update restera sur une proportion de 93% des lignes de la table.

    Il semblerai également que cette requête soit consommatrice en tablespace UNDO, faut-il faire une boucle avec des commits intermédiaires pour palier à ce problème ?

    merci.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous pouvez déjà filtrer les lignes qui ont la bonne valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE m2oequipement eq
       SET eq.m2oCodeSup = 'SUP_INCO'
     WHERE eq.sysClass = 'm2oModule'
       AND (eq.m2oCodeSup <> 'SUP_INCO' OR eq.m2oCodeSup is null);

  5. #5
    Expert confirmé 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

  6. #6
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Vous pouvez déjà filtrer les lignes qui ont la bonne valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE m2oequipement eq
       SET eq.m2oCodeSup = 'SUP_INCO'
     WHERE eq.sysClass = 'm2oModule'
       AND (eq.m2oCodeSup <> 'SUP_INCO' OR eq.m2oCodeSup is null);
    avec cette requête je suis moins gourmand en tablespace undo mais je perds un peu en performances c'est ça ?

  7. #7
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    merci pour le lien, il y a plusieurs choses intéressantes, je vais m'en inspirer pour mes traitements.

  8. #8
    Membre expérimenté
    Avatar de ora_home
    Homme Profil pro
    Consultant Oracle
    Inscrit en
    Février 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant Oracle
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 103
    Par défaut
    Citation Envoyé par rcb73 Voir le message
    merci pour la réponse, c'est très clair.

    Est-il possible d'optimiser une requête aussi simple ?
    La table fait environ 400 000 lignes à l'heure actuelle mais va progressivement grossir jusqu'à environ 5 millions de lignes...

    Le premier update restera sur une proportion de 93% des lignes de la table.

    Il semblerai également que cette requête soit consommatrice en tablespace UNDO, faut-il faire une boucle avec des commits intermédiaires pour palier à ce problème ?

    merci.
    Bonjour,
    Normalement si la requête sera exécuter une seule fois, vaut mieux de recréer la table avec les nouveaux valeur du champ que vous voulez modifier, puis DROPER la table mère, comme ça tu ne généras pas des UNDO.

  9. #9
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Malheureusement cette table est amenée à être modifiée en même temps par d'autres traitements, donc il y a un risque d'incohérence de données.
    Est-ce qu'il y a un moyen de contourner ce problème ?

  10. #10
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Il faudrait comprendre exactement le besoin et peut-être revoir le design général. Les use-case où il est nécessaire de faire un update sur des millions de lignes sont assez rares.
    Cordialement,
    Franck.

  11. #11
    Membre éclairé Avatar de fahdijbeli
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 281
    Par défaut
    bonsoir,
    si javais compris ton problème , il faut utiliser la méthode des partitions des tables , faire googler pour comprendre ça

  12. #12
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Citation Envoyé par pachot Voir le message
    Bonjour,
    Il faudrait comprendre exactement le besoin et peut-être revoir le design général. Les use-case où il est nécessaire de faire un update sur des millions de lignes sont assez rares.
    Cordialement,
    Franck.
    Le principe est celui-ci :

    - au départ on positionne un flag ("eq.m2oCodeSup = 'SUP_INCO'" -> etat de supervision inconnu) sur TOUS les objets d'un certain type d'une table ("eq.sysClass = 'm2oModule'" -> ces objets représentent environ 93% de la table)
    - on parcourt l'arbre de ces objets sous certaines conditions, si jamais pendant ce parcourt on rencontre un des objets précédents on met à jour le flag ("eq.m2oCodeSup = 'SUP_OK' ou 'SUP_NOK'" -> etat de supervision ok/nok), à la fin les objets qui n'auront pas été atteint (parcqu'ils ne remplissent pas les bonens conditions) resteront dans l'état positionné auparavant ('SUP_INCO' -> etat de supervision inconnu)

    j'espère avoir été assez clair

    merci pour votre aide.

  13. #13
    Membre habitué
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Par défaut
    Citation Envoyé par fahdijbeli Voir le message
    bonsoir,
    si javais compris ton problème , il faut utiliser la méthode des partitions des tables , faire googler pour comprendre ça
    au vu de mes requêtes, tu penserai faire un partitionnement comment ?
    est-ce qu'un type list serait adapté ?
    dans ma table (m2oequipement) j'ai une colonne (sysClass) ou seulement 3 valeurs sont possibles :
    - 'm2oModule' = 93%
    - 'm2oRepeteur' = 6%
    - 'm2oConcentrateur' = 1%

    cette colonne est souvent une condition de mes requêtes.

    merci.

  14. #14
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par rcb73 Voir le message
    j'espère avoir été assez clair
    Oui. tout à fait clair. Le problème: vous utilisez cette table un peu comme une table de travail. Donc tous les mécanismes de persistence (undo, redo, maintenance des index, etc) sont un travail inutile.

    Après traitement, il reste quel pourcentage positionné à SUP_INCO ? S'il y en a peu, alors il faudrait changer le design pour éviter de faire la mise à jour 2 fois.
    Peut-être que ce flag devrait se trouver dans une autre table: pas de ligne pour SUP_INCO (donc au début du traitement on la vide avec truncate) puis on remplit avec SUP_OK ou SUP_NOK au fur et à mesure. Par contre, lorsqu'on l'interroge, on fait une jointure (externe si on veut avoir les SUP_INCO)

    Cordialement,
    Franck.

Discussions similaires

  1. [Choix] Technologie à utiliser ?
    Par litbos dans le forum Frameworks Web
    Réponses: 9
    Dernier message: 12/08/2009, 15h23
  2. Justifier le choix d'utiliser Firebird
    Par Shellai-93 dans le forum Firebird
    Réponses: 3
    Dernier message: 31/08/2006, 13h39
  3. [Oracle 8i] utilisation d'un index
    Par azziz2005 dans le forum Oracle
    Réponses: 9
    Dernier message: 18/05/2006, 17h42
  4. [TUNING] pb non utilisation de l'index
    Par ruthene dans le forum Oracle
    Réponses: 10
    Dernier message: 13/04/2006, 17h02
  5. Taux d'utilisation d'un index
    Par plochert dans le forum Oracle
    Réponses: 1
    Dernier message: 07/04/2006, 15h22

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