Não estou tão familiarizado com o Oracle quanto gostaria. Tenho cerca de 250 mil registros e desejo exibi-los 100 por página. Atualmente, tenho um procedimento armazenado que recupera todos os registros de um quarto de milhão para um conjunto de dados usando um adaptador de dados e um conjunto de dados e o método dataadapter.Fill (conjunto de dados) nos resultados do proc armazenado. Se eu tiver "Número da página" e "Número de registros por página" como valores inteiros, posso passar como parâmetros, qual seria a melhor maneira de voltar apenas aquela seção específica. Digamos que, se eu passar 10 como número de página e 120 como número de páginas, a partir da declaração selecionada, isso me daria de 1880 a 1200, ou algo parecido, minha matemática pode estar errada.
Estou fazendo isso em .NET com C #, mas isso não é importante, se conseguir acertar no lado sql, então devo ficar bem.
Atualização: Consegui usar a sugestão de Brian e está funcionando muito bem. Eu gostaria de trabalhar em alguma otimização, mas as páginas estão chegando em 4 a 5 segundos, em vez de um minuto, e meu controle de paginação foi capaz de se integrar muito bem com meus novos procs armazenados.
fonte
WHERE
não podiam ser combinados eAND
, em seguida, encontrei: orafaq.com/wiki/ROWNUMPergunte ao Tom sobre paginação e funções analíticas muito, muito úteis.
Este é um trecho dessa página:
fonte
No interesse da completude, para quem procura uma solução mais moderna, no Oracle 12c existem alguns novos recursos, incluindo melhor paginação e tratamento superior.
Paging
A paginação se parece com isto:
Top N Records
Obter os principais registros se parece com isto:
Observe como os dois exemplos de consulta acima têm
ORDER BY
cláusulas. Os novos comandos os respeitam e são executados nos dados classificados.Não consegui encontrar uma boa página de referência do Oracle para
FETCH
ou,OFFSET
mas esta página tem uma ótima visão geral desses novos recursos.atuação
Como @wweicker aponta nos comentários abaixo, o desempenho é um problema com a nova sintaxe do 12c. Eu não tinha uma cópia do 18c para testar se a Oracle o melhorou desde então.
Curiosamente, meus resultados reais foram retornados um pouco mais rápido na primeira vez que executei as consultas em minha tabela (mais de 113 milhões de linhas) para o novo método:
No entanto, como @wweicker mencionou, o plano de explicação parece muito pior para o novo método:
A nova sintaxe causou uma varredura completa do índice na minha coluna, que era o custo total. Provavelmente, as coisas ficam muito piores ao limitar os dados não indexados.
Vamos dar uma olhada ao incluir uma única coluna não indexada no conjunto de dados anterior:
Resumo: use com cuidado até que o Oracle melhore esse manuseio. Se você tem um índice para trabalhar, talvez consiga usar o novo método.
Espero ter uma cópia do 18c para brincar em breve e poder atualizar
fonte
Quero apenas resumir as respostas e comentários. Existem várias maneiras de fazer uma paginação.
Antes do oracle 12c, não havia funcionalidade OFFSET / FETCH, então dê uma olhada no white paper como o @jasonk sugeriu. É o artigo mais completo que encontrei sobre diferentes métodos, com explicação detalhada das vantagens e desvantagens. Levaria muito tempo para copiá-los e colá-los aqui, então não vou fazer isso.
Há também um bom artigo dos criadores do jooq explicando algumas advertências comuns com o oracle e a paginação de outros bancos de dados. postagem do blog de jooq
Boas notícias, desde o oracle 12c temos uma nova funcionalidade OFFSET / FETCH. Novos recursos do OracleMagazine 12c . Consulte "N principais consultas e paginação"
Você pode verificar sua versão do oracle emitindo a seguinte declaração
fonte
Experimente o seguinte:
via [tecnicume]
fonte
No meu projeto usei Oracle 12c e java . O código de paginação é parecido com este:
fonte