Comment expliquer un temps CPU elevé sur des opérations de ce type (FULL SCAN) sans pour autant avoir beaucoup d'I/O ?
Si les blocs sont encore en buffer cache depuis le dernier full scan, il n'y a que des logical reads, pas d'i/o
Si les blocs ne sont plus en buffer cache, mais sont encore en filesystem cache au niveau de l'os on a des i/o mais très rapides. Donc le temps passé en i/o est négligeable apra rapport au temps passé en CPU.
Afin de vérifier le comportement de l'optimiseur et sans recalculer les stats pour l'instant , je vais "setter" un num_rows issue d'un vrai select count(*) from la table en question puis dbms_stats.set_table_stats ...votre avis ?
Ou simplement utiliser les hints CARDINALITY ou OPT_ESTIMATE pour forcer une estimation de cardinalité. Ou DYNAMIC_SAMPLING_EST_CDN pour forçer le dynamic sampling.
Comment vérifier si un index est sélectif ou pas sur un plan ?
En regardant Actual Rows. Dans le fichier attaché, premier plan, on voit un INDEX RANGE SCAN qui ramène 429 million de lignes, puis en allant voir la table pour chacune d'elle, on en élimine encore pour n'avoir que 31 million de lignes. L'index aurait pu être plus selectif en rajoutant les colonnes qui on filtré sur le TABLE ACCESS
Existe-t-il une subtilité concernant les INDEX RANGE SCAN ?
Comment expliquer un % Wait Activity élevé dans une opération INDEX RANGE SCAN ou INDEX UNIQUE SCAN (comme dans le premier plan du fichier joint).
Le problème c'est qu'on fait le range scan 593000 fois, pour chaque ligne de TIERS semble-t-il.
Enfin comment diminuer les I/O ? forcer des objets à être en cache ? comment ? risques et contraintes ?
Non ! Le cache sert à garder les blocs accédés souvent. La première question à se poser, c'est pourquoi on passe son temps à aller voir toujours les mêmes blocs.
Attention, les screenshots que tu as mis montrent quelle opération passe le plus de temps en CPU et quelle opération passe le plus de temps en I/O. On ne voit pas si le temps total (DB time) est surtout composé de temps CPU ou temps I/O. Il faut regarder au dessus en face de DB Time.
Partager