Documentation PostgreSQL 8.0.25 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 7. Requêtes | Avance rapide | Suivant |
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 [LIMIT { numero | ALL }] [OFFSET numero]
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 indique à ne pas spécifier la clause LIMIT.
OFFSET indique de passer ce nombre de lignes avant de renvoyer les lignes restantes. OFFSET 0 est identique à oublier la clause OFFSET. Si à la fois OFFSET et LIMIT apparaissent, alors les OFFSET lignes sont laissés 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 des lignes 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 obtenez 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.
Précédent | Sommaire | Suivant |
Tri de lignes | Niveau supérieur | Types de données |