7.6. LIMIT e OFFSET #

LIMIT e OFFSET (deslocamento) permitem recuperar apenas uma parte das linhas geradas pela consulta:

SELECT lista_de_seleção
    FROM expressão_de_tabela
    [ ORDER BY ... ]
    [ LIMIT { contador | ALL } ]
    [ OFFSET iní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.