LIMIT e OFFSET #
LIMIT e OFFSET (deslocamento)
permitem recuperar apenas uma parte das linhas geradas pela
consulta:
SELECTlista_de_seleçãoFROMexpressão_de_tabela[ ORDER BY ... ] [ LIMIT {contador| ALL } ] [ OFFSETinício]
Se for especificado o contador de limite, não será retornada mais que
esta quantidade de linhas (mas possivelmente menos, se a consulta
produzir menos linhas). LIMIT ALL é idêntico a
omitir a cláusula LIMIT, assim como
LIMIT com argumento nulo.
OFFSET diz para saltar esta quantidade de linhas
antes de começar a retornar as linhas. OFFSET 0
é idêntico a omitir a cláusula OFFSET, assim como
OFFSET com argumento nulo.
Se forem especificados OFFSET e
LIMIT, então serão saltadas
OFFSET linhas antes de começar a contar as
LIMIT linhas que serão retornadas.
Quando se utiliza LIMIT é importante utilizar a
cláusula ORDER BY para restringir a uma única ordem
as linhas do resultado. Caso contrário, será retornado um subconjunto
imprevisível de linhas da consulta; pode-se desejar obter da décima
à vigésima linha, mas da décima à vigésima de qual ordem?
A ordem é desconhecida, a não ser que seja especificado
ORDER BY.
O otimizador de consultas leva LIMIT em consideração
para gerar o plano da consulta, portanto é bastante provável obter
planos diferentes (produzindo uma ordem diferente das linhas)
dependendo do que for especificado para LIMIT e
OFFSET. Portanto, utilizar valores diferentes de
LIMIT/OFFSET para selecionar subconjuntos
diferentes do resultado da consulta
produz resultados inconsistentes,
a não ser que seja imposta uma ordem previsível do resultado por meio
da cláusula ORDER BY.
Isto não está errado; isto é uma consequência inerente ao fato do
SQL não prometer retornar os resultados de uma
consulta em qualquer ordem específica, a não ser que
ORDER BY seja utilizado para impor essa ordem.
As linhas saltadas pela cláusula OFFSET ainda têm
de ser computadas dentro do servidor; portanto, uma cláusula
OFFSET grande pode ser ineficiente.