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 15/09/2011, 12h58   #1
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 951
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : juillet 2008
Messages : 951
Points : 1 470
Points : 1 470
Par défaut Question de stats

Hello,

J'ai un souci avec le calcul des stats sur Oracle, en version 9i et 11g.
Que ce soit avec un ANALYZE TABLE ou un DBMS_STATS.GATHER_TABLE_STATS, que ce soit en estimate ou en compute Oracle ne choisit pas le bon chemin, et je dois forcer via un hint le passage ou non par un index.
En regardant de plus près les cardinalités estimées sont fausses, ce qui explique le chemin choisi. Mais bon, les requêtes ne sont pas si compliquées, je m'étonne du résultat. Et puis je n'aime pas forcer via un hint; d'un environnement à un autre la situation pourrait être différente.
Aussi y a t-il d'autres méthodes pour "améliorer" les stats et le choix de l'optimiseur ?

ps : J'avoue utiliser la syntaxe basique ( et peu de paramètres ) lors du calcul
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 14h04   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Donnez nous plus des informations: requête, indexes, volumétrie, cardinalités estimés et réelles, paramètrage d'optimiseur, temps de réponses, ...
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 15h45   #3
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 951
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : juillet 2008
Messages : 951
Points : 1 470
Points : 1 470
Par exemple sur une requête ...

Ci joint les explain plan "anonymisés" ko ( choisi par Oracle ) et ok ( avec un hint FULL ).
La requête renvoie 121716 lignes.
Le hint évite de passer par un index - car d'après ce que je comprends Oracle s'attend en fait à n'avoir qu'environ 2000 lignes ... c'est ça ?
Images attachées
Type de fichier : gif explain_plan_ko.GIF (8,3 Ko, 11 affichages)
Type de fichier : gif explain_plan_ok.GIF (8,0 Ko, 9 affichages)
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h19   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Je ne vois pas d’accès via index. Je vois que du FULL. De plus je vois qu’il s’agit d’une requête distribué et que la différence entre les deux plans est lié à la méthode de jointure: Hash Join vers Nested Loop
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 16h36   #5
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 951
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : juillet 2008
Messages : 951
Points : 1 470
Points : 1 470
Le Nested Loop se fait sur du remote dans le cas de l'explain plan ko. On ne voit pas l'index mais je m'en doute car il n'y a pas de FULL, la cardinalité est à 1 et il y a un index bien placé sur la table ( pk ).

Et j'ai oublié de dire que la requête avec le nested loop met plus de 3h, celle sans met 4'.
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 17h03   #6
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par doc malkovich Voir le message
Le Nested Loop se fait sur du remote dans le cas de l'explain plan ko. On ne voit pas l'index mais je m'en doute car il n'y a pas de FULL, la cardinalité est à 1 et il y a un index bien placé sur la table ( pk ).

Et j'ai oublié de dire que la requête avec le nested loop met plus de 3h, celle sans met 4'.
Comme l'a remarqué Marius, il y a un accès remote (dblink) et il y a aussi des tables partitionnées. Je remarque aussi que les deux explains plans montrent une cardinalité différente du nombre d'enregistrements que la requête est sensés retourné : 121716 lignes.

Savez-vous aussi qu’un explain plan amputé de sa partie ‘’Predicate’’ est un explain plan incomplet car ladite partie comprend des informations parfois cruciales (comme les conversions implicites qui empêchent l’utilisation des indexes). Ceci dit, pourquoi vous n’utilisez pas

Code :
1
2
 
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST')) ;
Ceci vous montrera les estimations que le CBO est en train de faire par rapport au résultat final (E-Rows versus A-Rows) et donc éventuellement un problème de statistiques. Regardez aussi combien vaut la valeur du paramètre suivant
Code :
1
2
 
SHOW PARAMETER OPTIMIZER_INDEX_COST_ADJ
Car ceci peut avoir une influence sur le choix de l’index. La valeur par défaut est 100. Une valeur au-delà favorise les fulls table scan au lieu et place des accès via index. Pensez aussi, au cas où vous n’avez pas trouvé de solution, au hint /*+ driving_site */ mais uniquement si vous faite des selects.
__________________
Bien Cordialement
www.hourim.wordpress.com
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 17h45   #7
Modérateur
 
Avatar de doc malkovich
 
Homme
Consultant en Business Intelligence
Inscription : juillet 2008
Messages : 951
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : juillet 2008
Messages : 951
Points : 1 470
Points : 1 470
Merci de votre réponse.

Hélas ici je n'ai pas tous les droits, le
Code :
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST')) ;
nécessite l'accès à V$_SESSION.

Bizarrement même le
Citation:
SHOW PARAMETER OPTIMIZER_INDEX_COST_ADJ
ne marche pas.
__________________
Avez-vous 60 secondes pour répondre aux sondages sur BO ici et ?
doc malkovich est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 09h50   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Pour le parameter ça peut être contourné
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
SQL> SHOW parameter optimizer
ORA-00942: TABLE ou vue inexistante
 
 
SQL> variable r number
variable intval number
variable strval varchar2(30)
Begin
  :r := dbms_utility.get_parameter_value('OPTIMIZER_INDEX_COST_ADJ', :intval, :strval);
End;
/SQL> SQL> SQL>   2    3    4
 
Procédure PL/SQL terminée avec succès.
 
SQL> print intval
 
    INTVAL
----------
       100
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/09/2011, 10h12   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 813
Points : 5 813
Il y a une différence importante dans les cardinalités sur la deuxième table accensée en REMOTE: 1 vers 167070. Si vous trouvez la réponse à la question que est-ce qu'il explique cette différence, vous avez la solution à votre problème.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 11h14   #10
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par doc malkovich Voir le message
Merci de votre réponse.

Hélas ici je n'ai pas tous les droits, le
Code :
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST')) ;
nécessite l'accès à V$_SESSION.
Pour pouvoir executer le package dbms_xplan.display_cursor() il faut avoir des droits d'accès aux vues dynamiques suivantes:
  1. v$session
  2. v$sql
  3. v$sql_plan
  4. v$sql_plan_statistics_all
__________________
Bien Cordialement
www.hourim.wordpress.com
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web