Bonjour,
j'ai actuellement un problème de consommation énorme sur une table dù à un problème de type de bind variable.
Pour faire simple, une table de 8 000 000 de lignes avec entre autre 2 colonnes:
col1 = quasiment PK
col2 = repartition non uniforme (val1= 2 000 000 rows, val2= 1 000 000 rows, ..valn= 1 row)
les 2 colonnes en VARCHAR2 sont indexées (avec des histogrammes).
Les exécutions des requête via TOAD utilisant les 2 colonnes sont normales dans tous les cas. Je pensais que vu la répartition de col2, y avait un pb de bind(pas de hard parse) mais en fait le probleme est plus grave.
En fait suivant le type de bind variable utilisée pour col2(VARCHAR2 ou CHAR), le plan est completement different. Vous allez me dire normal car en regardant dans v$SQL_SHARED_CURSOR on sait pourquoi la requete a ete reparsee. Je vois bien bien qu'il s'agit un problème de type et que la requête utilise du char(30) au lieu de VARCHAR2.
OK cependant la requête provient de Forms: le type dans FORMS est du CHAR type générique qui englobe CHAR et VARCHAR2. Donc je ne vois pas de solution pour le faire changer de type depuis Forms.
même avec des traces en 10053, lorsque c'est du CHAR utilisé, on voit l'optimizer estime à UNE ligne la recherche dans l'index de col2. Ce cout est donc toujours le plus faible et c'est cet index qui est choisi(quelque soit la valeur demandée pour la colonne): vous imaginez quand c'est la valeur ramenant 2 000 000 de lignes.
Les explications sont un peu longues mais je suis désarmé face à ce problème.
Pourquoi l'optimizer calcule toujours faux avec du CHAR?
Est ce un problème de stat/histo, un paramètre de Forms(je doute), une presence extra-terrestre dans ma base...
A l'aide svp
Merci
Partager