7.6. LIMIT et OFFSET
LIMIT et OFFSET
vous permet de retrouver seulement une portion des lignes générées
par le reste de la requête :
SELECT liste_selection
FROM expression_table
[ ORDER BY expression_tri1 [ASC | DESC] [, expression_tri2 [ASC | DESC] ...] ]
[ LIMIT { nombre | ALL } ] [OFFSET nombre]
Si un nombre limite est donné, pas plus que ce nombre de lignes sera
renvoyé (mais peut-être moins si la requête récupère moins de
lignes). LIMIT ALL est identique à 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.
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 d'un plan 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 du fait que le SQL ne
promette par 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.