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

Administration Oracle Discussion :

Comment le CBO estime les cardinalités d'un filter predicate sans stats sur la colonne ?


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut Comment le CBO estime les cardinalités d'un filter predicate sans stats sur la colonne ?
    Bonjour,

    j'ai une table TOTO pour laquelle des stats sont calculées. Les stats sur les colonnes sont calculés avec l'option "SKEWED ONLY". La table contient 89 millions de lignes.

    j'ai une requête avec un filter predicate sur le champ COL1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ...WHERE TOTO.COL1 in ('a','b','c')...
    J'ai 7 valeurs distinctes uniformément réparties pour cette colonne. Donc normalement le nombre de lignes retournées par cette opération doit être (89000000/7)*3 = 38 millons.

    Le soucis c'est qu'il n y'a pas de stats sur la colonne COL1 et le CBO estime 49 000 lignes.
    Ma question est: comment le CBO arrive à estimer le nombre de lignes retournées par le filter predicate sans statistiques sur la colonne ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    Rectification: dans mon exemple les stats sont calculées uniquement sur les colonnes indexées.

  3. #3
    Membre éprouvé Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Par défaut
    Bonjour,

    Tout dépend de tes stats, et je pense qu'il faut distinguer plusieurs situations possibles :

    - Ta table dispose de statistiques, tu as estimé tes stats sans histogramme pour cette colonne (paramètre dbms_stats method_opt à ALL INDEXED COLUMNS ET paramètre options différent de GATHER AUTO ET colonne non indéxée) : Dans ce cas, et en fonction du plan d'exécution, il se base sur les statistiques de la table.
    Pour vérifier que ta colonne dispose d'histogramme tu disposes des vues USER_HISTOGRAMS ou USER_TAB_COL_STATISTICS

    - Ta table dispose de statistiques et tu disposes d'histogrammes sur tes données, dans ce cas, et selon le plan d'exécution, le nombre de ligne est estimé en fonction des statistiques et de la répartition des données au travers de ces stats.

    - Ta table ne dispose pas de statistiques, et tu as activé le dynamic sampling. Dans ce cas, le CBO va prendre un échantillon représentatif de tes données et estimer la répartition et le nombre de ligne.
    Si tu veux utiliser le dynamic sampling alors que tu disposes de stats dans ta table, tu peux utiliser le hint DYNAMIC_SAMPLING
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select /*+ DYNAMIC_SAMPLING (t 4) */ * FROM t WHERE v in ('A','B','C');
    Sur un cas similaire à celui que tu mentionnes, j'ai obtenu les résultats les plus proches de la réalité avec les méthodes 1 et 3 .

    Laurent

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    En fait ma question porte sur le cas où j'ai des stats sur ma table et seulement des stats sur les colonnes indexées. Si dans ma requête j'ai un filter predicate sur une colonne non indexée (donc pas de stats dessus) comment l'optimizer estime la cardinalité retournée par ce filter predicate ?

  5. #5
    Membre éprouvé Avatar de laurentleturgez
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 88
    Par défaut
    Tu ne peux pas avoir des stats sur ta table et pas de stats sur tes colonnes indexées.

    A mon avis tu as des stats sur ta table mais pas d'histogramme sur tes colonnes indéxées. Dans ce cas, il ne se base que sur les statistiques de ta table. Dans ces statistiques, tu trouveras le nombre de valeurs distinctes, la densité de tes données dans ta colonne, la présence d'histogramme (dans ton cas, il n'y en a visiblement pas) etc.

    Bref, il ne se base que sur les statistiques actuelles.

    Si tes valeurs ne semblent pas correctes, il serait peut-être bon de revoir les statistiques de ta table.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    Tu ne m'as pas compris!!!
    J'ai des stats sur ma table et des stats seulement sur des colonnes indexées. je n'ai pas de stats sur des colonnes non indexées. Et justement le filter predicate porte sur une colonne non indexée et donc sans stats.

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

Discussions similaires

  1. Comment dessiner les cardinalités avec visio 11?
    Par jijidiscover dans le forum Visio
    Réponses: 1
    Dernier message: 21/10/2010, 01h55
  2. Comment provoquer le pack() d'une Jframe depuis un JPanel sans ref sur la JFrame
    Par cdtkoenig dans le forum Agents de placement/Fenêtres
    Réponses: 4
    Dernier message: 21/07/2008, 19h11
  3. Comment paramétrer les cardinalités des associations UML
    Par khaldoune_inf dans le forum Diagrammes de Classes
    Réponses: 4
    Dernier message: 14/05/2008, 14h46
  4. Réponses: 5
    Dernier message: 26/12/2007, 12h51

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