Je ne suis pas aussi familier avec Oracle que je le souhaiterais. J'ai quelque 250 000 enregistrements et je souhaite en afficher 100 par page. Actuellement, j'ai une procédure stockée qui récupère tous les quart de million d'enregistrements dans un ensemble de données à l'aide d'un adaptateur de données, d'un ensemble de données et de la méthode dataadapter.Fill (ensemble de données) sur les résultats de la procédure stockée. Si j'ai "Numéro de page" et "Nombre d'enregistrements par page" comme valeurs entières que je peux passer en paramètres, quelle serait la meilleure façon de ne récupérer que cette section particulière. Dites, si je passe 10 comme numéro de page et 120 comme nombre de pages, à partir de l'instruction select, cela me donnerait le 1880e au 1200e, ou quelque chose comme ça, mes calculs dans ma tête pourraient être faux.
Je fais cela en .NET avec C #, je pensais que ce n'était pas important, si je peux le faire directement du côté SQL, alors je devrais être cool.
Mise à jour: J'ai pu utiliser la suggestion de Brian, et cela fonctionne très bien. J'aimerais travailler sur une optimisation, mais les pages arrivent dans 4 à 5 secondes plutôt qu'une minute, et mon contrôle de pagination a pu s'intégrer très bien avec mes nouveaux processus stockés.
la source
WHERE
ne pouvaient pas être combinés avecAND
, puis j'aiDemandez à Tom la pagination et les fonctions analytiques très, très utiles.
Voici un extrait de cette page:
la source
Dans un souci d'exhaustivité, pour les personnes à la recherche d'une solution plus moderne, Oracle 12c propose de nouvelles fonctionnalités, notamment une meilleure pagination et une meilleure gestion.
Pagination
La pagination ressemble à ceci:
Top N records
Obtenir les meilleurs enregistrements ressemble à ceci:
Notez que les deux exemples de requêtes ci-dessus ont des
ORDER BY
clauses. Les nouvelles commandes respectent ces derniers et sont exécutées sur les données triées.Je n'ai pas trouvé de bonne page de référence Oracle pour
FETCH
ouOFFSET
mais cette page a un bon aperçu de ces nouvelles fonctionnalités.Performance
Comme @wweicker le souligne dans les commentaires ci-dessous, les performances sont un problème avec la nouvelle syntaxe de 12c. Je n'avais pas de copie de 18c pour tester si Oracle l'a amélioré depuis.
Fait intéressant, mes résultats réels ont été renvoyés un peu plus rapidement la première fois que j'ai exécuté les requêtes sur ma table (113 millions + lignes) pour la nouvelle méthode:
Cependant, comme @wweicker l'a mentionné, le plan d'explication semble bien pire pour la nouvelle méthode:
La nouvelle syntaxe a provoqué une analyse complète de l'index de ma colonne, ce qui représentait le coût total. Il y a de fortes chances que les choses empirent en se limitant aux données non indexées.
Jetons un coup d'œil lors de l'inclusion d'une seule colonne non indexée dans l'ensemble de données précédent:
Résumé: à utiliser avec précaution jusqu'à ce qu'Oracle améliore cette gestion. Si vous avez un index avec lequel travailler, vous pouvez peut-être vous en sortir avec la nouvelle méthode.
J'espère que j'aurai bientôt une copie de 18c avec laquelle jouer et que je pourrai mettre à jour
la source
Je veux juste résumer les réponses et les commentaires. Il existe plusieurs façons de réaliser une pagination.
Avant oracle 12c, il n'y avait pas de fonctionnalité OFFSET / FETCH, alors jetez un œil au livre blanc comme le suggère @jasonk. C'est l'article le plus complet que j'ai trouvé sur les différentes méthodes avec une explication détaillée des avantages et des inconvénients. Il faudrait beaucoup de temps pour les copier-coller ici, donc je ne le ferai pas.
Il y a aussi un bon article des créateurs de jooq expliquant certaines mises en garde courantes concernant la pagination d'Oracle et d'autres bases de données. article de blog de jooq
Bonne nouvelle, depuis oracle 12c nous avons une nouvelle fonctionnalité OFFSET / FETCH. Nouvelles fonctionnalités d'OracleMagazine 12c . Veuillez vous référer à "Requêtes et pagination Top-N"
Vous pouvez vérifier votre version d'Oracle en émettant la déclaration suivante
la source
Essayez ce qui suit:
via [tecnicume]
la source
Dans mon projet, j'ai utilisé Oracle 12c et java . Le code de pagination ressemble à ceci:
la source