SELECT – ENDSELECT

Dies ist Teil 2 von 10 der Serie Performance-Workshop

Eine der häufigsten Anweisungen: Das Lesen mehrerer Sätze von der Datenbank. Hier erfahren Sie, was dabei besonders zu beachten ist und was Sie vermeiden sollten.

Einer der häufigsten Fehler ist die Selektion von mehreren Datensätzen mittels einer SELECT-Schleife:

SELECT * FROM tabelle WHERE feld1 = …
  “Anweisung 1
  “Anweisung 2
ENDSELECT.

Der große Fehler hierbei ist, dass die Verbindung zu der Datenbank während der gesamten Verarbeitung aufrecht erhalten wird.

Stellen Sie sich vor, Sie sitzen in einem Autohaus und möchten sich über das Modell “AB600” informieren. Sie bitten den hilfsbereiten Verkäufer: “Bringen Sie mir doch mal alles, was Sie über das Modell “AB600″ an Informationen haben!”.

Der Verkäufer läuft also los und bringt den ersten Prospekt. Sie sehen sich den Prospekt durch während der Verkäufer sich wieder anderen Aufgaben widmet.

Dann rufen Sie ihn wieder und bitten ihn um den nächsten Prospekt. Der Verkäufer läuft wieder zu dem Ständer – während Sie nun warten – und bringt die nächste Infobroschüre.

Wenn es gerade sehr voll ist in dem Autohaus, kann es sogar sein, dass Sie warten müssen, bis der Verkäufer wieder Zeit für Sie hat.

Sehr zeitaufwändig, oder?

Deswegen ist es immer schneller, alle benötigten Daten in einem Rutsch in eine interne Tabelle zu lesen.

Vorteile:

  1. Die Datenbank muss nur einmal Daten sammeln und übergeben
  2. Das Programm kann uneingeschränkt mit diesen Daten arbeiten und ist nicht darauf angewiesen, dass die Datenbank den nächsten Satz bereitstellt. Der Verwaltungsaufwand ist also deutlich geringer.

So sieht dann das Coding dafür aus:

SELECT * FROM tabelle INTO TABLE itab WHERE feld1 = … .

Die interne Tabelle muss dabei genau so definiert sein, wie die Datenbanktabelle.

Speicherverbrauch

Der Nachteil bei dieser Methode ist allerdings, dass mehr Hauptspeicher für die Speicherung in der internen Tabelle verwendet werden muss.

Deshalb sollte bei sehr großen Datenmengen die Anzahl der Sätze begrenzt und in mehreren Blöcken gelesen werden.

PACKAGE-SIZE

Der SELECT-Zusatz PACKAGE-SIZE ist sehr hilfreich und angeraten, wenn ungewöhnlich große Datenmengen – je nach Tabellenbreite: ab 500.000 Datensätze – verarbeitet werden sollen.

SELECT * FROM ddictab1 INTO TABLE gt_data1 PACKAGE SIZE 10000.
  SELECT * FROM ddictab2 INTO gt_data2
     FOR ALL ENTRIES OF gt_data1
   WHERE field1 = gt_data1-field1

  LOOP AT gt_data ASSIGNING <data>.
   “data processing here
  ENDLOOP.

ENDSELECT.

Die Blockgröße muss angegeben werden. Ideale Werte variieren von System zu System. Hier hilft häufig nur ausprobieren.

Enno Wulff
Letzte Artikel von Enno Wulff (Alle anzeigen)
Series Navigation<< EinleitungSELECT mit Feldleiste >>