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 :

Bind variables et plan d'execution


Sujet :

Oracle

  1. #1
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut Bind variables et plan d'execution
    Bonjour

    J'ai une requête toute simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT ID FROM MATABLE WHERE ID > xxx AND MACOL = yyy
    ID est la PK de cette table.

    Dans la plus part des cas, xxx est très prêt de la valeur max de la PK mais dans certain cas il vaut 0 et dans ce cas yyy correspond à une valeur qui n'existe pas dans MACOL (qui est indéxée).

    Tout cela pour dire que dans un cas le plan optimal passe par la PK et dans l'autre par l'index sur MACOL. Or comme xxx et yyy sont des binds variables Oracle ne calcule le plan d'exécution qu'une seule fois. Et donc il se plante régulièrement.

    Ma question est comment faire pour forcer Oracle a recalculer le plan a chaque exécution de la requête (Je suis en 8i, mais je suis aussi intéressé par des solutions dans les versions supérieures).

    La seule solution que j'ai trouvé mais je trouve cela assez lourd. C'est de faire un REF_CURSOR pour passer en "dur" (par concaténation) xxx et yyy et utiliser le HINT CURSOR_SHARING_EXACT.

    Je trouve tout ca un peu lourd.... Vous avez d'autres idées ?

  2. #2
    Expert éminent sénior
    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
    Points : 19 075
    Points
    19 075
    Par défaut
    le plus simple c'est peut-être de mettre un hint.

    Changer le paramètre qui influe sur toute la base uniquement pour cette requête ça me parait un peu exagéré... sinon essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID FROM MATABLE WHERE ID > (xxx + 0) AND MACOL = (yyy || '')

  3. #3
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Non, non on ne s'est pas bien compris

    Je suis en CURSOR_SHARING = FORCE ou SIMILAR suivant les versions

    Et je veux mettre le Hint CURSOR_SHARING_EXACT juste pour cette requete et surtout ne pas changer mon paramétrage de base.

    Sinon je comprends pas bien ta solution. En faisant ce que tu me dis je ne vais pouvoir utiliser AUCUN index ?

    Moi, je veux en utiliser un dans un cas et autre dans l'autre

  4. #4
    Expert éminent sénior
    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
    Points : 19 075
    Points
    19 075
    Par défaut
    Citation Envoyé par Wurlitzer
    Et je veux mettre le Hint CURSOR_SHARING_EXACT juste pour cette requete et surtout ne pas changer mon paramétrage de base.
    ha oui OK

    Citation Envoyé par Wurlitzer
    Sinon je comprends pas bien ta solution. En faisant ce que tu me dis je ne vais pouvoir utiliser AUCUN index ?
    Non, tu appliques une opération sur la bind variable donc tu devrais parser à chaque fois... tu peux utiliser les indexes parce que l'opération n'est pas sur la colonne indexée

  5. #5
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par Wurlitzer
    Je suis en CURSOR_SHARING = FORCE ou SIMILAR suivant les versions
    En 8i, ce patramètre a posé d'énormes problèmes. Ce devrait être corrigé dans les versions suivantes, mais en 8i, ce paramètrage est source de beaucoup trop d'erreurs. Y-a-t'il vraiment une raison pour l'utilisation de celui-ci ?

    Nicolas.

  6. #6
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    Citation Envoyé par Fred_D
    Non, tu appliques une opération sur la bind variable donc tu devrais parser à chaque fois... tu peux utiliser les indexes parce que l'opération n'est pas sur la colonne indexée
    J'avais lu trop vite. Ca me plait bien. Je test cela et je vous dis si ca marche.

    Citation Envoyé par NGasparotto
    En 8i, ce patramètre a posé d'énormes problèmes. Ce devrait être corrigé dans les versions suivantes, mais en 8i, ce paramètrage est source de beaucoup trop d'erreurs. Y-a-t'il vraiment une raison pour l'utilisation de celui-ci ?
    Pour l'instant on a pas de soucis avec ce parametre et comme on a beaucoup de client codé en VB de manière un peu brutal (ordre sql concaténé dans une chaine) ca évite pas mal de parsing

  7. #7
    Membre averti Avatar de Wurlitzer
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 469
    Points : 408
    Points
    408
    Par défaut
    YESSS !! Ca marche, je passe de 48,293.0 read par exec à 1,552.5 voila une petite optimisation qui me plait

    Merci et

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

Discussions similaires

  1. Plan d'exécution avec Bind Variable
    Par tibal dans le forum Administration
    Réponses: 8
    Dernier message: 17/11/2010, 11h55
  2. Execute Immediate et bind variables
    Par wanagain35 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 16/03/2010, 14h20
  3. Réponses: 4
    Dernier message: 29/10/2009, 14h25
  4. Plan d'exécution avec un bind variable
    Par couak dans le forum Administration
    Réponses: 23
    Dernier message: 15/10/2009, 17h12
  5. [Help] bind variable et parsing
    Par slefevre01 dans le forum Oracle
    Réponses: 1
    Dernier message: 04/08/2005, 14h56

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