Where-Bedingung

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

In aller Regel sollten alle einschränkenden Bedingungen in die Where-Klausel aufgenommen werden. Die Datenbank kann so den Schlüssel oder Indizes nutzen und die Netzlast für die Übertragung von Datensätzen ist am geringsten.

Angabe Key-Felder / Sekundärindexfelder

  • Selbst wenn die Datenmenge durch die Angabe eines Feldes nicht eingeschränkt wird (wenn immer der gleiche Wert im Feld steht), kann es eine Performanceverbesserung bringen dieses Feld in die Where-Bedingung zu füllen, wenn dieses Feld in einem Index (oder sogar im Primärkey) enthalten ist.

Where-Felder nicht übergeben

  • Vorsicht bei einem Inner-Join welchen Weg der Datenbankoptimizer einschlägt, um die Datenmenge schrittweise zu verkleinern.
  • In seltenen Fällen ist es vorteilhaft die Where-Bedingung um Bedingungen zu bereinigen, um die Datenbank dazu zu "zwingen", einen bestimmten Weg zu gehen, von dem man aufgrund der Datenmengen (über SE16) weiß, das er der optimale Weg ist - und dann die anderen Bedingungen außerhalb des Inner-Joins abzufragen.

Reihenfolge Where-Felder

  • Sehr umstritten ist, ob es einen Performancevorteil bringt, wenn man die Select- und Where-Felder eines SQL-Statements in der Reihenfolge angibt, in der sie auf der Datenbank stehen. Ob das einen Vorteil bringt, hängt sicher von der Datenbank und dessen Release-Stands ab. Es hat mir jedoch ein fähiger Basisbetreuer versichert, dass das (in einer Oracle-Umgebung) sehr große Auswirkungen auf die Performance haben kann. Wenn z. B. die Felder in der Where-Bedingung nicht in der Reihenfolge angegeben sind, wie sie im Index definiert sind, könnte es passieren, dass dieser Index vom Datenbankoptimizer nicht gefunden wird.
  • Eigene Erfahrungen, die die Relevanz der Reihenfolge der abgefragten Felder bestätigen, habe ich nicht. Schaden kann es sicher nicht, die Felder in der Reihenfolge anzugeben, in der sie auch in der Tabelle stehen.

Laufzeitfehler bei sehr vielen Select-Options-Einträgen

  • Sind Tausende Datensätze in einem Select-Options/Range, der in der Where-Bedingung abgefragt wird, kann es zu einem Laufzeitfehler „Der Open SQL command is too big“ führen. Der String, der an die Datenbank übergeben wird, löst die Select-Options/Range-Einträge in Tausende Zeilen mit einer OR-Bedingung auf. Es gibt auf Datenbankebene eine Begrenzung der Länge dieses SQL-Strings. Diese Länge hängt von der Datenbank und vom Datenbankversionsstand ab.

SQLDump2.JPG


Wenn abzusehen ist, dass ein Select-Options sehr groß werden kann, dann sollte man besser den Select auf eine Select-Endselect-Schleife umstellen oder die Datensätze in einem Loop abfragen. Die Datenbank wird gewöhnlich die internen Datenbankabfragen so optimieren, dass trotzdem eine hohe Performance bei der Gesamtabfrage ist, auch wenn die Gesamtabfrage in Tausende Einzelselects gesplittet wurden.

  DATA: lrt_objky TYPE RANGE OF nast-objky.

  IF s_objky IS INITIAL.
    SELECT *
      INTO CORRESPONDING FIELDS OF TABLE pct_itab
      FROM nast
      WHERE
       kappl  = p_kappl  AND "Applikation
       objky IN s_objky  AND "Objektschlüssel
       kschl  = p_kschl  AND "Nachrichtenart
       spras IN s_spras  AND "Sprache
       parnr IN s_parnr  AND "Partnernummer
       parvw IN s_parvw  AND "Partnerrolle
       erdat IN s_erdat  AND "Erstellungsdatum
       nacha IN s_nacha  AND "Medium
       datvr IN s_datvr  AND "Verarbeitungsdatum
       usnam IN s_usnam  AND "Benutzer
       vstat IN s_vstat  AND "Versandstatus
       vsztp IN s_vsztp.     "Verarbeitszeitpunkt
  ELSE.

    LOOP AT s_objky.
      CLEAR lrt_objky.
      APPEND s_objky TO lrt_objky.

      SELECT *
        APPENDING CORRESPONDING FIELDS OF TABLE pct_itab
        FROM nast
        WHERE
         kappl  = p_kappl   AND "Applikation
         objky IN lrt_objky AND "Objektschlüssel
         kschl  = p_kschl   AND "Nachrichtenart
         spras IN s_spras   AND "Sprache
         parnr IN s_parnr   AND "Partnernummer
         parvw IN s_parvw   AND "Partnerrolle
         erdat IN s_erdat   AND "Erstellungsdatum
         nacha IN s_nacha   AND "Medium
         datvr IN s_datvr   AND "Verarbeitungsdatum
         usnam IN s_usnam   AND "Benutzer
         vstat IN s_vstat   AND "Versandstatus
         vsztp IN s_vsztp.      "Verarbeitszeitpunkt

    ENDLOOP.
  ENDIF.