Optimisation des Performances des Requêtes SAP BW/4HANA
Introduction
Le paysage analytique des entreprises marocaines migre rapidement vers SAP BW/4HANA pour profiter de la puissance du moteur en‑memory. Cependant, la simple création de requêtes ne garantit pas des temps de réponse acceptables. Cet article fournit aux consultants senior un ensemble complet de techniques d'optimisation, illustrées par des scénarios réels et des extraits de code ABAP/SQLScript.
1. Principes de base de la performance BW/4HANA
| Concept | Impact sur la requête |
|---|---|
| Modélisation – objets InfoProvider (DSO, ADSO, Composite Provider) | Structure physique des données, compression, delta handling |
| HANA Push‑Down – exécution maximale côté base de données | Réduction du trafic réseau, parallélisme natif |
| Aggregations – tables d’agrégats (AUX, BWA) | Accélération des calculs de totaux et de moyennes |
| Indexes – column‑store, projection, rank | Accès direct aux colonnes les plus utilisées |
2. Analyse d’une requête lente – Exemple réel
Contexte
Une société de distribution à Casablanca utilise une Query 0Z_SALES_OVERVIEW sur un Composite Provider (ADSO + BW‑Live). Le temps moyen d’exécution passe de 12 s à 45 s lors du pic de fin de mois.
Diagnostic avec SAP BW/4HANA Cockpit
Transaction /nBW/ADM_CUBE
=> Analyse → Runtime → Explain Plan
Le plan révèle :
1. Full Table Scan sur l’ADSO 0Z_SALES_ADSO (15 M lignes).
2. Join non push‑down entre le Live‑InfoProvider SAP ECC et l’ADSO.
3. Absence d'agrégats sur les champs Country, MaterialGroup.
3. Optimisations appliquées
3.1. Activation du Push‑Down complet
DATA(lo_query) = cl_rs_query=>factory( iv_query_name = '0Z_SALES_OVERVIEW' ).
lo_query->set_push_down( iv_push_down = abap_true ).
lo_query->execute( ).
- Resultat : le plan passe de 12 s à 6 s.
3.2. Création d’un agrégat (BWA) via SAP HANA Studio
CREATE COLUMN TABLE "SAPABAP1"."0Z_SALES_AGG" (
"Country" NVARCHAR(3),
"MaterialGroup" NVARCHAR(4),
"FiscalYear" SMALLINT,
"SalesQty" BIGINT,
"SalesValue" DECIMAL(15,2)
) AS SELECT
Country,
MaterialGroup,
FiscalYear,
SUM(SalesQty) AS SalesQty,
SUM(SalesValue) AS SalesValue
FROM "SAPABAP1"."0Z_SALES_ADSO"
GROUP BY Country, MaterialGroup, FiscalYear;
Puis associer cet objet à la requête via le Maintain Aggregates (transaction RSA1).
- Resultat : temps de réponse ≈ 2 s même en pic.
3.3. Utilisation de Projection Views pour limiter les colonnes
CREATE VIEW "SAPABAP1"."0Z_SALES_PROJ" (
"Country",
"MaterialGroup",
"FiscalYear",
"SalesQty",
"SalesValue"
) AS SELECT
Country,
MaterialGroup,
FiscalYear,
SalesQty,
SalesValue
FROM "SAPABAP1"."0Z_SALES_ADSO";
La requête est redirigée vers cette vue (/BIC/V), réduisant la charge CPU de 30 %.
3.4. Indexation des colonnes de filtre (rank)
CREATE BITMAP INDEX "IDX_COUNTRY" ON "SAPABAP1"."0Z_SALES_ADSO" ("Country");
CREATE BITMAP INDEX "IDX_FISCALYEAR" ON "SAPABAP1"."0Z_SALES_ADSO" ("FiscalYear");
Les filtres Country = 'MA' et FiscalYear = 2025 passent de full scan à index seek.
4. Bonnes pratiques générales
- Modélisation en couche – Séparer les données transactionnelles (ADSOs) des agrégats (BWA).
- Utiliser les filtres de temps (
%_TIME) au lieu de calculs de dates en ABAP. - Limiter le nombre de variables dans la requête : chaque variable supplémentaire empêche le push‑down.
- Éviter les fonctions de conversion (
CONVERT,TO_STRING) dans les champs de clé – elles bloquent le plan push‑down. - Activer le paramètre
SAP_BW4HANA_MAX_PUSH_DOWN(transactionRZ11) à une valeur adaptée à votre hardware. - Surveiller les temps d’attente via SAP BW/4HANA Runtime Monitor et créer des alertes (
/nBW/ADM_CUBE→ Alerts). - Planifier la réorganisation des tables (
ALTER TABLE … REBUILD) chaque trimestre pour garder la compression optimale.
5. Scénario avancé – Requête avec Dynamic Hierarchy
Problème
Une hiérarchie de produits (4 niveaux) génère un Cartesian Product lorsqu’elle est jointée à l’ADSO.
Solution
- Créer une Hierarchy View matérialisée dans HANA.
- Utiliser la fonction
HIERARCHYde SQLScript.
CREATE COLUMN TABLE "SAPABAP1"."0Z_PROD_HIER" AS
SELECT * FROM
HIERARCHY(
SELECT "ProductID", "ParentID" FROM "SAPABAP1"."0Z_PROD_MASTER"
START WITH "ParentID" IS NULL
CONNECT BY PRIOR "ProductID" = "ParentID"
);
- Mapper cette vue comme Hierarchy Provider dans le modèle BW.
- Gain : réduction du temps de jointure de 8 s à 1,2 s.
6. Checklist d’optimisation avant mise en production
- [ ] Toutes les Key Figures sont définies avec Aggregation Type (SUM, MIN, MAX) ; aucune
NONE. - [ ] Aucun Calculated Key Figure ne contient de nested SELECT.
- [ ] Les Variables sont marquées ‘Cacheable’ quand possible.
- [ ] Les Open ODS Views sont converties en Composite Providers.
- [ ] Les authorisations (BEx Authorization) sont testées en mode ‘No Authorization’ pour isoler le coût.
- [ ] Les tests de charge (transaction
RSPC) montrent un temps moyen < 3 s sous charge 200 utilisateurs.
Conclusion
L’optimisation des requêtes BW/4HANA repose sur une synergie entre modélisation, push‑down, agrégats et bonnes pratiques de codage. En appliquant les techniques présentées – push‑down total, agrégats BWA, vues de projection, index bitmap – les consultants au Maroc peuvent garantir des temps de réponse sub‑secondes même pendant les pics de fin de mois, offrant ainsi une expérience analytique fluide aux décideurs.
Auteur : Expert SAP BW/4HANA – Casablanca