CDS Entity Buffer: Performance durch intelligentes Caching

kategorie
CDS
Veröffentlicht
autor
Johannes

CDS Entity Buffer ermöglichen das Zwischenspeichern von Daten auf Applikationsserver-Ebene, um wiederholte Datenbankzugriffe zu vermeiden. Durch gezielte Buffer-Konfiguration kann die Performance von CDS Views erheblich verbessert werden.

Grundkonzept

Das Buffering in CDS Views basiert auf dem bewährten SAP Table Buffering-Konzept, erweitert um CDS-spezifische Annotationen:

Ohne BufferMit Buffer
Jeder Zugriff geht zur DBDaten im Applikationsserver-Cache
Höhere NetzwerklastReduzierte DB-Zugriffe
Konsistente LatenzSchnellerer Zugriff bei Cache-Hit
Immer aktuellMögliche Verzögerung bei Updates
Geeignet für volatile DatenIdeal für Stammdaten

Vorteile

  • Reduzierte DB-Last: Weniger Roundtrips zur Datenbank
  • Schnellere Antwortzeiten: Daten aus lokalem Cache
  • Skalierbarkeit: Besseres Verhalten bei vielen Nutzern
  • Geringere Netzwerklast: Daten müssen nicht wiederholt übertragen werden

Wann ist Buffering sinnvoll?

SzenarioBuffering empfohlen
Stammdaten (Länder, Währungen)✅ Ja
Konfigurationsdaten✅ Ja
Bewegungsdaten (Belege)❌ Nein
Häufig geänderte Daten❌ Nein
Große Datenmengen pro Zugriff⚠️ Abwägen
Selten gelesene Daten❌ Nein

Buffer-Annotation

Die Buffer-Konfiguration erfolgt über die 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
}

Buffering Status

StatusBeschreibung
#ACTIVEBuffer ist aktiv
#NOT_ALLOWEDBuffering nicht erlaubt
#SWITCHED_OFFTemporär deaktiviert

Buffering Types

TypBeschreibungAnwendungsfall
#FULLGesamte Tabelle im BufferKleine Stammdatentabellen
#GENERICTeilweise gepuffert nach SchlüsselfeldernMandantenabhängige Daten
#SINGLEEinzelsatzzugriffe gepuffertGroße Tabellen mit Einzelzugriffen

Full Buffering

Das komplette Buffering lädt die gesamte Tabelle in den Applikationsserver-Cache:

@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
}

Voraussetzungen für Full Buffering

  • Tabelle sollte weniger als 100 KB groß sein
  • Daten ändern sich selten
  • Hohe Lesehäufigkeit

Generic Buffering

Beim Generic Buffering werden nur bestimmte Schlüsselbereiche gepuffert:

@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

Die Annotation numberOfKeyFields gibt an, wie viele Schlüsselfelder für die generische Pufferung verwendet werden:

-- Puffert alle Einträge pro Mandant
@AbapCatalog.buffering.numberOfKeyFields: 1
-- Puffert alle Einträge pro Mandant und Buchungskreis
@AbapCatalog.buffering.numberOfKeyFields: 2

Single Record Buffering

Einzelsatz-Buffering speichert nur einzelne gelesene Datensätze:

@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
}

Wann Single Buffering?

  • Große Tabellen mit Einzelzugriffen
  • Nur bestimmte Datensätze werden häufig gelesen
  • Full Buffering wäre zu speicherintensiv

Buffer-Invalidierung

Der Buffer wird automatisch invalidiert, wenn die zugrundeliegenden Daten geändert werden. Dies geschieht durch:

Automatische Invalidierung

" Änderung über Standard-Operationen invalidiert Buffer automatisch
MODIFY zcountry FROM ls_country.
" Buffer wird beim nächsten Zugriff neu geladen
SELECT SINGLE * FROM zi_country
WHERE country = 'DE'
INTO @DATA(ls_de).

Manuelle Buffer-Invalidierung

In bestimmten Fällen muss der Buffer manuell geleert werden:

" Einzelnen Tabellenpuffer leeren
CALL FUNCTION 'DB_BUFFER_INVALIDATE_SINGLE'
EXPORTING
tabname = 'ZCOUNTRY'.
" Alle Buffer eines Bereichs leeren
CALL FUNCTION 'DB_BUFFER_INVALIDATE_AREA'
EXPORTING
area = 'MY_AREA'.

Buffer-Synchronisation im Cluster

In verteilten Umgebungen muss die Buffer-Invalidierung über alle Applikationsserver synchronisiert werden:

