Okay, das wusste ich nicht. Ich hab mir immer gedacht das hängt mit der "maximalen" Länge zusammen die ein nativ SQL-Statement werden darf und 5 schien mir ein guter Wert zu sein, wenn man alle möglichen Kombinationen aus I/E und BT, EQ, NE usw. berücksichtigt.
Wie gesagt, bei Sybase (womit wir arbeiten) ist der empfohlene Wert 128. Damit sinkt dann die Zahl der einzelnen Datenbankanfragen im Vergleich zum einzeln Durchhecheln mit SELECT SINGLE rasch mal auf unter 1%.
(Sybase hat dafür andere Nachteile, und wie die Gesamtperformance von Sybase gegenüber Oracle ist, maße ich mir sowieso nicht an zu beurteilen. Einen Gesamtperformancegewinn hat der Umstieg von Oracle auf Sybase bei uns damals jedenfalls nicht gebracht.)
Auf jeden Fall stelle ich fest, dass die Performance exzellent ist, wann immer ich FOR ALL ENTRIES in verwende, weswegen ich mich bemühe, dies möglichst häufig zu tun und benötigte Daten in internen Puffertabellen zwischenzuspeichern, bevor ich Einzelwerte daraus lese. Hauptspeicher ist ja heute kein Problem mehr. Trotzdem bemühe ich mich, diese Puffertabellen auf die für mich relevanten Spalten zu beschränken
(also kein SELECT * zu puffern) und im Programmcode nach der Ermittlung der eigentlich benötigten Ergebnisdaten, also wenn ich die Puffertabelle nicht mehr brauche, einen FREE-Befehl abzusetzen. Dann ist der Hauptspeicher schon wieder frei, während der Benutzer das ALV begutachtet
(oder was immer das jeweilige Programm da tun mag).
Wie gesagt, ich weiß nicht, wie ABAP eine RANGES-Tabelle mit lauter Einzelwerten in Native SQL umsetzt, aber die können da ja auch nur mit Wasser kochen. Interessanterweise kann ich mich erinnern, mal ausgetestet zu haben bis wieviel abgefragten Einzelwerten der FOR ALL ENTRIES in schneller ist als ein Kompletteinlesen der Datenbanktabelle ohne entsprechende WHERE-Bedingung
(was ja nur einen einzigen, freilich dicken, Datenbankzugriff bedeutet). Ganz genau kann ich mich an das Ergebnis nicht mehr erinnern, aber ich weiß, dass der Wert bedeutend höher lag, als ich angenommen hätte. Ich glaube, wenn Du 70% der Zeilen der Datenbanktabelle über FOR ALL ENTRIES IN mit Primärschlüssel einliest, dann geht das immer noch schneller, als wenn Du auf eine WHERE-Bedingung verzichtest und alles einliest. Wobei das, wie gesagt, für Sybase gilt. Keine Ahnung, wie das bei Oracle aussehen würde.
Bei Ranges die nur I und EQ beinhalten, hat unsere alte Oracle-DB (jetzt haben wir HANA) mit "IN (...)" gearbeitet und auch bei großen Mengen immer den Index gezogen. Daher hab ich angefangen große FOR ALL ENTRIES nach Möglichkeit in Ranges zu packen und es hatte signifikante Performanceverbesserungen gebracht.
Ich kann nur wiedergeben, was mir aus den einschlägigen SAP-Hinweisen zum Thema "Systemparametereinstellung für den IN-Operator" in Erinnerung ist. Mittlerweile verblasst meine Erinnerung daran auch etwas.