LIMIT
et OFFSET
#
LIMIT
et OFFSET
vous permettent de retrouver seulement
une portion des lignes générées par le reste de la requête :
SELECTliste_selection
FROMexpression_table
[ ORDER BY ...] [ LIMIT {nombre
| ALL } ] [OFFSETnombre
]
Si un nombre limite est donné, pas plus que ce nombre de lignes ne sera renvoyé
(mais peut-être moins si la requête récupère moins de lignes). LIMIT
ALL
revient à ne pas spécifier la clause LIMIT
.
OFFSET
indique de passer ce nombre de lignes avant de renvoyer
les lignes restantes. OFFSET 0
revient à oublier la clause
OFFSET
, tout comme OFFSET
avec un argument
NULL.
Si à la fois OFFSET
et LIMIT
apparaissent, alors les OFFSET
lignes sont laissées avant de
commencer le renvoi des LIMIT
lignes.
Lors de l'utilisation de LIMIT
, il est important d'utiliser une
clause ORDER BY
contraignant les lignes résultantes dans un ordre
unique. Sinon, vous obtiendrez un sous-ensemble non prévisible de lignes de
la requête. Vous pourriez demander les lignes de 10 à 20, mais dans quel
ordre ? L'ordre est inconnu si vous ne spécifiez pas ORDER
BY
.
L'optimiseur de requêtes prend LIMIT
en compte lors de la
génération des plans de requêtes, de façon à ce que vous obteniez
différents plans (avec différents ordres de lignes) suivant ce que vous
donnez à LIMIT
et OFFSET
. Du coup, utiliser des
valeurs LIMIT
/OFFSET
différentes pour sélectionner
des sous-ensembles différents d'un résultat de requête donnera des
résultats inconsistants sauf si vous forcez un ordre de
résultat prévisible avec ORDER BY
. Ceci n'est pas un bogue ;
c'est une conséquence inhérente au fait que le SQL ne promette pas de
délivrer les résultats d'une requête dans un ordre particulier sauf si
ORDER BY
est utilisé pour contraindre l'ordre.
Les lignes passées par une clause OFFSET
devront toujours être
traitées à l'intérieur du serveur ; du coup, un OFFSET
important peut être inefficace.