DB2 for Z/OS : analyser le besoin de réorganisation
par
, 29/11/2023 à 11h03 (530 Affichages)
Voici une requête qui permet de vérifier le cluster ratio des index cluster sur DB2 for Z/OS, et donc, le besoin éventuel d'exécuter des réorgs.
Les noms d'objets sont restitués sur 8 caractères, car c'est la longueur maximale la plus souvent utilisée dans le monde Z/OS pour des raisons historiques, à adapter si besoin.
Si le cluster ratio est fortement dégradé, il faut peut-être augmenter la fréquence des réorgs ou augmenter la valeur du paramètre PCTFREE pour les tables à insertion fréquente et volumineuse.
Peut-être également qu'un événement inhabituel a fortement chargé les TS concernés, auquel cas une surveillance particulière aurait due être mise en place.
Sur Z/OS, l'essentiel des requêtes est livré dans des packages, il faut donc penser à exécuter les statistiques si elles n'ont pas été activées lors des réorgs, puis à faire un REBIND des packages pour qu'ils reconsidèrent leur chemin d'accès.
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 -- Cette requete analyse la désorganisation des tablespaces en vérifiant le -- cluster ratio des index cluster et restitue le nombre de MàJ depuis la -- dernière réorg -- Le ratio est bon si >= 95% -- Paramêtres à modifier en fonction du besoin : -- TB.CREATOR et TB.NAME dans le WHERE set current schema = 'SYSIBM' ; -- analyse du cluster ratio des index cluster (besoin de réorg ?) select substr(TB.CREATOR, 01, 08) as SCHEMA , substr(TB.NAME, 01, 08) as TABLE , substr(IX.NAME, 01, 10) as INDEX , IX.UNIQUERULE as UNIQ , IX.CLUSTERING as CLSG , IX.CLUSTERED as CLSD , IX.CLUSTERRATIO as RATIO , TB.CARDF as CARDF , TB.NPAGESF as NPAGESF , subq.RGDAT as REOGDATE , subq.RGISR as REORGISR , subq.RGDEL as REORGDEL , subq.RGUPD as REORGUPD from SYSTABLES as TB -- table des tables inner join SYSTABLESPACE as TS -- table des tablespaces on TS.DBID = TB.DBID and TS.NAME = TB.TSNAME inner join SYSINDEXES as IX -- table des index on IX.TBCREATOR = TB.CREATOR and IX.TBNAME = TB.NAME left join -- nombre d'insert/delete/update depuis la dernière réorg (select DBID , PSID , date(REORGLASTTIME) as RGDAT -- les 3 cols sont "nullables" d'où COALESCE + CAST , sum(cast(coalesce(REORGINSERTS, 0) as bigint)) as RGISR , sum(cast(coalesce(REORGDELETES, 0) as bigint)) as RGDEL , sum(cast(coalesce(REORGUPDATES, 0) as bigint)) as RGUPD from SYSTABLESPACESTATS -- table des RTS (Real Time Statistics) group by DBID , PSID , DATE(REORGLASTTIME) ) subq on subq.DBID = TB.DBID and subq.PSID = TS.PSID where IX.CLUSTERING = 'Y' -- index cluster and IX.CLUSTERED = 'N' -- mal organisé and TB.TYPE = 'T' -- type table and (TB.CARDF = -1 or TB.CARDF >0) -- sauf tables vides -- modifier les schemas et préfixes de tables ci-dessous and TB.CREATOR in ('SCH1', 'SCH2') and TB.NAME like 'TR%' order by TB.NAME , TB.CREATOR
Et une autre approche donnant le détail par partition (merci à Bernard59139)
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 set CURRENT PRECISION = 'D31.2' ; select substr(RTS.DBNAME, 01, 08) as "DataBase" , substr(RTS.NAME, 01, 08) as "Table Space" , TP.PARTITION as "Part" , TS.TYPE as "Type" , cast (RTS.REORGINSERTS/dec(RTS.TOTALROWS)*100 as dec(5,2)) as "RTSIsr%" , cast (RTS.REORGDELETES/dec(RTS.TOTALROWS)*100 as dec(5,2)) as "RTSDel%" , cast (RTS.REORGUNCLUSTINS/dec(RTS.TOTALROWS)*100 as dec(5,2)) as "UnClus%" , cast ( (RTS.REORGNEARINDREF+RTS.REORGFARINDREF) / dec(RTS.TOTALROWS)*100 as dec(5,2)) as "Malplace" , cast (replace(varchar_format (RTS.REORGMASSDELETE,'999,999,999,999'), ',', ' ') as char(16)) as "MassDel" , cast (replace(varchar_format (RTS.TOTALROWS,'999,999,999,999'), ',', ' ') as char(16)) as "TotalRows" , cast (replace(varchar_format (RTS.NPAGES,'999,999,999,999'), ',', ' ') as char(16)) as "Pages" , RTS.REORGLASTTIME as "Last Réorg" from SYSIBM.SYSTABLESPACESTATS as RTS inner join SYSIBM.SYSTABLESPACE as TS on TS.DBNAME = RTS.DBNAME and TS.NAME = RTS.NAME inner join SYSIBM.SYSTABLEPART as TP on TP.DBNAME = TS.DBNAME and TP.TSNAME = TS.NAME and TP.PARTITION = RTS.PARTITION where RTS.TOTALROWS > 50 and TS.DBNAME='Ma_database' order by 1, 2, 3 ;