Performancesteigerung durch lokale Pufferung

Hinweise, Tips und Tricks, FAQs - keine Anfragen!!
6 Beiträge • Seite 1 von 1
6 Beiträge Seite 1 von 1

Performancesteigerung durch lokale Pufferung

Beitrag von bigld (ForumUser / 9 / 1 / 3 ) »
Performancesteigerung durch lokale Pufferung – meine derzeit „schönste“ Lösung

Lokales Puffern powered by Table Expressions
Ich habe mir angewöhnt, Daten lokal zu puffern, wenn ich sie mehr als einmal im Programm lesen muss. „Lokal“ sehe ich hier als „in der Klasse mit der Lesemethode“ (oder auch in der Funktionsgruppe mit Lese-Funktionsbaustein).
Abgesehen von der Performancesteigerung (durchschnittlich Faktor 10-100) finde ich meine aktuelle Variante durch die „Inline Deklarationen“ und „Table Expression“ fast schon ästhetisch!

Beispiel Lesefunktion mit Pufferung
Hier ein kleines Beispiel zum Lesen von Geschäftspartner-Grunddaten aus der Tabelle BUT000.

Es wird zunächst der lokale Puffer gelesen.

Gibt’s dort keinen Treffer, werden die Daten von der Datenbank gelesen und in den Puffer gestellt. Um Speicherprobleme zu vermeiden – z.B. bei Massendatenänderungen – bereinigt sich der Puffer selbst, also ohne explizite Initialisierung.

Die Verwendung des Puffers kann über einen Parameter gesteuert werden.

Code: Alles auswählen.

* read local buffer
  IF i_no_local_buffer IS NOT INITIAL.      "reread from database (reset buffer for partner)
    DELETE gt_partner_local_buffer WHERE partner = i_partner OR partner_guid = i_partner_guid.
  ELSE.
    IF i_partner IS NOT INITIAL.            "1st try partner NO
      ASSIGN gt_partner_local_buffer[ partner = i_partner ]           TO FIELD-SYMBOL(<lwa_local_buffer>).     "inline declaration + table expression
    ELSEIF i_partner_guid IS NOT INITIAL.   "2nd try partner GUID
      ASSIGN gt_partner_local_buffer[ partner_guid = i_partner_guid ] TO <lwa_local_buffer>.                   "table expression
    ENDIF.
  ENDIF.

  IF <lwa_local_buffer> IS ASSIGNED.
    "return data from local buffer
    ewa_partner_data  = <lwa_local_buffer>.
    RETURN.
  ELSE.
    " read data from DB or via (Standard) methods/function modules
    "...
    "...
    "(re)read data from database
    CLEAR ewa_partner_data.
    IF i_partner IS NOT INITIAL.
      l_where = |partner = i_partner|.
      ewa_partner_data-partner = i_partner.
    ELSEIF i_partner_guid IS NOT INITIAL.
      l_where = |partner_guid = i_partner_guid|.
      ewa_partner_data-partner_guid = i_partner_guid.
    ELSE.
      "impossible! allready checked
    ENDIF.

    SELECT SINGLE partner_guid
         partner
         type
         bpkind
         name_org1
         name_org2
         name_last
         name_first FROM but000 INTO ewa_partner_data WHERE (l_where).

* append data to local buffer
    IF lines( gt_partner_local_buffer ) >= 5000. "self cleanup w/o explicit INIT function - eg. mass data processing
      FREE gt_partner_local_buffer. "free buffer table - start rebuild at next access
    ENDIF.
    APPEND ewa_partner_data TO gt_partner_local_buffer.
  ENDIF.
Typ-Deklaration

Code: Alles auswählen.

TYPES:
  BEGIN OF gts_partner_buffer,
  partner_guid  TYPE bu_partner_guid,
  partner        TYPE bu_partner,
  type          TYPE bu_type,
  bpkind        TYPE bu_bpkind,
  name_org1      TYPE bu_nameor1,
  name_org2      TYPE bu_nameor2,
  name_last      TYPE bu_namep_l,
  name_first    TYPE bu_namep_f,
  END OF gts_partner_buffer.
TYPES:
  gtt_partner_buffer TYPE TABLE OF gts_partner_buffer.
Fazit
Wenn keine andere Pufferlösung möglich ist, z.B. gepufferte Tabellen, Puffer im (Standard)BAPI, SharedObject,…, greife ich auf die Art der Pufferung zurück. Vor allem bei Massendatenverarbeitung z.B. in Korrektur-Reports oder bei permanenten Schnittstellen (z.B. REST-Schnittstellen wie dem SAP NetWeaver Gateway Batch Services) kann diese Form der Pufferung erhebliche Performancesteigerungen bringen und schont die System Ressourcen.

Durch die Table Expressions finde ich den Code auch langsam stylisch – weiter so, SAP!!!
Zuletzt geändert von bigld am 13.10.2014 09:13, insgesamt 1-mal geändert.

Folgende Benutzer bedankten sich beim Autor bigld für den Beitrag:
foessleitnerj

--------------------------------------------------------------------------------------------------------------
Die Performance und Ergebnisse von SELECTs und JOINs im Produktivsystem überprüfen?
=> SQL Cockpit
http://www.cadaxo.com

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Performancesteigerung durch lokale Pufferung

