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
4 Réponses :
Si vous êtes prêt à modifier le tableau, je suggérerais que vous ajoutez une colonne RWIPLED code> 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. P>
Il n'y a pas d'index non cluster ou en cluster dans Oracle - ils sont simplement appelés index.
@OMG Ponies Code>: Oui, mais il y a des clusters indexés dans
oracle code>! :)
@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 code> keyword i> dont je suis au courant n'existe pas dans Oracle.
@klausbyskov Code>: Dans
Oracle CODE> 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 code> appelle "une table sans index en clustere".
@Quassnoi Ok, merci pour la clarification. J'ai supprimé le mot non groupé i> de ma réponse.
@Quassnoi: Index de cluster: p asktom.oracle.com/pls/asktom/...
@OMG Ponies CODE>: C'est exactement ce que je parlais de :) Lorsque vous créez un index sur un cluster, le cluster devient un cluster indexé i>. télécharger-west.oracle.com/docs/ CD / B19306_01 / serveur.102 / B14200 / ... : Spécifier
index code> pour créer un cluster indexé i>
@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
Votre requête devra compter sur le premier Je ne fais pas Voir une commande et une question: Les utilisateurs cliquent-ils vraiment sur Si vous avez besoin de la dernière page, vous devez réécrire votre commande 90m code> pour obtenir le prochain
100 code>, il n'y a pas à peine une pièce d'amélioration.
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>
900k code> pages avant de se plaindre des performances? P>
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
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.
de l'un de vos commentaires: p>
La plupart du temps (environ 95% des temps) Les utilisateurs s'intéressent aux derniers (derniers) enregistrements p> blockQuote>
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? P>
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. P>
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: p> voir asktom p> p> Remarque: la clause SUPPORT SELECT SOCITION SUBTLE ainsi que l'utilisation de la requête RowID. P> 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. P> Ce sera meilleur que votre requête actuelle qui sera une balayage de table complète. P> P>