Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Zwingen Sie Oracle, die TOP N-Zeilen mit SKIP LOCKED zurückzugeben

"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;