"Ud fra det, jeg har set, anvender Oracle WHERE-prædikatet, før det bestemmer, hvilke rækker der skal springes over."
Jep. Det er den eneste mulige måde. Du kan ikke springe en række over fra et resultatsæt, før du har bestemt resultatsættet.
Svaret er simpelthen ikke at begrænse antallet af rækker, der returneres af SELECT-sætningen. Du kan stadig bruge FIRST_ROWS_n-tipsene til at instruere optimeringsværktøjet om, at du ikke får fat i det fulde datasæt.
Softwaren, der kalder SELECT, bør kun vælge de første n rækker. I PL/SQL ville det være
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;