Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/02/2007, 11h14   #1
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
Par défaut Bind variables et plan d'execution

Bonjour

J'ai une requête toute simple.

Code :
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 ?
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 11h20   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 :
SELECT ID FROM MATABLE WHERE ID > (xxx + 0) AND MACOL = (yyy || '')
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 11h26   #3
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
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
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 11h36   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 11h44   #5
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
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.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 12h28   #6
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
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
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 14h04   #7
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
YESSS !! Ca marche, je passe de 48,293.0 read par exec à 1,552.5 voila une petite optimisation qui me plait

Merci et
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h35.


 
 
 
 
Partenaires

Hébergement Web