|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||||||||||
|
Membre confirmé
![]() |
Bonjour a tous,
J'ai du faire face a un problème en prod ce matin. Un traitement qui prend normalement 6 minutes maximum tourne en plus de 7 heures! J'ai identifié les 2 requêtes coupables. En voici une: Code :
Code :
Code :
La dernière fois que ce traitement a tourne c'est l'année dernière a peut près a la même période. Entre temps, nous avons migre de la 9i a 11g 11.1.0.7. J'ai vérifié les stats, les segments,... RAS. Rien d'apparent via ADDM et ASH. J'ai juste une recommandation pour créer un index sur RULE_TCAL colonnes SPID et MCID. Mais ca n'explique pas plus d'une heure d'exécution pour rien alors que la table RULE_TCAL est vide. Je me suis dit que je vais filtrer le résultat de la main clause where avec RULE_TCAL pour au moins avoir une réponse rapide dans le cas ou RULE_TCAL est vide. Voici la requête modifiée. Code :
Maintenant si je remplie RULE_TCAL (env 110000 lignes) voici le plan d'exécution: Code :
Voici la trace via tkprof: Code :
J'ai résolut notre problème mais je n'arrive pas a parfaitement décrire et expliquer la cause. Cela ne me saute pas aux yeux! Je me demande même si ceci n'est pas limite un bug de l'optimiseur. Avez vous un avis? Un grand merci a vous jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
||||||||||||
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Bonjour,
Sans avoir creusé dans les détails, je pense que le problème du premier plan d'exécution est le MERGE JOIN CARTESIAN. Il faudrait comprendre pourquoi Oracle choisit celà. Peut-être en regardant le plan d'exécution avec prédicats. Cela raméne 58057730 lignes, alors qu'Oracle estime la cardinalité à 1 ... donc il choisit un nested loop mais se retrouve à exécuter la deuxième partie 58 millions de fois. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
00
|
|
|
#3 | ||
|
Membre confirmé
![]() |
Hello,
Merci pour ton message! Je me sentais bien seul Tu as raison sur le merge et je l'avais vu. Mais ce que je ne comprends pas c'est que l'optimiseur fait un merge entre une table de la sous requete (COMPANY_REF) et une des tables de la main clause from (SOURCING_RATIO). Code :
C'est troublant non? Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
||
|
00
|
|
|
#4 |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Bonjour,
Pour déterminer ce qui va pousser l'optimiseur à choisir un plan ou un autre il faut regarder la trace 10053. Vous dites que la requête à un comportement retourne un nombre de lignes différent en fonction du contenu de la table RULE_TCAL. Les statistiques sur cette table sont-elles à jour à chaque exécution de la requête ? |
|
00
|
|
|
#5 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
Sinon, faudrait connaitre le plan d'exécution avant le souci aussi et voir si la dérive ne coïnciderait pas avec un calcul des stats. |
|
|
|
00
|
|
|
#6 | |
|
Membre confirmé
![]() |
Citation:
Les stats on ete collectées avec la trace 10053. La table RULE_TCAL est une table temporaire. Il n'y a pas de stats dessus et donc Oracle fait un dynamic sampling au moment de l'exécution.
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
|
00
|
|
|
#7 | |
|
Membre confirmé
![]() |
Citation:
Jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
|
00
|
|
|
#8 |
|
Membre confirmé
![]() |
Ok,
Voici ce qu'il me semble est la conclusion de tout ca: Les 2 tables partitionnées SOURCING_RATIO et RULE_SPLIT_PCT sont, au début du traitement vides. Elles sont l'output final du process. Les partitions sont crées au moment de la création du "Data business period" et la partition key est le DVID de la période. Donc au début du traitement, le système commence par calculer les stats de toutes les tables qui interviennent dans le traitement. Ces deux tables sont évaluées et révèlent 0 rows au niveau des stats. Tout ca est normal. Ensuite, plus loin dans le process ces tables sont remplies et sont utilises par la suite pour faire un insert as select dans une table résultat. C'est cette requête qui part dans les choux! Car les données dans la table ne reflètent pas les stats. Pour valider ca, je viens de recalculer les stats de ces 2 tables avec les donnes après traitement et la requête de base fonctionne très bien. C'est donc la logique du process qui est a modifier. Peut-être supprimer les stats sur ces deux tables au début du process pour forcer un dynamic sampling... Une autre idée? Merci a vous jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
00
|
|
|
#9 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Et le TRUNCATE ?
|
|
|
00
|
|
|
#10 | |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
Citation:
|
|
|
|
00
|
|
|
#11 | |
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Citation:
Dans le premier exemple : Code :
TABLE ACCESS FULL RULE_TCAL (cr=308 pr=0 pw=0 time=0 us cost=145 size=2364284 card=90934) Code :
TABLE ACCESS FULL RULE_TCAL (cr=306 pr=0 pw=0 time=0 us cost=145 size=2814760 card=108260) |
|
|
00
|
|
|
#12 | ||
|
Membre confirmé
![]() |
Hello,
Voici la requête originale avec les stats a jour. Code :
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
||
|
00
|
|
|
#13 | ||
|
Membre chevronné
![]() O. JolySupport Inscription : décembre 2010 Messages : 287 ![]() |
Je pense que que CBO n'arrive pas à faire son "query unnesting" correctement :
est il possible de réécrire la "main clause from" comme ceci : Code :
|
||
|
00
|
|
|
#14 |
|
Membre éclairé
![]() Inscription : novembre 2002 Messages : 532 ![]() |
Attention, sur la release 11g nous avons constaté pour notre part un sampling level 7 !!! pour toutes les tables dés lors qu'une table ne comportait pas de stats
donc même pour les tables de travail, il te faut collecter des statistiques de notre côté nous les avons locké une fois celles-ci assez représentatives attention également à ta release, il existe des bugs référencés sur Metalink et l'estimation de la cardinalité réalisée par l'optimizer et les index partitionnés patchet set : 11.2.0.2
__________________
PpPool |
|
|
00
|
|
|
#15 |
|
Membre confirmé
![]() |
Hello,
J'avais essayé mais l'incohérence des stats produisait le même effet. Ce qui est navrant c'est que la solution trouvée dans l'urgence biaise juste l'optimiseur et l'oblige a revoir son plan que les stats en présence lui suggère. L'équipe du change management est déjà en train de préparer le patch... Personnellement, dans tous les traitements ou des tables partitionnées sont utilisées de la sorte j'ajouterai un step pour supprimer les stats des partitions et ainsi, activer le dynamic sampling. Je peux aussi proposer l'utilisation de SQL plan management . Pour info nous somme en: 11.1.0.7 Voila je pense que j'ai toutes les explications a mon problème. Je clouterai ce post ce soir. Merci pour vos conseils. jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
00
|
|
|
#16 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 703 ![]() |
Citation:
Autres solutions (mais pas meilleures...): - forcer la cardinalité avec le hint opt_estimate - forcer le dynamic samplig avec hint Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#17 |
|
Membre confirmé
![]() Ahmed AANGOURDBA Etudes Oracle Inscription : janvier 2010 Messages : 123 ![]() |
Attention au dynamic sampling sur des tables de travail. Si ces tables à force d'inserts et de deletes massifs se retrouvent fragmentées le Dynamic Sampling risque de ne sampler que des blocks vides et estimer que la cardinalité retournée sera zéro (ajusté à 1).
Est-ce que le DS est appliqué à la table SOURCING_RATIO ? Si vous êtes face à ce pb, les solutions sont: - shrinker la table - sinon augmenter le level du DS pour sampler un plus grand nombre de blocks.
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/ |
|
00
|
|
|
#18 | |
|
Membre confirmé
![]() |
Citation:
Par contre pour une partition comme SOURCING_RATIO il peut se poser. Dans ce cas: - truncate partition - delete stats Merci a vous jko
__________________
OCA-OCP 11g, SQL and Performance & Tuning Expert 11g Data Guard 11g, ASM & Grid Control 11g, Apex |
|
|
00
|
|
|
#19 |
|
Membre confirmé
![]() Ahmed AANGOURDBA Etudes Oracle Inscription : janvier 2010 Messages : 123 ![]() |
Bien sûr je parlais des tables de travail qui ne sont pas des Global Temporary Tables
__________________
Mon blog Oracle: http://ahmedaangour.blogspot.com/ |
|
00
|
Copyright © 2000-2012 - www.developpez.com