DB2 for z/OS SQL / Explain Analyzer V2 â Analyseur SQL, access path, packages et RUNSTATS
Installer, tester et exploiter db2_zos_sql_explain_analyzer_v2.py, un utilitaire autonome qui analyse des exports DB2 for z/OS : PLAN_TABLE-like, SQL, predicates, index catalog, table statistics, packages et baseline.
Le bouton principal pointe explicitement vers /static/toolbox/db2_zos_sql_explain_analyzer_v2.py. DĂ©pose ce script dans static/toolbox/ pour lâexposer depuis IDEO-Lab.
Cet outil est conçu pour les DBA DB2, les ingĂ©nieurs performance, les Ă©quipes batch et les projets de modernisation. Il transforme plusieurs fichiers dâexport en diagnostic actionnable : tablespace scans, index faibles, predicates stage 2, RUNSTATS obsolĂštes, packages risquĂ©s, regressions access path et candidats dâindex.
Ce que le moteur analyse
| Domaine | Signaux analysés | Diagnostic produit |
|---|---|---|
| Access path | ACCESSTYPE, MATCHCOLS, METHOD, SORTN, PREFETCH, RID. | Tablespace scan, index usage faible, sort coûteux, RID pool pressure, prefetch suspect. |
| SQL statements | SELECT *, fonctions sur colonnes, LIKE '%...', OR, DML sans WHERE. | SQL non sargable, accĂšs trop large, risque de scan ou risque production. |
| Predicates | Stage 1/2, indexable, columns, operators, filter factor. | Stage 2 coûteux, predicate non indexable, colonne candidate à index. |
| Indexes | Colonnes, cardinalité, clustering ratio, nlevels, duplication, unique/non unique. | Index faible, index non aligné predicates, clustering à corriger. |
| RUNSTATS | Date stats, cardinalitĂ©, NPAGES, rows, stats obsolĂštes. | Risque access path instable ou mauvais choix dâoptimiseur. |
| Packages | Isolation, degree, validate, reopt, release, bind date, collection. | Options de bind risquées : RR/RS, DEGREE(ANY), VALIDATE(RUN), rebind nécessaire. |
Téléchargement des fichiers
Cette page fournit les liens explicites vers le script Python, les samples DB2, la policy et le pack complet. Pour IDEO-Lab, les fichiers doivent ĂȘtre dĂ©posĂ©s sous /static/toolbox/.
Script Python autonome, sans dépendance externe, à lancer sur des exports DB2 Explain / catalog / SQL.
Export PLAN_TABLE-like courant contenant access path, cost, getpages et méthode.
Export de rĂ©fĂ©rence pour dĂ©tecter les regressions dâaccess path ou de coĂ»t.
Fichier SQL brut pour détecter SELECT *, DML risqué, fonctions, LIKE et OR predicates.
Export DSN_PREDICAT_TABLE-like pour stage 2 et indexability.
Exports de catalog, RUNSTATS et bind options pour diagnostic DBA.
Script, samples, policy, outputs et rapport de démonstration.
Arborescence static recommandée
static/
toolbox/
db2_zos_sql_explain_analyzer_v2.py
db2_zos_sql_explain_analyzer_v2_pack.zip
sample_db2_v2_explain_current.csv
sample_db2_v2_explain_baseline.csv
sample_db2_v2_sql.sql
sample_db2_v2_predicates.csv
sample_db2_v2_indexes.csv
sample_db2_v2_table_stats.csv
sample_db2_v2_packages.csv
sample_db2_v2_policy.json
db2_zos_sql_explain_analyzer_v2_guide.htmlInstallation de DB2 for z/OS SQL / Explain Analyzer V2
Le script est autonome. Il suffit dâune version Python moderne et dâun ou plusieurs fichiers dâexport DB2 : Explain, SQL, predicates, indexes, stats, packages et baseline.
1. Arborescence locale recommandée
db2_explain_lab/
bin/
db2_zos_sql_explain_analyzer_v2.py
input/
sample_db2_v2_explain_current.csv
sample_db2_v2_explain_baseline.csv
sample_db2_v2_sql.sql
sample_db2_v2_predicates.csv
sample_db2_v2_indexes.csv
sample_db2_v2_table_stats.csv
sample_db2_v2_packages.csv
sample_db2_v2_policy.json
output/
reports/
csv/
json/Ce bouton pointe explicitement vers /static/toolbox/db2_zos_sql_explain_analyzer_v2.py.
2. Installation Linux / macOS
mkdir -p db2_explain_lab/bin db2_explain_lab/input db2_explain_lab/output/reports db2_explain_lab/output/csv db2_explain_lab/output/json
cp db2_zos_sql_explain_analyzer_v2.py db2_explain_lab/bin/
cp sample_db2_v2_* db2_explain_lab/input/
cd db2_explain_lab
python3 bin/db2_zos_sql_explain_analyzer_v2.py --demo3. Installation Windows PowerShell
New-Item -ItemType Directory -Force db2_explain_lab\bin, db2_explain_lab\input, db2_explain_lab\output\reports, db2_explain_lab\output\csv, db2_explain_lab\output\json
Copy-Item .\db2_zos_sql_explain_analyzer_v2.py .\db2_explain_lab\bin\
Copy-Item .\sample_db2_v2_* .\db2_explain_lab\input\
Set-Location .\db2_explain_lab
python .\bin\db2_zos_sql_explain_analyzer_v2.py --demo4. Test de validation
python bin/db2_zos_sql_explain_analyzer_v2.py input/sample_db2_v2_explain_current.csv \
--sql input/sample_db2_v2_sql.sql \
--baseline input/sample_db2_v2_explain_baseline.csv \
--predicates input/sample_db2_v2_predicates.csv \
--indexes input/sample_db2_v2_indexes.csv \
--table-stats input/sample_db2_v2_table_stats.csv \
--packages input/sample_db2_v2_packages.csv \
--policy input/sample_db2_v2_policy.json \
--profile production \
--html output/reports/sample_db2_v2_report.html \
--json output/json/sample_db2_v2_analysis.json \
--csv-findings output/csv/sample_db2_v2_findings.csvFichiers input attendus
La V2 accepte plusieurs sources complĂ©mentaires. Lâanalyse devient vraiment puissante quand on croise Explain, SQL, predicates, catalog indexes, RUNSTATS et packages.
TĂ©lĂ©charger dâabord le script Python, puis lancer lâanalyse sur les exports DB2.
1. Sources acceptées
| Source | Contenu typique | Usage |
|---|---|---|
Explain current | PLAN_TABLE-like CSV/JSON/JSONL, access type, cost, rows, getpages. | Base principale du diagnostic access path. |
Explain baseline | Ancien plan ou plan attendu. | Détection des regressions avant/aprÚs rebind ou livraison. |
SQL file | Statements SQL bruts. | Détection syntaxique : SELECT *, DML sans WHERE, fonctions, LIKE, OR. |
Predicates export | Stage, indexability, predicate text, columns, filter factor. | RepĂ©rer stage 2 et candidats dâindex. |
Index catalog | Index name, columns, clustering, cardinality, nlevels. | Comprendre pourquoi lâoptimiseur choisit ou Ă©vite un index. |
Table stats | Rows, pages, RUNSTATS date, cardinalité. | Détecter RUNSTATS obsolÚtes ou stats insuffisantes. |
Packages | Collection, package, isolation, degree, validate, reopt, bind date. | Détecter bind options risquées ou packages à rebind. |
2. Exemple minimal dâExplain CSV
queryno,stmtno,applname,collid,progname,query_cost,access_type,matchcols,method,sortn,prefetch,getpages,table_schema,table_name,index_name
1001,1,PAYROLL,COLLPAY,PAYRPT01,12500.0,R,0,0,Y,S,920000,PRODDB,PAYMENT,
1002,1,CUSTAPI,COLLAPI,CUSTAPI,820.0,I,1,0,N,L,21000,PRODDB,CUSTOMER,IX_CUSTOMER_013. Samples disponibles
Plan courant utilisé pour le scoring principal.
Plan de référence pour comparer les changements de coût et access path.
Export stage/indexability pour diagnostic avancé.
Catalogue index et clustering pour recommandations.
RUNSTATS, rows et pages pour évaluer la fraßcheur des stats.
Bind options pour détecter RR/RS, DEGREE, VALIDATE et REOPT.
--redact avant partage externe.Utilisation quotidienne
1. Mode démo intégré
python db2_zos_sql_explain_analyzer_v2.py --demo2. Analyse simple dâun fichier Explain
python db2_zos_sql_explain_analyzer_v2.py input/sample_db2_v2_explain_current.csv3. Analyse complĂšte avec tous les exports
python db2_zos_sql_explain_analyzer_v2.py input/sample_db2_v2_explain_current.csv \
--sql input/sample_db2_v2_sql.sql \
--baseline input/sample_db2_v2_explain_baseline.csv \
--predicates input/sample_db2_v2_predicates.csv \
--indexes input/sample_db2_v2_indexes.csv \
--table-stats input/sample_db2_v2_table_stats.csv \
--packages input/sample_db2_v2_packages.csv \
--policy input/sample_db2_v2_policy.json \
--profile production \
--json output/json/db2_analysis.json \
--html output/reports/db2_report.html \
--csv-findings output/csv/db2_findings.csv \
--csv-plan output/csv/db2_plan_rows.csv \
--csv-statements output/csv/db2_statements.csv \
--csv-predicates output/csv/db2_predicates.csv \
--csv-index-candidates output/csv/db2_index_candidates.csv \
--csv-compare output/csv/db2_compare.csv \
--csv-categories output/csv/db2_categories.csv \
--csv-indexes output/csv/db2_indexes.csv \
--csv-stats output/csv/db2_stats.csv \
--csv-packages output/csv/db2_packages.csv4. Mode anonymisé
python db2_zos_sql_explain_analyzer_v2.py input/production_explain.csv \
--sql input/production_sql.sql \
--redact \
--html output/reports/production_db2_redacted.html \
--json output/json/production_db2_redacted.json5. Mode batch strict
python db2_zos_sql_explain_analyzer_v2.py input/nightly_explain.csv \
--profile performance \
--html output/reports/nightly_db2_report.html \
--csv-findings output/csv/nightly_db2_findings.csv \
--fail-on ERRORParamĂštres de ligne de commande
1. ParamĂštres dâentrĂ©e et de sortie
| ParamĂštre | Description | Exemple |
|---|---|---|
input_file | Fichier Explain principal. | input/explain.csv |
--explain | Alias explicite du fichier Explain courant. | --explain input/explain.csv |
--sql | Fichier de statements SQL bruts. | --sql input/sql.sql |
--predicates | Export predicates stage/indexability. | --predicates input/predicates.csv |
--indexes | Export catalogue index. | --indexes input/indexes.csv |
--table-stats | Export table statistics / RUNSTATS. | --table-stats input/table_stats.csv |
--packages | Export package / bind options. | --packages input/packages.csv |
--baseline | Fichier Explain de référence. | --baseline input/baseline.csv |
--policy | Policy JSON pour seuils et objets sensibles. | --policy input/policy.json |
--json | Export JSON complet. | --json output/analysis.json |
--html | Rapport HTML. | --html output/report.html |
--csv-findings | Anomalies détectées. | --csv-findings output/findings.csv |
--csv-index-candidates | Candidats dâindex. | --csv-index-candidates output/index_candidates.csv |
--csv-compare | Comparaison baseline/current. | --csv-compare output/compare.csv |
2. ParamĂštres dâanalyse et de gouvernance
| ParamÚtre | Effet | Usage recommandé |
|---|---|---|
--profile | Profil : production, performance, db2, batch, api, packages, capacity, training, strict. | Ajuster la lecture métier et la priorité des catégories. |
--write-samples | GénÚre les fichiers samples dans un dossier cible. | Créer un environnement de test complet. |
--demo | Lance le moteur contre des samples générés. | Validation rapide aprÚs installation. |
--redact | Masque les noms sensibles dans les sorties. | Partage externe ou support. |
--fail-on | Retourne un code erreur Ă partir dâune sĂ©vĂ©ritĂ© donnĂ©e. | --fail-on ERROR en contrĂŽle batch, --fail-on CRITICAL en audit moins strict. |
3. Exemple profil packages
python db2_zos_sql_explain_analyzer_v2.py input/package_explain.csv \
--packages input/packages.csv \
--profile packages \
--html output/reports/packages_report.html \
--csv-findings output/csv/packages_findings.csvExemples dâutilisation
ScĂ©nario 1 â Audit dâun plan avant mise en production
Cas DevOps/DBA : contrĂŽler un nouveau plan dâaccĂšs avant livraison applicative.
python db2_zos_sql_explain_analyzer_v2.py input/release_explain.csv \
--sql input/release_sql.sql \
--profile production \
--html output/reports/release_db2_report.html \
--csv-findings output/csv/release_db2_findings.csv \
--fail-on ERRORScĂ©nario 2 â RĂ©gression access path aprĂšs rebind
Cas critique : comparer un Explain avant/aprÚs rebind ou livraison pour détecter une dégradation.
python db2_zos_sql_explain_analyzer_v2.py input/current_explain.csv \
--baseline input/baseline_explain.csv \
--profile performance \
--html output/reports/access_path_regression.html \
--csv-compare output/csv/access_path_compare.csvScĂ©nario 3 â Analyse RUNSTATS et catalog index
Cas DBA : vĂ©rifier si un mauvais access path vient de stats obsolĂštes ou dâindex inadaptĂ©s.
python db2_zos_sql_explain_analyzer_v2.py input/explain.csv \
--indexes input/indexes.csv \
--table-stats input/table_stats.csv \
--predicates input/predicates.csv \
--profile db2 \
--html output/reports/db2_catalog_diagnostic.html \
--csv-index-candidates output/csv/db2_index_candidates.csvScĂ©nario 4 â Analyse des packages et options de bind
Cas production : repĂ©rer les options dâisolation, degree, validate ou reopt qui exposent Ă des comportements coĂ»teux.
python db2_zos_sql_explain_analyzer_v2.py input/explain.csv \
--packages input/packages.csv \
--profile packages \
--html output/reports/package_audit.html \
--csv-packages output/csv/packages_out.csvScĂ©nario 5 â ContrĂŽle nocturne automatisĂ©
0 5 * * * /opt/db2-explain/bin/python /opt/db2-explain/db2_zos_sql_explain_analyzer_v2.py \
/data/db2/nightly_explain.csv \
--sql /data/db2/nightly_sql.sql \
--baseline /data/db2/baseline_explain.csv \
--indexes /data/db2/indexes.csv \
--table-stats /data/db2/table_stats.csv \
--packages /data/db2/packages.csv \
--profile production \
--html /var/www/reports/db2/nightly_explain_report.html \
--csv-findings /var/log/db2/nightly_findings.csv \
--json /var/log/db2/nightly_analysis.json \
--fail-on ERROR >> /var/log/db2/db2_explain_analyzer.log 2>&1RĂšgles DB2, scoring et diagnostic
La V2 applique une logique de scoring par catĂ©gories. Le but nâest pas de remplacer un DBA DB2, mais de trier vite les risques et de faire Ă©merger les points Ă vĂ©rifier en prioritĂ©.
1. Catégories de risques
| Catégorie | Signaux typiques | Lecture DBA |
|---|---|---|
| Access path | Tablespace scan, index scan faible, MATCHCOLS=0, nested loop coĂ»teux. | Le plan choisi risque de consommer trop dâI/O ou de CPU. |
| Predicates | Stage 2, non-indexable, functions on indexed columns, leading wildcard. | Les predicates ne filtrent pas assez tĂŽt ou ne peuvent pas utiliser lâindex. |
| Sort / workfile | Sort obligatoire, sort gros volume, manque dâindex order compatible. | Risque de workfile pressure et temps elapsed Ă©levĂ©. |
| RUNSTATS | Stats absentes, obsolĂštes, cardinalitĂ© incohĂ©rente. | Lâoptimiseur peut prendre une mauvaise dĂ©cision. |
| Packages | RR/RS, DEGREE(ANY), VALIDATE(RUN), bind ancien. | Risque de lock, parallélisme non désiré, ou erreur runtime. |
| Regression | Cost, rows, getpages, elapsed ou access path dégradés vs baseline. | Plan potentiellement dangereux avant production. |
2. Exemple de candidats dâindex
table_schema,table_name,columns,reason,confidence
PRODDB,PAYMENT,CUSTOMER_ID,PAY_DATE,Stage 2 predicate and high getpages,HIGH
PRODDB,CUSTOMER,STATUS,LAST_UPDATE,Frequent predicate and low matchcols,MEDIUM3. Bon rĂ©flexe dâanalyse
- Ne jamais conclure sur
COSTseul : croiser avecGETPAGES, rows, predicates et access type. - VĂ©rifier dâabord les tablespace scans sur tables volumineuses.
- Sur index existant mais
MATCHCOLS=0, vĂ©rifier lâordre des colonnes et les predicates rĂ©ellement indexables. - Quand un plan change, comparer baseline/current avant de valider le rebind.
- Une recommandation dâindex doit toujours ĂȘtre validĂ©e avec volumĂ©trie, frĂ©quence SQL, coĂ»t DML et politique DBA.
Exports et exploitation des résultats
Vue lisible : score, catégories, findings, access path, candidates, baseline compare et recommandations.
Format complet pour API, ingestion SQL, archivage ou comparaison automatique.
Une ligne par anomalie DB2, avec sévérité, catégorie et explication.
Plan rows normalisés pour tri Excel, SQL ou dashboard.
HypothĂšses dâindex avec raisons et niveau de confiance.
Diff baseline/current pour détecter régressions de plan.
Exemple de synthĂšse console
DB2 for z/OS SQL / Explain Analyzer V2
Status : BLOCKED
Highest severity : CRITICAL
Risk score : 100/100
Explain rows : 12
SQL statements : 7
Predicates : 12
Indexes : 9
Table stats : 10
Packages : 5
Findings : 174
Index candidates : 5
Baseline compare : 23Idée de table SQL pour historisation
CREATE TABLE db2_explain_analyzer_run (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
source_name VARCHAR(255),
profile VARCHAR(32),
status VARCHAR(32),
highest_severity VARCHAR(16),
risk_score INTEGER,
explain_row_count INTEGER,
statement_count INTEGER,
finding_count INTEGER,
index_candidate_count INTEGER,
baseline_regression_count INTEGER,
report_path VARCHAR(500),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);Dépannage et bonnes pratiques
1. Le script ne détecte aucun plan
| Cause possible | Correction |
|---|---|
| Le CSV nâa pas dâen-tĂȘtes reconnus. | VĂ©rifier les noms de colonnes ou normaliser lâexport en PLAN_TABLE-like. |
| Le fichier Explain est vide ou filtré trop fortement. | Exporter tous les rows utiles pour le queryno/stmtno analysé. |
| Les types numériques sont exportés avec un format incompatible. | Utiliser point décimal et colonnes non formatées. |
| Le fichier SQL ne correspond pas aux queryno Explain. | Vérifier le mapping SQL / Explain / package / statement. |
2. Trop de findings remontées
En environnement rĂ©el, beaucoup de signaux peuvent ĂȘtre lĂ©gitimes. Commencer avec un profil training ou performance, puis activer strict seulement pour les gates critiques.
python db2_zos_sql_explain_analyzer_v2.py input/explain.csv \
--profile training \
--html output/reports/db2_training_report.html \
--fail-on CRITICAL3. Check-list avant partage externe
- Utiliser
--redactpour masquer schémas, tables, packages et index sensibles. - Vérifier manuellement les statements SQL contenant des données métier ou commentaires internes.
- Conserver une copie brute interne pour valider les mappings queryno/stmtno.
- Ne pas crĂ©er un index uniquement parce que lâoutil le suggĂšre : tester avec EXPLAIN et analyser lâimpact DML.
- Comparer baseline/current avant tout rebind en production.
