「私が見たところ、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;