CDS Entity Buffer permet la mise en cache des données au niveau du serveur d’application pour éviter les accès répétés à la base de données. Grâce à une configuration ciblée du buffer, la performance des vues CDS peut être considérablement améliorée.
Concept de base
Le buffering dans les vues CDS est basé sur le concept éprouvé de SAP Table Buffering, étendu avec des annotations spécifiques à CDS :
| Sans buffer | Avec buffer |
|---|---|
| Chaque accès va à la DB | Données dans le cache du serveur d’application |
| Charge réseau plus élevée | Accès DB réduits |
| Latence constante | Accès plus rapide en cas de hit cache |
| Toujours à jour | Possible retard lors des mises à jour |
| Adapté aux données volatiles | Idéal pour les données de base |
Avantages
- Charge DB réduite : Moins de roundtrips vers la base de données
- Temps de réponse plus rapides : Données depuis le cache local
- Scalabilité : Meilleur comportement avec de nombreux utilisateurs
- Charge réseau réduite : Les données n’ont pas besoin d’être transférées à répétition
Quand le buffering est-il pertinent ?
| Scénario | Buffering recommandé |
|---|---|
| Données de base (pays, devises) | Oui |
| Données de configuration | Oui |
| Données de mouvement (documents) | Non |
| Données fréquemment modifiées | Non |
| Grands volumes par accès | À évaluer |
| Données rarement lues | Non |
Annotation de buffer
La configuration du buffer se fait via l’annotation @AbapCatalog.buffering :
@AbapCatalog.buffering.status: #ACTIVE@AbapCatalog.buffering.type: #FULLdefine view entity ZI_Country as select from t005{ key land1 as Country, waession as CurrencyKey, spras as Language}Statut du buffering
| Statut | Description |
|---|---|
#ACTIVE | Buffer actif |
#NOT_ALLOWED | Buffering non autorisé |
#SWITCHED_OFF | Temporairement désactivé |
Types de buffering
| Type | Description | Cas d’utilisation |
|---|---|---|
#FULL | Table entière en buffer | Petites tables de données de base |
#GENERIC | Partiellement bufferisé par champs clé | Données dépendantes du mandant |
#SINGLE | Accès enregistrement unique bufferisé | Grandes tables avec accès individuels |
Full Buffering
Le buffering complet charge la table entière dans le cache du serveur d’application :
@AbapCatalog.buffering.status: #ACTIVE@AbapCatalog.buffering.type: #FULLdefine view entity ZI_Currency as select from tcurc{ key waers as CurrencyCode, isocd as ISOCode, altwr as AlternativeKey}Prérequis pour le Full Buffering
- La table devrait faire moins de 100 Ko
- Les données changent rarement
- Fréquence de lecture élevée
Generic Buffering
Avec le Generic Buffering, seules certaines plages de clés sont bufferisées :
@AbapCatalog.buffering.status: #ACTIVE@AbapCatalog.buffering.type: #GENERIC@AbapCatalog.buffering.numberOfKeyFields: 1define view entity ZI_CompanySettings as select from zcomp_settings{ key mandt as Client, key bukrs as CompanyCode, setting_name as SettingName, setting_value as SettingValue}numberOfKeyFields
L’annotation numberOfKeyFields indique combien de champs clé sont utilisés pour le buffering générique :
-- Bufferise toutes les entrées par mandant@AbapCatalog.buffering.numberOfKeyFields: 1
-- Bufferise toutes les entrées par mandant et société@AbapCatalog.buffering.numberOfKeyFields: 2Single Record Buffering
Le Single Record Buffering ne stocke que les enregistrements individuels lus :
@AbapCatalog.buffering.status: #ACTIVE@AbapCatalog.buffering.type: #SINGLEdefine view entity ZI_Material as select from mara{ key matnr as Material, mtart as MaterialType, matkl as MaterialGroup, meins as BaseUnit}Quand utiliser Single Buffering ?
- Grandes tables avec accès individuels
- Seuls certains enregistrements sont fréquemment lus
- Full Buffering serait trop gourmand en mémoire
Invalidation du buffer
Le buffer est automatiquement invalidé lorsque les données sous-jacentes sont modifiées. Cela se produit par :
Invalidation automatique
" La modification via les opérations standard invalide automatiquement le bufferMODIFY zcountry FROM ls_country.
" Le buffer sera rechargé lors du prochain accèsSELECT SINGLE * FROM zi_country WHERE country = 'DE" INTO @DATA(ls_de).Invalidation manuelle du buffer
Dans certains cas, le buffer doit être vidé manuellement :
" Vider le buffer d'une seule tableCALL FUNCTION 'DB_BUFFER_INVALIDATE_SINGLE" EXPORTING tabname = 'ZCOUNTRY'.
" Vider tous les buffers d'une zoneCALL FUNCTION 'DB_BUFFER_INVALIDATE_AREA" EXPORTING area = 'MY_AREA'.Synchronisation du buffer en cluster
Dans les environnements distribués, l’invalidation du buffer doit être synchronisée sur tous les serveurs d’application :
" Point de synchronisation pour les mises à jour de bufferCALL FUNCTION 'BUFFER_REFRESH_ALL'.Vues CDS avec entités de base
Quand une vue CDS est basée sur des tables bufferisées, le buffer de la table de base est utilisé :
-- Table de base avec buffering@AbapCatalog.buffering.status: #ACTIVE@AbapCatalog.buffering.type: #FULLdefine view entity ZI_CountryText as select from t005t{ key land1 as Country, key spras as Language, landx as CountryName}
-- Vue consommatrice utilise le buffer de la basedefine view entity ZI_CountryWithText as select from ZI_Country as Country left outer join ZI_CountryText as Text on Country.Country = Text.Country and Text.Language = $session.system_language{ key Country.Country, Country.CurrencyKey, Text.CountryName}Conseils de performance
1. Analyser le statut du buffer dans ADT
Dans ABAP Development Tools, le statut du buffer peut être analysé :
- Ouvrir la vue CDS
- Clic droit → Show Buffer Analysis
- Consulter les statistiques de buffer
2. Mesurer l’efficacité du buffer
" Avant l'accèsDATA(lv_start) = sy-uzeit.
" Accès multiples (simule l'utilisation du cache)DO 1000 TIMES. SELECT SINGLE * FROM zi_country WHERE country = 'DE" INTO @DATA(ls_country).ENDDO.
" Mesure du tempsDATA(lv_duration) = sy-uzeit - lv_start.3. Choisir la bonne taille de buffer
| Taille de table | Buffering recommandé |
|---|---|
| < 8 Ko | Full Buffering |
| 8 Ko - 100 Ko | Full ou Generic |
| 100 Ko - 1 Mo | Generic ou Single |
| > 1 Mo | Single ou pas de buffering |
4. Tenir compte des patterns d’accès
-- Bon pour Full Buffering : Tous les enregistrements sont nécessairesSELECT * FROM zi_currency INTO TABLE @DATA(lt_currencies).
-- Bon pour Single Buffering : Accès individuelsSELECT SINGLE * FROM zi_material WHERE material = @lv_matnr INTO @DATA(ls_material).
-- Mauvais pour Buffering : Requêtes complexes avec agrégationSELECT SUM( amount ) FROM zi_salesdata INTO @DATA(lv_sum).Limitations
Vues sans support de buffer
Toutes les vues CDS ne peuvent pas être bufferisées :
| Scénario | Buffering possible |
|---|---|
| Vue sur table unique | Oui |
| Vue avec JOIN sur tables bufferisées | Oui |
| Vue avec agrégations (SUM, AVG) | Non |
| Vue avec UNION | Non |
| Vue avec calculs complexes | Limité |
| Vue avec tables de base non bufferisées | Non |
Particularités avec RAP
Dans les RAP Business Objects, le buffering a des implications particulières :
-- Interface View avec buffering@AbapCatalog.buffering.status: #ACTIVE@AbapCatalog.buffering.type: #FULLdefine view entity ZI_Currency as select from tcurc{ key waers as CurrencyCode, isocd as ISOCode}
-- RAP Behavior Definition - Le buffering est pris en compte lors des modifications-- managed implementation in class zbp_currency;Lors des opérations RAP (CREATE, UPDATE, DELETE), le buffer est automatiquement invalidé.
Monitoring et diagnostic
Récupérer les statistiques de buffer
" Statistiques de buffer pour une tableDATA: lt_buffer_stats TYPE STANDARD TABLE OF dbstattab.
CALL FUNCTION 'DB_BUFFER_STATISTICS" EXPORTING tabname = 'ZCOUNTRY" TABLES buffer_content = lt_buffer_stats.Transaction ST02
Dans la transaction ST02 (Tune Summary), les statistiques de buffer peuvent être analysées à l’échelle du système :
- Taille et utilisation du buffer
- Taux de hit (hits cache)
- Statistiques de swap
- Recommandations d’optimisation
Bonnes pratiques
| Recommandation | Justification |
|---|---|
| Toujours bufferiser les données de base | Taux de lecture élevé, modifications rares |
| Choisir le type de buffer approprié | Équilibrer efficacité mémoire et performance |
| Bufferiser complètement les petites tables | Faible besoin en mémoire, performance maximale |
| Ne pas bufferiser les données de mouvement | Les modifications fréquentes invalident constamment le buffer |
| Surveiller la taille du buffer | Des buffers trop grands chargent le serveur d’application |
| Vérifier régulièrement le taux de hit | Taux de hit faible = mauvaise stratégie de buffer |
| Prendre en compte la synchronisation cluster | Cohérence dans les systèmes distribués |
Résumé
CDS Entity Buffer offre :
- Boost de performance : Accès aux données plus rapides grâce au cache local
- Configuration flexible : Full, Generic et Single Buffering
- Invalidation automatique : Cohérence lors des modifications de données
- Intégration avec RAP : Gestion du buffer dans les Business Objects
- Possibilités de monitoring : Analyse et optimisation
Le buffering est particulièrement efficace pour les données de base et de configuration avec un taux de lecture élevé et des modifications rares.
Sujets connexes
- Fondamentaux des vues CDS - Définitions de vues CDS
- CDS Access Control (DCL) - Autorisations dans CDS
- Fondamentaux RAP - Concepts de base de RAP