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 Buffer | Mit Buffer |
|---|---|
| Jeder Zugriff geht zur DB | Daten im Applikationsserver-Cache |
| Höhere Netzwerklast | Reduzierte DB-Zugriffe |
| Konsistente Latenz | Schnellerer Zugriff bei Cache-Hit |
| Immer aktuell | Mögliche Verzögerung bei Updates |
| Geeignet für volatile Daten | Ideal 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?
| Szenario | Buffering 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: #FULLdefine view entity ZI_Country as select from t005{ key land1 as Country, waession as CurrencyKey, spras as Language}Buffering Status
| Status | Beschreibung |
|---|---|
#ACTIVE | Buffer ist aktiv |
#NOT_ALLOWED | Buffering nicht erlaubt |
#SWITCHED_OFF | Temporär deaktiviert |
Buffering Types
| Typ | Beschreibung | Anwendungsfall |
|---|---|---|
#FULL | Gesamte Tabelle im Buffer | Kleine Stammdatentabellen |
#GENERIC | Teilweise gepuffert nach Schlüsselfeldern | Mandantenabhängige Daten |
#SINGLE | Einzelsatzzugriffe gepuffert | Groß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: #FULLdefine 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: 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
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: 2Single Record Buffering
Einzelsatz-Buffering speichert nur einzelne gelesene Datensätze:
@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}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 automatischMODIFY zcountry FROM ls_country.
" Buffer wird beim nächsten Zugriff neu geladenSELECT 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 leerenCALL FUNCTION 'DB_BUFFER_INVALIDATE_SINGLE' EXPORTING tabname = 'ZCOUNTRY'.
" Alle Buffer eines Bereichs leerenCALL 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-UpdatesCALL 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: #FULLdefine view entity ZI_CountryText as select from t005t{ key land1 as Country, key spras as Language, landx as CountryName}
-- Konsumierender View nutzt Buffer der Basisdefine 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:
- CDS View öffnen
- Rechtsklick → Show Buffer Analysis
- Buffer-Statistiken einsehen
2. Buffer-Effizienz messen
" Vor dem ZugriffDATA(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.
" ZeitmessungDATA(lv_duration) = sy-uzeit - lv_start.3. Richtige Buffer-Größe wählen
| Tabellengröße | Empfohlenes Buffering |
|---|---|
| < 8 KB | Full Buffering |
| 8 KB - 100 KB | Full oder Generic |
| 100 KB - 1 MB | Generic oder Single |
| > 1 MB | Single oder kein Buffering |
4. Zugriffspattern beachten
-- Gut für Full Buffering: Alle Datensätze werden gebrauchtSELECT * FROM zi_currency INTO TABLE @DATA(lt_currencies).
-- Gut für Single Buffering: EinzelzugriffeSELECT SINGLE * FROM zi_material WHERE material = @lv_matnr INTO @DATA(ls_material).
-- Schlecht für Buffering: Komplexe Abfragen mit AggregationSELECT SUM( amount ) FROM zi_salesdata INTO @DATA(lv_sum).Einschränkungen
Views ohne Buffer-Unterstützung
Nicht alle CDS Views können gepuffert werden:
| Szenario | Buffering 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: #FULLdefine 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 TabelleDATA: 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
| Empfehlung | Begründung |
|---|---|
| Stammdaten immer puffern | Hohe Leserate, seltene Änderungen |
| Buffer-Typ passend wählen | Speichereffizienz und Performance balancieren |
| Kleine Tabellen voll puffern | Geringer Speicherbedarf, maximale Performance |
| Bewegungsdaten nicht puffern | Häufige Änderungen invalidieren Buffer ständig |
| Buffer-Größe überwachen | Zu große Buffer belasten Applikationsserver |
| Hit-Rate regelmäßig prüfen | Niedrige Hit-Rate = falsche Buffer-Strategie |
| Cluster-Synchronisation beachten | Konsistenz 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
- CDS Views Grundlagen - CDS View-Definitionen
- CDS Access Control (DCL) - Berechtigungen in CDS
- RAP Grundlagen - Basis-Konzepte von RAP