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 :

Optimisation : Utilité de rappeler les derniers champs d'une clé composite ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Optimisation : Utilité de rappeler les derniers champs d'une clé composite ?
    Bonjour,

    Je suis chez un client, et je fait des évolutions dans des vues.
    J'en profite pour remettre de l'ordre aussi, et virer les lourdeurs de conceptions des requêtes.

    J'ai une table dont voici la structure :

    matable (id1, id2, id3, id4, val1, val2, val3, ...)

    En souligné la clé composite de la table.

    Chez ce client, le paramétrage (immuable pour cette partie applicative) fait que id1 et id2 sont suffisants pour identifier une ligne. id3 et id4 sont toujours à 0, quelles que soient les valeurs de id1 et id2.

    La requête est donc écrite avec une jointure sur la table qui ne teste que id1 et id2.
    => Il en résulte dans le plan d'exécution un RANGE SCAN de l'index unique.

    Est-ce réellement intéressant de rajouter dans la jointure "id3 = 0 and id4 = 0" afin d'expliquer à Oracle qu'on cherche une unique ligne dans la jointure ?

    C'est ce que j'ai fais (pour le fun, au cas où un jour, le paramétrage immuable ne change), mais je me pose la question...

    A l'exécution je n'ai pas de différence perceptible.

  2. #2
    Membre éclairé Avatar de LBO72
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 406
    Par défaut
    Bonjour,

    As-tu modifié ton index pour qu'il ne porte plus que sur id1 et id2 ?

    Cdlt,
    LBO72.

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Non, ça c'est pas possible.

    Il s'agit d'un ERP, donc je ne peux pas modifier ni le modèle des données, ni les index standard.

    Du coup je dois trouver la solution la plus performante en conservant cette structure.

    De plus, la table sert à plusieurs choses, et d'autres entités utilisent la totalité de la clé.

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Est-ce réellement intéressant de rajouter dans la jointure "id3 = 0 and id4 = 0" afin d'expliquer à Oracle qu'on cherche une unique ligne dans la jointure ?
    Je dirais que oui, ça te permet de passer du RANGE SCAN à l'UNIQUE SCAN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> select * from t where id1=1 and id2=1
     
           ID1        ID2        ID3        ID4       VAL1       VAL2       VAL3
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
             1          1          0          0          1          1          1
     
    Execution Plan
    ----------------------------------------------------------
       0       SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=4 Card=1 Bytes=21)
       1    0    TABLE ACCESS BY INDEX ROWID T (Cost=4 Card=1 Bytes=21)
       2    1      INDEX RANGE SCAN SYS_C0032014 (Cost=3 Card=1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> select * from t where id1=1 and id2=1 and id3=0 and id4=0
     
           ID1        ID2        ID3        ID4       VAL1       VAL2       VAL3
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
             1          1          0          0          1          1          1
    1 row selected.
     
    Execution Plan
    ----------------------------------------------------------
       0       SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=3 Card=1 Bytes=21)
       1    0    TABLE ACCESS BY INDEX ROWID T (Cost=3 Card=1 Bytes=21)
       2    1      INDEX UNIQUE SCAN SYS_C0032014 (Cost=2 Card=1)

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    C'est effectivement ce que je me suis toujours dit (et ce que j'applique habituellement). Au détail près que niveau performances, je n'ai jamais vu de différence.

    Ceci dit, comme je disais "au cas où" le paramétrage changerait, je pense qu'il est de toute façon plus prudent de remettre tous les champs de la clé, ça évitera d'avoir une démultiplicatin des lignes si un jour on se retrouve avec id3 ou id4 != 0...

  6. #6
    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
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    C'est effectivement ce que je me suis toujours dit (et ce que j'applique habituellement). Au détail près que niveau performances, je n'ai jamais vu de différence.
    ...
    Il est difficile de mettre en évidence l’effet ou il faut un test avec beaucoup des lectures. Dans le cas A) Oracle va lire le block racine de l’index va descendra ensuite jusqu’au block qui contient la clé (id1, id2, id3, id4) et ensuite va parcourir les ensembles des clés (id1, id2, X, Y). Mais comme id3 et id4 ont une seule et unique valeur 0 cela est assez proche du cas B) où Oracle descend l’index via la racine jusqu’au la clé unique cette fois (Id1, id2, id3, id4)

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

Discussions similaires

  1. [SQL-Server] Récupérer les derniers champs modifiés
    Par casawia dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 11/09/2014, 19h50
  2. Récupérer les derniers champs
    Par neptunes13 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/04/2012, 16h49
  3. recuperer les dernieres ocurences d'une table
    Par igorzup dans le forum Langage SQL
    Réponses: 3
    Dernier message: 26/07/2006, 12h14
  4. [CR XI] Les nouveaux champs d'une table n'apparaissent pas
    Par david_chardonnet dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 03/04/2006, 11h20
  5. comment rechercher les derniers enregistrement d'une table ?
    Par hornetboy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/09/2005, 09h13

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