"Soweit ich gesehen habe, wendet Oracle das WHERE-Prädikat an, bevor bestimmt wird, welche Zeilen zu überspringen sind."
Jep. Es ist der einzig mögliche Weg. Sie können eine Zeile aus einer Ergebnismenge erst überspringen, wenn Sie die Ergebnismenge bestimmt haben.
Die Antwort ist einfach, die Anzahl der Zeilen, die von der SELECT-Anweisung zurückgegeben werden, nicht zu begrenzen. Sie können immer noch die Hinweise FIRST_ROWS_n verwenden, um dem Optimierer mitzuteilen, dass Sie nicht den vollständigen Datensatz abrufen werden.
Die Software, die SELECT aufruft, sollte nur die ersten n Zeilen auswählen. In PL/SQL wäre es
DECLARE
CURSOR c_1 IS
SELECT /*+FIRST_ROWS_1*/ qt.ID
FROM QueueTest qt
WHERE Locked IS NULL
ORDER BY PRIORITY
FOR UPDATE SKIP LOCKED;
BEGIN
OPEN c_1;
FETCH c_1 into ....
IF c_1%FOUND THEN
...
END IF;
CLOSE c_1;
END;