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 :

Quand change le plan d'execution?


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut Quand change le plan d'execution?
    Bonjour,

    je vous présente les données de ma question:
    une table toute bête avec par exemple 2 colonnes: col1 et col2
    la table comporte x rows et pour 1% des lignes col1 = Y
    et 99% des lignes col1 = N
    on met un index classique, donc dans notre cas de mauvaise sélectivité, sur col1.
    Et on requête avec une clause where sur col1 avec une variable liée(col1=:var)
    Vous m'arrêtez si je dis des bêtises mais dans ces conditions l'optimizer va sûrement préférer un full plutôt que prendre l'index (pour :var =Y ou N). Donc lorsque :var=Y on peut difficilement avoir un plan plus merdique.

    Maintenant On rajoute un histogramme sur col1, tout à fait indiqué dans mon cas.
    En admettant que la requete soit en memoire et que son plan actuel soit un full scan, si je fais ma query col1=:var avec :var=Y
    QUE VA T'IL SE PASSER?
    Le sql va t'il etre reparsé? le plan va t'il changé? si le sql n'est jamais dechargé de la memoire, le plan du full sera toujours choisit?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    oui, ça va changer parce que les stats sont recalculées

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Bonjour,

    ok donc maintenant je suis avec un plan d'exécution avec un index.
    Si rien ne change par ailleurs(requête toujours en shared pool, pas de recalcul de stat,..),
    Est ce que je peux me retrouver avec un full scan suivant la valeur de la bind variable?

    Merci

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    oui puisque tu as calculer les histogrammes. Si tu as un index déséquilibré il n'est pas impossible de faire un FULL SCAN. Mais attention, un FTS n'est pas forcément mauvais. Si une valeur retourne 90% (chiffre pris arbitrairement ) des données de la table, l'accés par index pourra être plus couteux.

  5. #5
    Membre expérimenté Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Par défaut
    J'ai testé ça (10.1.0.4):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    create table tb (col1 number, col2 char (1));
     
    delete from tb;
    insert into tb (col1, col2)
      select level, decode (mod (level, 100), 1, 'Y', 'N')
        from dual
        connect by level <= 5000000;
    commit;
     
    create index tbii on tb (col2);
     
    exec dbms_stats.gather_table_stats ('TEST', 'TB')
     
    variable c char (1)
    exec :c := 'N'
    select count (1) c
      from tb where col2 = :c;
     
    variable c char (1)
    exec :c := 'Y'
    select count (1) c
      from tb where col2 = :c;
    Oracle choisit bon chemin (FTS ou index) d'après le premier ordre, mais ne la change pour une autre valeur.

    DAB

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Par défaut
    Merci dab.cz,

    c'est un peu là où je voulais en arriver.
    A part de réécrire le sql sans bind variable, y a un gros problème.

    De plus je n'ai rien trouvé pour forcer une requête à être reparsée ou déchargée de la mémoire.

    Vous faites comment vous?

    Merci

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

Discussions similaires

  1. Bind variables et plan d'execution
    Par Wurlitzer dans le forum Oracle
    Réponses: 6
    Dernier message: 26/02/2007, 14h04
  2. [Oracle 10.2] Plan d'execution fonction PL/SQL
    Par pegase06 dans le forum PL/SQL
    Réponses: 6
    Dernier message: 13/02/2007, 12h02
  3. Plans d'execution differents
    Par jajaCode dans le forum Oracle
    Réponses: 13
    Dernier message: 14/12/2006, 12h29
  4. Réponses: 4
    Dernier message: 12/07/2006, 18h39
  5. plan d'execution
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/03/2006, 10h40

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