Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Forcer Oracle à renvoyer les lignes TOP N avec SKIP LOCKED

"D'après ce que j'ai vu, Oracle applique le prédicat WHERE avant de déterminer les lignes à ignorer."

Ouais. C'est la seule voie possible. Vous ne pouvez pas ignorer une ligne d'un jeu de résultats tant que vous n'avez pas déterminé le jeu de résultats.

La réponse est simplement de ne pas limiter le nombre de lignes renvoyées par l'instruction SELECT. Vous pouvez toujours utiliser les conseils FIRST_ROWS_n pour indiquer à l'optimiseur que vous ne saisirez pas l'ensemble de données complet.

Le logiciel appelant le SELECT ne doit sélectionner que les n premières lignes. En PL/SQL, ce serait

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;