6
votes

Oracle & Pagination

J'ai une table Oracle avec un nombre record de 99896618.

J'ai besoin d'aller chercher de petits morceaux de données (disons 100 enregistrements) pour le montrer sur une page Web (dans WEB WORLD, nous appelons sa pagination). Actuellement, j'utilise la requête suivante pour accomplir que les utilisateurs ne sont pas satisfaits de la performance. P>

SELECT * FROM (select rownum rnum,f.* from  findings f where rownum<90000100 ) 
                    WHERE rnum > 90000000 


0 commentaires

4 Réponses :


1
votes

Si vous êtes prêt à modifier le tableau, je suggérerais que vous ajoutez une colonne RWIPLED sur la table (à l'aide d'un déclencheur d'insertion et d'une séquence pour la définir), puis vous ajoutez un index à celui-ci. colonne.


10 commentaires

Il n'y a pas d'index non cluster ou en cluster dans Oracle - ils sont simplement appelés index.


@OMG Ponies : Oui, mais il y a des clusters indexés dans oracle ! :)


@OMG Ponies: une clé principale est un indice en cluster à Oracle et tous les index de clé principale Aucun ne sont pas regroupés. Vous devez parler du non clustered keyword dont je suis au courant n'existe pas dans Oracle.


@klausbyskov : Dans Oracle World, il n'y a pas d'index regroupés ou non clusters, il existe des tables organisées et organisées par l'indice. Par défaut, les tableaux sont organisés par défaut, ce qui est ce que SQL Server appelle "une table sans index en clustere".


@Quassnoi Ok, merci pour la clarification. J'ai supprimé le mot non groupé de ma réponse.


@Quassnoi: Index de cluster: p asktom.oracle.com/pls/asktom/...


@OMG Ponies : C'est exactement ce que je parlais de :) Lorsque vous créez un index sur un cluster, le cluster devient un cluster indexé . télécharger-west.oracle.com/docs/ CD / B19306_01 / serveur.102 / B14200 / ... : Spécifier index pour créer un cluster indexé


@Quassnoi: Demandez à Tom> Oracle Documenation: P Btw: Backticaling Le nom d'utilisateur signifie qu'ils ne se présentent pas dans les commentaires du profil des utilisateurs - heureux de voir qu'ils ont mis en œuvre cela.


@Quassnoi et @OMG Ponies: J'étais en train de parler de clustered vs non clusterisé en termes de données de base de données générale, telle que décrite ici: en.wikipedia.org/wiki/index_%28database%29 Je pensais simplement que je voudrais le supprimer de ma réponse afin d'éviter que les commentaires bruyants suppriment le focus de l'OP de la Une idée générale de ma réponse, et pas nécessairement parce que je pensais que vous aviez raison :-p (bien que je puisse admettre que votre terminologie était plus correcte pour la SGBD spécifique en question)


@klausbyskov: Les index ne font pas partie de l'ANSI SQL, les fournisseurs utilisent une terminologie similaire. Si vous supprimez la réponse, vous perdrez le vote dans une recalculition. Et quassnoi est le bruyant: p



6
votes

Votre requête devra compter sur le premier 90m code> pour obtenir le prochain 100 code>, il n'y a pas à peine une pièce d'amélioration.

Je ne fais pas Voir une commande par code> Clause de votre sous-requête, mais vous l'avez probablement. Dans ce cas, vous voudrez peut-être créer un index sur celui-ci. P>

et une question: Les utilisateurs cliquent-ils vraiment sur 900k code> pages avant de se plaindre des performances? P> mise à jour: strong> p>

Si vous avez besoin de la dernière page, vous devez réécrire votre commande par code> colonne de la commande décroissante: p>

SELECT  *
FROM    (
        SELECT  rownum rnum, f.*
        FROM    findings f
        ORDER BY
                record_ordering_column DESC
        ) 
WHERE   rnum > 900
        AND rownum <= 100


1 commentaires

J'ai effectué un numéro de page facilement accessible en créant une liste déroulante des numéros de page (juste une description simplifiée, j'ai créé un contrôle personnalisé à travers lequel ils peuvent accéder facilement à 1000 pages). Peut-être que ceci est une information utile, la plupart du temps (environ 95% des temps), les utilisateurs sont intéressés par les derniers (derniers) enregistrements.



5
votes

de l'un de vos commentaires:

La plupart du temps (environ 95% des temps) Les utilisateurs s'intéressent aux derniers (derniers) enregistrements

Dans ce cas, pourquoi ne pas afficher les enregistrements dans l'ordre inverse, de sorte que 95% du temps s'intéressent à la page 1 plutôt que de la page 900 000?

S'ils veulent vraiment voir "Page 900 000", cela signifie qu'elles sont intéressées par des données depuis longtemps, permettez-leur de filtrer des données par ex. plage de date. Juste une pagination à travers 100 millions de rangées sans filtrage ne sera jamais performant.


0 commentaires

0
votes

Avez-vous vraiment besoin d'obtenir tout le lonnez-vous? Comme cela signifie que vous n'utilisez aucun index.

Si vous avez toujours besoin d'obtenir toute la ligne. Utilisez le motif suivant: xxx

voir asktom

Remarque: la clause SUPPORT SELECT SOCITION SUBTLE ainsi que l'utilisation de la requête RowID.

Si vous ajoutez un index sur record_ordering_column, puis La paganation utilisera l'index pour obtenir un ensemble de rajusts. Ensuite, ne chargez que les blocs contenant les lignes identifiées par leurs rails.

Ce sera meilleur que votre requête actuelle qui sera une balayage de table complète.


0 commentaires