CDS Entity Buffer : Performance grâce au cache intelligent

Catégorie
CDS
Publié
Auteur
Johannes

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 bufferAvec buffer
Chaque accès va à la DBDonnées dans le cache du serveur d’application
Charge réseau plus élevéeAccès DB réduits
Latence constanteAccès plus rapide en cas de hit cache
Toujours à jourPossible retard lors des mises à jour
Adapté aux données volatilesIdé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énarioBuffering recommandé
Données de base (pays, devises)Oui
Données de configurationOui
Données de mouvement (documents)Non
Données fréquemment modifiéesNon
Grands volumes par accèsÀ évaluer
Données rarement luesNon

Annotation de buffer

La configuration du buffer se fait via l’annotation @AbapCatalog.buffering :

@AbapCatalog.buffering.status: #ACTIVE
@AbapCatalog.buffering.type: #FULL
define view entity ZI_Country
as select from t005
{
key land1 as Country,
waession as CurrencyKey,
spras as Language
}

Statut du buffering

StatutDescription
#ACTIVEBuffer actif
#NOT_ALLOWEDBuffering non autorisé
#SWITCHED_OFFTemporairement désactivé

Types de buffering

TypeDescriptionCas d’utilisation
#FULLTable entière en bufferPetites tables de données de base
#GENERICPartiellement bufferisé par champs cléDonnées dépendantes du mandant
#SINGLEAccè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: #FULL
define 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: 1
define 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: 2

Single Record Buffering

Le Single Record Buffering ne stocke que les enregistrements individuels lus :

@AbapCatalog.buffering.status: #ACTIVE
@AbapCatalog.buffering.type: #SINGLE
define 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 buffer
MODIFY zcountry FROM ls_country.
" Le buffer sera rechargé lors du prochain accès
SELECT 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 table
CALL FUNCTION 'DB_BUFFER_INVALIDATE_SINGLE"
EXPORTING
tabname = 'ZCOUNTRY'.
" Vider tous les buffers d'une zone
CALL 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 buffer
CALL 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: #FULL
define 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 base
define 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é :

  1. Ouvrir la vue CDS
  2. Clic droit → Show Buffer Analysis
  3. Consulter les statistiques de buffer

2. Mesurer l’efficacité du buffer

" Avant l'accès
DATA(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 temps
DATA(lv_duration) = sy-uzeit - lv_start.

3. Choisir la bonne taille de buffer

Taille de tableBuffering recommandé
< 8 KoFull Buffering
8 Ko - 100 KoFull ou Generic
100 Ko - 1 MoGeneric ou Single
> 1 MoSingle ou pas de buffering

4. Tenir compte des patterns d’accès

-- Bon pour Full Buffering : Tous les enregistrements sont nécessaires
SELECT * FROM zi_currency INTO TABLE @DATA(lt_currencies).
-- Bon pour Single Buffering : Accès individuels
SELECT SINGLE * FROM zi_material WHERE material = @lv_matnr INTO @DATA(ls_material).
-- Mauvais pour Buffering : Requêtes complexes avec agrégation
SELECT 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énarioBuffering possible
Vue sur table uniqueOui
Vue avec JOIN sur tables bufferiséesOui
Vue avec agrégations (SUM, AVG)Non
Vue avec UNIONNon
Vue avec calculs complexesLimité
Vue avec tables de base non bufferiséesNon

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: #FULL
define 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 table
DATA: 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

RecommandationJustification
Toujours bufferiser les données de baseTaux de lecture élevé, modifications rares
Choisir le type de buffer appropriéÉquilibrer efficacité mémoire et performance
Bufferiser complètement les petites tablesFaible besoin en mémoire, performance maximale
Ne pas bufferiser les données de mouvementLes modifications fréquentes invalident constamment le buffer
Surveiller la taille du bufferDes buffers trop grands chargent le serveur d’application
Vérifier régulièrement le taux de hitTaux de hit faible = mauvaise stratégie de buffer
Prendre en compte la synchronisation clusterCohé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