Also zunächst mal gefällt mir das
UP TO 1 ROWS nicht. Warum schreibst Du nicht einfach
SELECT SINGLE, anstatt eine Schleife mit nur einem Durchlauf aufzumachen?
Allerdings ist das nur eine kosmetische Anmerkung, die Dein Problem nicht lösen wird. Ich sehe die Gefahr, dass Du durch den JOIN halt viele Kreuzprodukte bekommst, da Du von keiner der beteiligten Tabellen den vollständigen Primärschlüssel angibst. Der SELECT sucht alle Materialien des Lieferanten und prüft bei jedem davon, ob es irgendein Werk gibt, in dem es das Dispositionsmerkmal VI hat. Du bekommst also
Anzahl Materialien des Lieferanten x Anzahl Werke Suchergebnisse, die dann sequentiell nach den übrigen Kriterien (Regellieferant, kein Löschkennzeichen) abgeprüft werden.
Du könntest die Performance sicherlich erhöhen, indem Du auch das Werk (MARC-WERKS) angibst, sofern Du das eingrenzen kannst. Ansonsten wäre auch ewx' Ansatz möglich, auf der MARC einen neuen Index MATNR/DISMM zu definieren. Auch auf der EINA könntest Du einen Index LIFNR/RELIF anlegen. Allerdings sollte man mit Indizes sparsam umgehen und möglichst keine Datenbankindizes anlegen, die man nur in einem einzigen Programm braucht.
Ich bezweifle aber, dass dieser SELECT einzeln ein nennenswertes Performanceproblem aufwirft. Vermutlich hast Du da eine LOOP-Schleife, in der Du ihn häufiger ausführst. Hast Du das Problem nur in dem einen Report, dann kannst Du Dir auch dort eine lokale Pufferung anlegen. Beispielsweise könntest Du sagen:
Code: Alles auswählen.
DATA: BEGIN OF WA,
PARNR LIKE EINA-LIFNR,
VIX LIKE EINA-RELIF,
END OF WA.
DATA MARC_PUFFER TYPE SORTED TABLE OF MATNR WITH UNIQUE KEY TABLE_LINE.
* einmal zu Programmbeginn Puffer füllen mit:
SELECT DISTINCT MATNR INTO TABLE MARC_PUFFER FROM MARC
WHERE DISMM = 'VI'.
* Dein optimierter, öfters im Programm verwendeter SELECT:
SELECT RELIF INTO WA-VIX FROM EINA UP TO 1 ROWS
FOR ALL ENTRIES IN MARC_PUFFER WHERE LIFNR = WA-PARNR
AND MATNR = MARC_PUFFER-TABLE_LINE
AND RELIF = 'X'
AND LOEKZ = SPACE.
ENDSELECT.
In dem Fall brauchst Du tatsächlich den UP TO 1 ROWS, weil FOR ALL ENTRIES IN mit SELECT SINGLE nicht funktioniert.
Alternativ könntest Du auch andersrum herangehen, alle Materialien des Lieferanten puffern und dann den SELECT auf der MARC machen. Was besser ist, hängt von den Umständen in Deinem Programm ab. Aber so hast Du nur einen dicken SELECT zu Programmbeginn.
Wenn Du den SELECT richtig viel im Programm brauchst (und Dein Performanceproblem könnte ein Hinweis darauf sein), dann kannst Du sogar beides puffern und dann nur noch im Hauptspeicher arbeiten. Das ist dann richtig rasant, HANA-style.