"От това, което видях, Oracle прилага предиката WHERE, преди да определи кои редове да пропусне."
Мда. Това е единственият възможен начин. Не можете да пропуснете ред от набор от резултати, докато не определите набора от резултати.
Отговорът е просто да не ограничавате броя на редовете, върнати от оператора SELECT. Все още можете да използвате съветите FIRST_ROWS_n, за да насочите оптимизатора към това, че няма да вземете пълния набор от данни.
Софтуерът, извикващ SELECT, трябва да избере само първите n реда. В PL/SQL би било
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;