Performanzproblem

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

Performanzproblem

Beitrag von erubadhron (ForumUser / 34 / 16 / 0 ) »
Hallo zusammen!
Ich habe ein kleines Report geschrieben, das alle Elemente einer Spalte in einer Tabelle zählt, und
dann das Ergebnis in einem ALV ausgibt.Mein Problem ist, dass bei sehr großen Tabellen, das Programm abstürtzt, bzw. ich bekomme ein Kurzdump
wegen Timeout.

Code: Alles auswählen.

SELECT (pa_spalt) from (gd_tablename)
             into <fs_temp>
             GROUP BY (lv_group).
  IF <fs_temp> IS INITIAL.
    CONCATENATE gv_spaltenname ' = ' '<fs_temp>' INTO lv_spalte SEPARATED BY SPACE.
*    CONCATENATE gv_spaltenname  ' IS NULL'  INTO lv_spalte.
    ELSE.
   CONCATENATE gv_spaltenname ' = ' '<fs_temp>' INTO lv_spalte SEPARATED BY SPACE.
  ENDIF.
  CREATE DATA ls_ergebnis-lv_tabspalte type (zeile-rollname).
  ASSIGN ls_ergebnis-lv_tabspalte->* TO <fs_tabspalt>.
  SELECT COUNT( * )
         from (gd_tablename)
         into count
         where (lv_spalte).
    <fs_tabspalt> = <fs_temp>.
    ls_ergebnis-number = count.
*  WRITE:/ 'Spalte:',lv_augrp,'  ', 'Anzahl:',count.
  APPEND ls_ergebnis TO lt_ergebnistab.
 ENDSELECT.
Laut dem Dump liegt mein Problem bei SELECT COUNT ( * ).

Ich wäre für jede Hilfe dankbar.

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


Re: Performanzproblem

Beitrag von a-dead-trousers (Top Expert / 4484 / 231 / 1205 ) »
Ganz einfach:
Eine Abfrage ob eine Spalte einen bestimmten Wert hat oder leer ist, ist bei nicht indizierten Spalten immer mit einem Full-Table-Scan verbunden. Es muss also wirklich jede Zeile der Tabelle ausgewertet werden und man hat keinen "schnellen" Zugriff darauf.

Meines Erachtens solltest du das ganz anders aufbauen:
Alle für die Auswertung relevanten Spalten der Tabelle in einem Schritt selektieren.
In der Where-Bedingung die Bedingungen für die Felder mit OR verknüpfen.
Das Ergebnis dann im Programm händisch auswerten.

Damit bleibt nur ein einziger Full-Table-Scan pro Tabelle übrig und das ist sicher performanter.

Nur versteh ich leider nicht was eine solche Auswertung überhaupt bringen soll.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
erubadhron

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Performanzproblem

Beitrag von erubadhron (ForumUser / 34 / 16 / 0 ) »
Danke für den Tipp.
Ich habe es so gelöst:

Code: Alles auswählen.

CONCATENATE gv_spaltenname 'COUNT( * ) ' into lv_select SEPARATED BY SPACE.
SELECT (lv_select)
         from (gd_tablename)
         into TABLE lt_ergebnistab PACKAGE SIZE 1000
         GROUP BY (lv_group).
ENDSELECT.
und es funktioniert auch für sehr große Tabellen :)

Seite 1 von 1

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

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.