Parallele Verarbeitung mit MAP_MERGE

Parallele Verarbeitung mit MAP_MERGE

Veröffentlicht am 21. November 2019 von

Jörg Brandeis

| News | SAP HANA | SQLScript |

Mit der Version 2.0 der SAP-HANA-Datenbank ist noch ein nützlicher Operator in SQLScript für deklarativen Code hinzugekommen: MAP_MERGE. Mit ihm lässt sich das gelegentlich vorkommende Problem lösen, dass für alle N Zeilen einer Tabelle eine Tabellenfunktion ausgeführt werden soll. Die N Ergebnistabellen sollen dann per UNION zusammengefasst werden. Der MAP_MERGE-Operator kann diese Aufgabe parallelisieren.

Ohne MAP_MERGE benötigt man imperatives Coding mit einer Schleife über der Tabelle. Durch den Operator kann man diese sequenzielle Verarbeitung vermeiden. Das Beispiel in Listing 1.52 zeigt die Verwendung des Operators. Hier wird für eine Menge von Tabellennamen die Anzahl der Datensätze ermittelt. Das entsprechende dynamische SQL (Siehe auch 6.7, Dynamisches SQL ausführen) für den Tabellennamen wird in der Tabellenfunktion MAP_TABLE_ROW_COUNT erzeugt und ausgeführt.

--Anlegen der MAP-Funktion
CREATE FUNCTION map_table_row_count(IN iv_tabname nvarchar(30))
RETURNS TABLE (tabname  NVARCHAR(30),
               rowcount INT )
AS BEGIN
    DECLARE lv_sql NVARCHAR(100);
    DECLARE lt_result TABLE( tabname  NVARCHAR(30),
                             rowcount INT );
    EXEC 'SELECT ''' 
         || :iv_tabname 
         || ''' AS tabname, '
         || 'COUNT(*) as rowcount '
         || 'FROM '
         || :iv_tabname 
         INTO lt_result;
    RETURN SELECT * FROM :lt_result;
END;

--Aufruf des MAP_MERGE Operators in einem Anonymen Block 
DO BEGIN 

  lt_table = SELECT left(table_name,30) AS tabname
               FROM m_cs_tables
              WHERE schema_name = 'SYSTEM';             
  lt_result = MAP_MERGE( :lt_table, 
                         map_table_row_count(
                                      :lt_table.tabname) );
  SELECT * FROM :lt_result;      
END;

Listing: Verwendung des MAP_MERGE Operators

In dem anonymen Block werden alle Tabellennamen aus dem Schema SYSTEM ausgelesen. Damit werden dann mit dem MAP_MERGE Operator und der Tabellenfunktion MAP_TABLE_ROW_COUNT die Einträge gezählt. Das Ergebnis können Sie in der folgenden Abbildung sehen.

3 MAP MERGE

Abbildung: Ergebnis des Listings

Sowohl MAP_MERGE als auch MAP_REDUCE gehören zum Bereich der deklarativen Programmierung. Sie bieten sich vor allem dann an, wenn ansonsten Prozeduren oder Funktionen in einer Schleife aufgerufen werden müssten. Das ist insbesondere deshalb vorteilhaft, weil die MAP und REDUCE Funktionen häufig imperative Logik enthalten, die somit parallel ausgeführt werden kann.