I. Introduction▲
Les statiques système permettent à Oracle de calibrer correctement son optimiseur par rapport aux ressources mises à disposition.
Il y a deux types de statistiques système :
- les statistiques en mode no-workload : elles sont calculées au démarrage de l'instance, et ne reflètent donc pas toujours l'état des ressources réel ;
- les staitisques en mode workload : elles ne sont pas calculées par défaut (car comment déterminer le moment où la charge de travail est représentative).
Pour un système ayant des statistiques workload renseignées, les statistiques no-workload ne sont pas usitées.
Ce sont ces dernières qu'il convient de recalculer et de fixer après chaque modification de ressources pouvant les impacter, par exemple :
- ajout/suppression de CPU ;
- changement de type de CPU ;
- ajout/suppression de mémoire ;
- changement de type d'unité de stockage ;
- etc.
II. Mise en place▲
II-A. Table d'historique▲
Afin de ne pas impacter les statistiques actuelles avec les nouvelles collectées, il convient de ramasser les statistiques dans une table autre que celle par défaut. Dans cet exemple, je pars du principe qu'un schéma spécifique DBA est mis à notre disposition, ceci afin d'éviter de surcharger les schémas spécifiques à Oracle. Il va sans dire que vous pouvez créer cette table où bon vous semble.
exec
dbms_stats.create_stat_table(
ownname =>
'DBA'
, stattab =>
'SYSTEME_STATS'
)
;
II-B. Job▲
Création du job qui, chaque heure, calcule des nouvelles statistiques en workload. Là aussi, l'intervalle de temps dépend de la réalité de vos systèmes de production.
declare
vStatId varchar2
(
30
)
;
begin
select
'S'
||
to_char
(
sysdate
,'yyyymmddhh24miss'
)
into
vStatId from
dual
;
dbms_stats.gather_system_stats(
'start'
, null
, 'SYSTEME_STATS'
, vStatId, 'DBA'
)
;
dbms_lock.sleep
(
900
)
;
dbms_stats.gather_system_stats(
'stop'
, null
, 'SYSTEME_STATS'
, vStatId, 'DBA'
)
;
end
;
/
III. Récupération des données▲
Les données sont extraites via les deux commandes suivantes
select
t1.c2 as
Debut, t1.c3 AS
fin, t1.n1 AS
sreadtim, t1.n2 AS
mreadtim,
t1.n3 AS
cpuspeed, t1.n11 AS
mbrc , t2.n1 AS
maxthr, t2.n2 AS
slavethr
from
DBA
.SYSTEME_STATS T1
inner
join
DBA
.SYSTEME_STATS T2 on
t1.statid=
t2.statid
where
t1.c4=
'CPU_SERIO'
and
t2.c4=
'PARIO'
and
t1.c1 =
'COMPLETED'
order
by
debut ;
IV. Modifier et fixer la valeur des paramètres▲
Le package DBMS_STATS.SET_SYSTEM_STATS permet de spécifier les valeurs choisies.
exec
DBMS_STATS.SET_SYSTEM_STATS(
'slavethr'
,36854
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'cpuspeednw'
,6
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'mbrc'
,30
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'sreadtim'
,3
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'mreadtim'
,6
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'ioseektim'
,11
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'iotfrspeed'
,4096
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'cpuspeed'
,865
)
;
exec
DBMS_STATS.SET_SYSTEM_STATS(
'maxthr'
,386631682
)
;