" Synchronisationspunkt für Buffer-Updates
CALL FUNCTION 'BUFFER_REFRESH_ALL'.

CDS Views mit Basisentitäten

Wenn ein CDS View auf gepufferten Tabellen basiert, wird der Buffer der Basistabelle genutzt:

-- Basistabelle mit 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
}
-- Konsumierender View nutzt Buffer der Basis
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
}

Performance-Tipps

1. Buffer-Status in ADT analysieren

Im ABAP Development Tools kann der Buffer-Status analysiert werden:

  1. CDS View öffnen
  2. Rechtsklick → Show Buffer Analysis
  3. Buffer-Statistiken einsehen

2. Buffer-Effizienz messen

" Vor dem Zugriff
DATA(lv_start) = sy-uzeit.
" Mehrfache Zugriffe (simuliert Cache-Nutzung)
DO 1000 TIMES.
SELECT SINGLE * FROM zi_country
WHERE country = 'DE'
INTO @DATA(ls_country).
ENDDO.
" Zeitmessung
DATA(lv_duration) = sy-uzeit - lv_start.

3. Richtige Buffer-Größe wählen

TabellengrößeEmpfohlenes Buffering
< 8 KBFull Buffering
8 KB - 100 KBFull oder Generic
100 KB - 1 MBGeneric oder Single
> 1 MBSingle oder kein Buffering

4. Zugriffspattern beachten

-- Gut für Full Buffering: Alle Datensätze werden gebraucht
SELECT * FROM zi_currency INTO TABLE @DATA(lt_currencies).
-- Gut für Single Buffering: Einzelzugriffe
SELECT SINGLE * FROM zi_material WHERE material = @lv_matnr INTO @DATA(ls_material).
-- Schlecht für Buffering: Komplexe Abfragen mit Aggregation
SELECT SUM( amount ) FROM zi_salesdata INTO @DATA(lv_sum).

Einschränkungen

Views ohne Buffer-Unterstützung

Nicht alle CDS Views können gepuffert werden:

SzenarioBuffering möglich
View auf einzelne Tabelle✅ Ja
View mit JOIN auf gepufferte Tabellen✅ Ja
View mit Aggregationen (SUM, AVG)❌ Nein
View mit UNION❌ Nein
View mit komplexen Berechnungen⚠️ Eingeschränkt
View mit ungepufferten Basistabellen❌ Nein

Besonderheiten bei RAP

In RAP Business Objects hat das Buffering besondere Implikationen:

-- Interface View mit 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 - Buffering wird bei Änderungen beachtet
-- managed implementation in class zbp_currency;

Bei RAP-Operationen (CREATE, UPDATE, DELETE) wird der Buffer automatisch invalidiert.

Monitoring und Diagnose

Buffer-Statistiken abrufen

" Buffer-Statistiken für Tabelle
DATA: lt_buffer_stats TYPE STANDARD TABLE OF dbstattab.
CALL FUNCTION 'DB_BUFFER_STATISTICS'
EXPORTING
tabname = 'ZCOUNTRY'
TABLES
buffer_content = lt_buffer_stats.

Transaktion ST02

In der Transaktion ST02 (Tune Summary) können Buffer-Statistiken systemweit analysiert werden:

  • Buffer-Größe und Auslastung
  • Hit-Rate (Cache-Treffer)
  • Swap-Statistiken
  • Empfehlungen zur Optimierung

Best Practices

EmpfehlungBegründung
Stammdaten immer puffernHohe Leserate, seltene Änderungen
Buffer-Typ passend wählenSpeichereffizienz und Performance balancieren
Kleine Tabellen voll puffernGeringer Speicherbedarf, maximale Performance
Bewegungsdaten nicht puffernHäufige Änderungen invalidieren Buffer ständig
Buffer-Größe überwachenZu große Buffer belasten Applikationsserver
Hit-Rate regelmäßig prüfenNiedrige Hit-Rate = falsche Buffer-Strategie
Cluster-Synchronisation beachtenKonsistenz in verteilten Systemen

Zusammenfassung

CDS Entity Buffer bieten:

  • Performance-Boost: Schnellere Datenzugriffe durch lokales Caching
  • Flexible Konfiguration: Full, Generic und Single Buffering
  • Automatische Invalidierung: Konsistenz bei Datenänderungen
  • Integration mit RAP: Buffer-Handling in Business Objects
  • Monitoring-Möglichkeiten: Analyse und Optimierung

Buffering ist besonders effektiv für Stamm- und Konfigurationsdaten mit hoher Leserate und seltenen Änderungen.

Weiterführende Themen