Beitrag von black_adept (Top Expert / 4101 / 128 / 942 ) »
Hallo bigId,

da du das ja zum Performancetrimming verwendest solltest du deine Tabellendefinition noch auf einen Hash-Table umstellen, so dass du auch beim Lesen aus dem Puffer weniger Zeit vergeudest.

Und das "SelfCleanup" gefällt mir gar nicht in der verwendeten Ausprägung. Wenn du tatsächlich mit Speicherproblemen rechnest, so dass du nur einen begrenzte Puffermenge zur Verfügung hast solltest du dir Gedanken darüber machen, ob du beim Erreichen des Limits nicht nur die "unwesentlichsten" Puffereinträge verwirfst anstatt Tabula rasa zu machen. Blockweises Vorgehen ist durchaus angebracht - aber "alles" ist halt ein recht großer Block.
Die Definition von "wesentlich" ist leider von der Applikation abhängig und müsste von dir mit Augenmaß eingestellt werden.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Performancesteigerung durch lokale Pufferung

Beitrag von bigld (ForumUser / 9 / 1 / 3 ) »
Hallo Stefan

Eine HASHED Table würde natürlich noch einiges mehr bringen, nur müsste ich mich in dem Beispiel dann entweder auf die Partnernummer oder die GUID beschränken, was beim Geschäftspartner ja bekanntlich nicht wirklich möglich ist.
Bei einem eindeutigen Schlüssel ist die HASH-Table die richtige Wahl!

"Keep it simple" - Beim SelfCleanup hab ich den einfachen und schnellen Weg gewählt - besser meistens aus dem Puffer, als nie...

Bei "normaler Bearbeitung" durch einen User wird man selten zum Cleanup kommen.
Bei Batchverarbeitung (zB Massenänderungen aus Korrekturreports oder Schnittstellen) kann das sehr wohl möglich sein, aber hier ist die Ermittlung der "unwesentlichen Einträgen" nicht unbedingt im Kontext des aktuellen Codings möglich.

lg
Domi Bigl
--------------------------------------------------------------------------------------------------------------
Die Performance und Ergebnisse von SELECTs und JOINs im Produktivsystem überprüfen?
=> SQL Cockpit
http://www.cadaxo.com

Re: Performancesteigerung durch lokale Pufferung

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Zur Info:
Wir haben uns eine Methode (BUFFERED_SELECT_SINGLE) gebastelt, die sämtliche Tabellen puffern kann.
Das Entscheidende dabei ist:
- die Methode kann statisch und damit für alle zur Laufzeit geladenen Programme benutzt werden
- die Methode kann instanziiert werden, um einen Puffer für ein Programm zu isolieren.
- Die Methode puffert auch "not founds" jedoch nur mit dem Schlüssel um Speicherplatz zu sparen
- Wenn nicht anders angegeben, puffert die Methode eine Tabelle nur dann, wenn sie nicht im SAP-Tabellenpuffer ist

Re: Performancesteigerung durch lokale Pufferung

Beitrag von black_adept (Top Expert / 4101 / 128 / 942 ) »
bigld hat geschrieben:...Eine HASHED Table würde natürlich noch einiges mehr bringen, nur müsste ich mich in dem Beispiel dann entweder auf die Partnernummer oder die GUID beschränken, was beim Geschäftspartner ja bekanntlich nicht wirklich möglich ist.
Dann nimm doch eine doppelt indizierte Tabelle.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
bigld

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Performancesteigerung durch lokale Pufferung

Beitrag von bigld (ForumUser / 9 / 1 / 3 ) »
Hallo Stefan

Ich hab den Wald vor lauter Bäumen nicht gesehen!?!
Danke für den Hinweis! Ich werde das anpassen!
--------------------------------------------------------------------------------------------------------------
Die Performance und Ergebnisse von SELECTs und JOINs im Produktivsystem überprüfen?
=> SQL Cockpit
http://www.cadaxo.com

Seite 1 von 1

Vergleichbare Themen

7
Antw.
2645
Views
Lokale Tabellen.
von Dzhan » 24.06.2008 10:22 • Verfasst in ABAP® für Anfänger
2
Antw.
1978
Views
Hostorie - Lokale Daten
von ICO-Man » 26.04.2007 16:02 • Verfasst in Basis
2
Antw.
1882
Views
Zugriff auf lokale Variablen
von diamondo » 01.05.2016 12:26 • Verfasst in ABAP Objects®
1
Antw.
1171
Views
Lokale Dateien durchsuchen
von Migges » 24.07.2006 10:44 • Verfasst in ABAP® Core
3
Antw.
2696
Views
Inner classes / lokale klassen
von Gast » 26.08.2005 18:50 • Verfasst in ABAP Objects®

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

SM30 Kundenfunktion
vor einer Stunde von black_adept 2 / 83
Customizing-Transportauftrag schreiben
vor 11 Stunden von msfox 5 / 573
Daten an Tabelle binden
vor 2 Tagen von Lukas Sanders 4 / 2743

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

SM30 Kundenfunktion
vor einer Stunde von black_adept 2 / 83
Customizing-Transportauftrag schreiben
vor 11 Stunden von msfox 5 / 573
Daten an Tabelle binden
vor 2 Tagen von Lukas Sanders 4 / 2743

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 6 Tagen von snooga87 1 / 1123
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 4320
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 10699