1 Ermittlung der Tabellengrößen in einem System Walldorf, 1. Oktober 2014 Dr. Joachim Jacobitz 2 Aufgabenstellung Eine Datenbank zum Betrieb eines SAP-Systems enthält gemäß nachfolgender Abbildung vor allem Indizes und Tabellen. Für die Portierung einer konventionellen Datenbank nach SAP HANA genügt aber in erster Linie die Kenntnis der Tabellengrößen, weil zum Beispiel die Indizes nicht übertragen werden. Die Tabellengröße ST in Bytes [B] bestimmt daher zusammen mit der Transferrate r [B/s] und der Anzahl paralleler Prozesse p Є N+ > 0 im Wesentlichen die Dauer t [s], die für eine Übertragung der Daten nach SAP HANA benötigt wird. Datenbankgröße, zum Beispiel 600 GB T1 T1 Daten R Reserve M Metadaten I Indexbereich Vorbelegung (8 kB) . . T . . Tn T1 Daten Tabellen Vorbelegung (8 kB) Zur Bestimmung der Tabellengröße wurden daher Objekte in Form von Funktionsbausteinen oder SQLSkripten gesucht, die nicht nur bis Release 4.6 D abwärtskompatibel sind, sondern auch alle Datenbanken unterstützen, die zum Betrieb eines SAP-Systems eingesetzt werden: 1. Oracle (Oracle) 2. DB2, DB4, DB6 (IBM) 3. MS SQL Server (Microsoft) 4. Adabas = maxDB (Software AG) 5. SAPDB (SAP AG) 6. Sybase (SAP AG) Getestet wurde in den Systemen YI3 (SAP NetWeaver 7.4) mit einem Gesamtbestand von 20490 Tabellen und BWV (SAP EHP 1 for SAP NetWeaver 7.0) mit einem Gesamtbestand von 42235 Tabellen. Testumfeld und Befragungen Alle Objekte, die in diesen Systemen gefunden wurden, waren jedoch entweder zu langsam oder zu ungenau. Die Programmausführung wurde in den meisten Fällen selbst bei vergleichsweise kleinen Datenbeständen wegen Zeitüberschreitung im Profilparameter abap/timeout abgebrochen. Dabei erzeugten Module, die zum Beispiel via EXEC SQL oder SQL-Skript direkt in die Datenbank zugreifen, stets eine Überschreitungen der Laufzeit, während diejenigen Bausteine hinreichend schnell sind, die Aufzeichnungen des Datenbankmonitors auswerten. Die Ungenauigkeiten rühren daher, dass die verwendeten Bausteine nicht die tatsächlich vorhandene Datenbelegung messen, sondern die von der Datenbank verursachten Segmentvorbelegungen einbeziehen. So werden zum Beispiel für eine Tabelle je nach Datenbank 8 kB angelegt, obwohl diese leer ist oder nur wenige Einträge enthält. Aus dem gleichen Grund können auch die Längenangaben des ABAP-Dictionary (SE11) gemäß Zeilenanzahl • Zeilenbreite nicht verwendet werden, weil deren Ergebnis zum Teil erheblich von der tatsächlichen Belegung der einzelnen Felder abweicht. Zudem wird 3 die Komprimierung von Tabelleninhalten nur unzureichend behandelt, denn in Transaktion DBACOCKPIT wurden bisher nur Angaben für Oracle gefunden. Im Einzelnen wurden folgende Programmeinheiten und Transaktionen geprüft, wobei der Platzhalter <DB> die jeweilige Datenbank angibt, zum Beispiel ORA für Oracle oder ADA für Adabas. Auffallend ist, dass die meisten Bausteine nicht für alle Datenbankplattformen verfügbar sind. Funktionsbaustein DB_<DB>_TABLES_HISTORY Funktionsbaustein SEL_SERVERDBSTATISTICS_<DB> Funktionsbaustein GET_TABLE_SIZE_<DB> Funktionsbaustein /SDF/HANA_TABLE_SIZE Funktionsbaustein DB_STATISTICS_DATA_READ Funktionsbaustein FB RSDU_ESTIMATE_COUNT ABAP-Anweisungen ∑ STRLEN(Feld) je Tabelle ABAP-Anweisungen ∑ (Zeilenanzahl · Zeilenlängen) C-Funktion dbdd_get_size() im Header dbdd.h Form SDB_ADD_EXACT_TABLE_SIZE (SAPLSADD) Form IMPORT_GE_OVERVIEW (RSORADIS) Transaktion DB02 Transaktion DBACOCKPIT Transaktion ORA_PERF In Ergänzung zu den eigenen Prüfungen wurde gleichzeitig eine Vielzahl von SAP-Kollegen mit der Bitte um Auskunft angeschrieben und befragt, deren Abteilungen in den betroffenen Themenbereich fallen und daher in der nachfolgend Aufzählung enthalten sind: DB2 for Linux, Unix & Windows PA & TS und P & S Application PI HANA Plat ABAP Platform & VM Tech (AG) PI HANA Platform & BW Engineering Serv (AG) PI HANA Plat IMS ABAP PI HANA Plat IMS BW (AG) Oracle Platform Außerdem wurden unter www.service.sap.com/quicksizer ein kostenloser SAP Quick Sizer gefunden und zwei Hinweise zum Thema Datenbankgröße, die sich vor allem mit der Bestimmung des zukünftigen HANA-Speicherbedarfs befassen, nämlich: 1793345 - Sizing for SAP Suite on HANA 1872170 - Suite on HANA memory sizing report Lösungsvorschlag Zusammenfassend könnte die gestellte Aufgabe auf Basis der vorgenommenen Prüfungen und Befragungen durch folgendes Vorgehen gelöst werden: 1. Die Größenrangfolge aller Tabellen eines SAP-Systems wird mit Hilfe des Funktionsbausteines DB_STATISTICS_DATA_READ bestimmt, der die Anforderungen an die Ausführungszeit erfüllt und für alle von SAP unterstützten Datenbanken verfügbar ist. Hier kann überlegt werden, die Auswahl der Tabellen nicht auf eine bestimmte Anzahl zu beschränken, sondern auf ihr Verhältnis zur Gesamtgröße aller vorhandenen Tabellen - also nicht die 50 größten Tabellen, sondern diejenigen Tabellen, deren Einträge zum Beispiel 10 Prozent der Gesamtgröße ausmachen. Damit dieser Baustein auch brauchbare Ergebnisse liefert, muss der Datenbankmonitor rechtzeitig vor der Datenübertragung eingeschaltet werden. 4 2. Die Bestimmung der Rangfolge kann für große oder kritische Tabellen derart ergänzt werden, dass diese Tabellen mittels Funktionsbaustein /SDF/HANA_TABLE_SIZE einzeln auf ihre tatsächliche Größe s untersucht werden. Deren Verhältnis zur statistischen Belegung s̈ könnte für n Є N+ > 0 untersuchte Tabellen eine mittlere Belegung in Form eines dimensionslosen Belegungsfaktors f̅ liefern, der die Berechnung der Übertragungsdauer in Stunden t [h] gemäß folgender Gleichung verbessert: n f̅ ·St 1 s −1 ̅ [h] t = · 3600 mit f = ∑ r· p n s̈ Dieser Baustein ist der einzige, der für die Messung der tatsächlichen Tabellengröße gefunden wurde. Er ist allerdings nur für Basisstände > 7.0 verfügbar und kein Bestandteil eines Basissystems. Seine Ergebnisse haben in wenigen Fällen Belegungen s > s̈ ergeben, was vermutlich auf veralteten Statistikdaten oder einer nicht repräsentativen Zeilenauswahl beruht. Wegen Verflachung der Strukturen, die von der Datenbank zur Bearbeitung von Anfragen verwendet werden, könnte in Absprache mit den Kunden zuvor eine Reorganisation der Datenbank durchgeführt werden. Diese bereinigt den vorhandenen Datenbestand, indem vorhandene Daten zusammengefasst und gelöschte Daten entfernt werden, womit auch überschüssige Vorbelegungen entfallen. Außerdem können die Statistiken des Datenbankmonitors auf Betriebssystemebene mit dem Befehl brconnect u / -c -f stats -t all -f allsel,collect,space -p 4 aktualisiert werden, sodass der Baustein DB_STATISTICS_DATA_READ nur die seitdem vorgenommenen Aufzeichnungen verwendet. Beispielprogramm Ein Beispielprogramm, das im Mandanten 001 des Systems BWV angelegt wurde, enthält beide Funktionen und kann mit Transaktion ZJJ_TAB_PROGRAM gestartet werden. Das Programm ermittelt die Bruttogröße aller Tabellen in MB, die zum Betrieb eines SAP-Systems in der Datenbank vorhanden sind. Dieser Wert enthält neben den reinen Anwendungsdaten auch die Segmentvorbelegungen, die von der Datenbank bei jeder Sicherung automatisch angelegt werden. 5 Der Steuerbereich der Transaktion, dessen Breite durch Ziehen mit der linken Maustaste verändert werden kann, ist mit den Funktionen zur Tabellenrangfolge und Einzelprüfung stets gleich aufgebaut, während im Arbeitsbereich die Ergebnisse der beiden Funktionen angezeigt werden. Die Bestimmung der Tabellengrößen umfasst sowohl transparente als auch Pool- und Clustertabellen, außerdem alle Basistabellen, die in der Liste rot markiert sind. Die in der GUI-Oberfläche platzierten Funktionen Back, Exit und Cancel übernehmen die Steuerung zwischen den einzelnen Bildern des Arbeitsbereiches. Durch Einfachklick auf das Symbol Back wird jeweils in das Startbild verzweigt. Durch Einfachklick auf das Symbol Exit wird das SAP-Menü samt Favoritenliste aufgerufen. Durch Einfachklick auf das Symbol Cancel wird im aktuellen Bildschirmbild verblieben, wobei alle Daten im Arbeitsbereich gelöscht werden. Bei allen Bildschirmbildern sind die drei ersten Symbole der GUI-Oberfläche immer sichtbar. Sie beziehen sich nicht auf einzelne Bearbeitungsobjekte, sondern auf globale Funktionen, die während der gesamten Ausführungszeit zur Verfügung stehen: 1. GUI-Symbol Control Area für das Ein- und Ausblenden des Steuerbereichs 2. GUI-Symbol Information mit einer Kurzbeschreibung der wichtigsten Funktionen 3. GUI-Symbol Internet für den Aufruf einer Internet-Seite zum Thema SAP HANA Tabellenrangfolge Nach Eingabe einer Tabellenanzahl n > 0, die im Feld Number of tables mit dem Wert 100 vorbelegt ist, wird eine Liste der Tabellen erstellt, sobald die Funktion Ranking (F8) in der GUI-Oberfläche des SAPFensters ausgelöst wurde. Diese Liste ist absteigend nach Bruttogrößen sortiert und darin enthaltene Tabellen, die für SLT geeignet sind, werden in der Listenspalte slt grün gekennzeichnet. Falls nach Start der Transaktion keine Eingaben vorgenommen werden, erscheint auf dem Bildschirm eine Liste mit den 100 größten Tabellen eines SAP-Systems. 6 Sicherung ausgewählter Tabellen Einzelne Zeilen oder ganze Blöcke können ausgewählt werden, indem gleichzeitig die Tasten <Strg> oder <> gedrückt und die erste Spalte einer Tabellenzeile durch einen Einfachklick mit der linken Maustaste markiert werden. Nach Auslösen der Funktion Log in der GUI-Oberfläche des SAP-Fensters werden die Namen der ausgewählten Tabellen in eine Datei mit der Bezeichnung SLT_TABLES.txt auf dem ABAP-Applikationsrechner abgelegt, sofern sie für SLT geeignet sind. Ausgewählte Tabellen ohne SLT-Eignung, erkennbar an der roten Markierung, werden in einem Dialogfenster als fehlerhaft gemeldet, nach deren Bestätigung die Protokollierung fortgesetzt wird. Das Verzeichnis wird automatisch ermittelt und danach zusammen mit dem Tabellennamen im Feld File description angezeigt. Die Datei ist zu jedem Zeitpunkt nur ein Mal vorhanden, weil sie bei erneuter Ablage mit den Daten der aktuellen Auswahl überschrieben wird. Die ersten vier Zeilen enthalten die nachfolgenden Verwaltungseinträge, gefolgt von den Größenangaben und den Namen der markierten Tabellen, jeweils getrennt durch eine Leerzeile: # Tables to be used by DMO_SLT # Generated by transaction ZJJ_TAB_PROGRAM # Timestamp dd.mm.yyyy hh:mm:ss h # User <sy-uname> Ihre Inhalte können nach Start der Transaktion AL11 überprüft werden, wenn im Startbild der Transaktion ein Doppelklick auf die Zeile mit dem Eintrag DIR_PUT und im Folgebild ein Doppelklick auf die Zeile mit dem Eintrag Filename = bin abgesetzt werden. Durch Auslösen der Funktion Find in der GUI-Oberfläche des SAP-Fensters und Eingabe des Suchbegriffs SLT_TABLES.txt wird in die betroffene Zeile verzweigt, die wiederum einen Doppelklick mit der linken Maustaste erfordert, um die gewünschten Inhalte anzuzeigen. Berechnung eines Belegungsfaktors Die Belegungen s/s̈ werden berechnet, wenn die GUI-Funktion Occupancy rate in der Oberfläche des SAP-Fensters ausgelöst wird, nachdem zuvor bestimmte Tabellen mit Hilfe der Tasten <Strg> oder <> und einem Mausklick markiert wurden. Die Tabellenauswahl darf aus Laufzeitgründen eine Anzahl > 100 nicht überschreiten, die in dieser Größenordnung auch durchgeführt würde, wenn keine Auswahl erfolgt wäre. Der Belegungsfaktor f̅ als Durchschnitt aus n Einzelbelegungen wird samt den Namen und Größen der geprüften Tabellen in eine Datei mit Namen SLT_SIZES.txt auf dem ABAP-Applikationsrechner abgelegt. Analog zur Sicherung der Rangfolgen wird der Dateipfad automatisch ermittelt und die Datei nach erneutem Auslösen der GUI-Funktion Occupancy rate überschrieben. Deren Inhalt kann wie bei der Rangfolge durch Aufruf der Transaktion AL11 angezeigt werden kann. Da die Berechnung wegen der Einzelzugriffe auf die Datenbank zeitaufwendig ist, wird die Bearbeitung im Hintergrund durchgeführt. Sobald die Verarbeitung im Hintergrund abgeschlossen wurde, erhält derjenige Benutzer eine Systemnachricht, der die Transaktion gestartet hat. Zu diesem Zeitpunkt ist auch die Datei SLT_SIZES.txt verfügbar, die einen Belegungsgrad für jede Tabelle und davor die Durchschnittsbelegung für die vorgenommene Auswahl enthält. Die Güte des Belegungsfaktors f̅ könnte erhöht werden, wenn die Berechnung statt einer individuellen Auswahl eine Stichprobe verwenden würde, deren Umfang eine gewünschte Sicherheit z für die Gesamtgröße ST erfüllt. Gemäß den beiden Vorschlägen zu Beginn dieses Dokumentes würde eine derartige Lösung genau diejenigen Tabellen einbeziehen, deren Größen den Belegungsfaktor mit einer Wahrscheinlichkeit von x Є R+ Prozent bestätigen, stets bezogen auf die Gesamtgröße ST aller Tabellen. Umgekehrt könnte die Wahrscheinlichkeit bestimmt werden, die für die Genauigkeit des Belegungsfaktors hinsichtlich ST gilt, wenn eine Auswahl A < ST oder A << ST vorgenommen wurde. 7 Unter den Annahmen, dass die Tabellenanzahl N endlich ist und die Streuung der Verhältnisse s/s̈ einer Normalverteilung entspricht, könnte der Umfang der Stichprobe n < N bei einer absoluten Genauigkeit g = gr * f̅ und bekannter Varianz berechnet werden zu: 𝑛 n> N · z 2 · σ2 1 mit σ2 = ∑( s𝑖 − s̅ )2 2 2 2 (N − 1) · g + 𝑧 · σ n−1 Dabei wird die relative Genauigkeit meistens als Prozentwert angegeben mit der Vorgabe, dass der in der Stichprobe ermittelte Wert höchsten um | gr | vom wirklichen Wert der Grundgesamtheit abweichen darf. Die Aussagewahrscheinlichkeit der Stichprobe wird durch den Parameter z bestimmt, der als genormter Wert die Form einer mathematischen Konstante besitzt, die tabellarisch abgelegt ist. Größenbestimmung einzelner Tabellen Ein Doppelklick mit der linken Maustaste auf eine einzelne Zeile der Rangliste veranlasst, dass neben der Bruttogröße der ausgewählten Tabelle zusätzlich deren Nettowert in einem neuen Arbeitsbereich angezeigt wird, also nur die eigentlichen Anwenderdaten ohne jede Segmentvorbelegung. Dabei wird die Belegung der Tabelle als Verhältnis f = s/s̈ im Feld Rate angezeigt. Diese Art der Anzeige wird auch ausgeführt, wenn im Steuerbereich des SAP-Fensters ein Doppelklick auf den Knoten Table abgesetzt wird. Danach muss das Feld Table name mit einer Eingabe versehen und die Funktion Single size (F9) in der GUI-Oberfläche ausgelöst werden. Von hier aus können auch die Struktur (SE11) und Inhalte (SE16) einer einzelnen Tabelle angezeigt werden. Testvergleich Neben dem Funktionsbaustein /SDF/HANA_DB_SIZE wurden weitere Objekte getestet, die ebenfalls die tatsächliche Belegung einzelner Tabellen oder deren zukünftige Größe in einer HANA-Datenbank zur Verfügung stellen: 8 Die Tabelle DBSTATTORA liefert gemäß SAP-Hinweis 554031 für SAP-Systeme mit einer OracleDatenbank die statistische Tabellengröße samt Segmentvorbelegung durch Addition der Felder OCCTB + HTLMB, während die Felder NROWS * AROWL + HTLMB die tatsächliche Belegung ergeben. Der Funktionsbaustein /SDF/HANA_DB_SIZE gibt im Feld DATA_SIZE_SAMPLED die tatsächliche Größe einer einzelnen Tabelle mittels SQL-Skript aus, wobei der Laufzeit wegen nur signifikante Tabelleneinträge berücksichtigt werden. Der Report /SDF/HDB_SIZING ist Objekt des SAP-Hinweises 1872170 und dient ausschließlich der Bestimmung der Tabellengröße in einer HANA-Datenbank. Er berechnet die zukünftige Belegung anhand einer Stichprobe von höchstens 1000 Tabellenzeilen. Der Report ZJJ_TAB_REPORT berechnet die ABAP-Größe einer einzelnen Tabelle durch Addition der Einzelfelder. Ungenauigkeiten entstehen bei numerischen Feldern, deren Größe nur pauschal verfügbar ist und zudem von der Notation der jeweiligen Datenbank abhängt. Zur Messung der Inhalte wurde die ABAP-Nachrichtentabelle T100 ausgewählt, die vor allem im Feld Text eine breite Streuung aufweist. Die Prüfungen wurden am 25. August 2014 im Mandanten 001 des SAP-Systems BWV durchgeführt, dem als Speichermedium eine Oracle-Datenbank der Version 11.2.0.4.0 dient. Die nachfolgende Aufstellung enthält die Ergebnisse der einzelnen Objekte in MB: Objekt Tabelle Funktionsbaustein Report Report Bezeichnung DBSTATTORA /SDF/HANA_DB_SIZE /SDF/HDB_SIZING ZJJ_T100_REPORT Bruttogröße 207,17 207,17 - Nettogröße 130,92 114,88 223,58 HANA-Größe 48,78 - Da diese Aufstellung große Unterschiede zu Report ZJJ_TAB_REPORT Report aufweist, wurde eine zweite Messung mit der größten Tabelle /BI0/AFIGL_O0200 in diesem System durchgeführt, die folgende MB-Werte lieferte: Objekt Tabelle Funktionsbaustein Report Report Bezeichnung DBSTATTORA /SDF/HANA_DB_SIZE /SDF/HDB_SIZING ZJJ_T100_REPORT Bruttogröße 222 067,66 222 067,66 - Nettogröße 189 397,87 142 111,08 297 743,06 HANA-Größe 40 018,23 - Wie in der ersten Aufstellung hält sich auch hier die Abweichung zwischen der Statistik der OracleTabelle DBSTATTORA und dem verwendeten Funktionsbaustein /SDF/HANA_DB_SIZE in Grenzen, so dass die in Transaktion ZJJ_TAB_PROGRAM erzielten Resultate eine hinreichend genaue Bestimmung der tatsächlichen Tabellenbelegung und der damit verbundenen Dauer der Datenübertragung erwarten lassen. Zusammenfassung Obwohl für die Bestimmung von Tabellen- und Indexgrößen eine Vielzahl an Objekten verfügbar ist, fehlt genau der Baustein, der für die Lösung der Aufgabenstellung gesucht wurde. Gründe hierfür sind im Wesentlichen die folgenden: Einbeziehung von Segmentvorbelegungen Fehlende Verfügbarkeit für alle Datenbanken Unzureichende Formate von Datenobjekten Laufzeitverhalten bei großen Datenmengen Daher wird in Transaktion ZJJ_TAB_PROGRAM zunächst die Bruttogröße der Tabellen gemessen, mit der die Obergrenze der zu übertragenden Datenmenge bestimmt wird. Durch zusätzliche Prüfungen einzelner Tabellen und Berechnung des durchschnittlichen Belegungsfaktors kann gleichzeitig die zugehörige Untergrenze geschätzt werden. Diese Werte bestimmen wiederum ein Intervall, das für eine 9 durchzuführende Datenübertragung nach SAP HANA mit hinreichender Wahrscheinlichkeit weder übernoch unterschritten wird. Alle Entwicklungsobjekte, die im Rahmen dieses Projektes zur Umsetzung der vorgegebenen Aufgabe angelegt wurden, können nach Start der Transaktion SE80 im Mandanten 001 des SAP-System BWV angezeigt und bearbeitet werden, wenn als Objekt das Paket ZJJ eingegeben wird. Zwecks Transport in andere SAP-Systeme wurde der Auftrag BWVK900028 eröffnet, der in Transaktion SE09 unter dem Benutzer SAPSUPPORT abgelegt ist.