J'utilise le même morceau de code de pagination sql pendant des années .. et je ne l'ai maintenant remarqué cette bizarrerie .. Je pense qu'il est assez intéressant, et nous devrions en discuter . Voici donc la norme passe-partout en page:pagination sql quand « triez par » non-déterministe
SELECT a.*
FROM (SELECT b.*,
rownum b_rownum
FROM (SELECT c.*
FROM some_table c
ORDER BY some_column) b
WHERE rownum <= <<upper limit>>) a
WHERE b_rownum >= <<lower limit>>`
qui fonctionne fantastique si some_column est séquentiel.
mais j'exposer cela et permettant à l'utilisateur de trier sur une colonne, et si elles arrivent à choisir some_column qui est plein des mêmes valeurs - la pagination « casse ».
c'est-à-dire la requête renverra la même page de données exactes de la ligne après page. Et en y réfléchissant, pourquoi pas. il sélectionne probablement simplement les lignes les plus rapides ou tout ce qui passe le filtre.
donc par exemple, ces sql renvoient exactement les mêmes données
select *
from (select a.*, ROWNUM rnum
from (select * from xsd order by PREFIX asc) a
where ROWNUM <= 30
)
where rnum >= 20;
select *
from (select a.*, ROWNUM rnum
from (select * from xsd order by PREFIX asc) a
where ROWNUM <= 40
)
where rnum >= 30;
surtout, je pensais juste que était propre & je ne vois pas beaucoup de ce côté-effet dans d'autres postes.
Et aussi, je me suis demandé ce que je pouvais faire à ce sujet .. et si d'autre stratégie ajouterait le temps de traitement.
SOLUTION de Gordon, Alex
ajouter juste le rowid comme ordre final par défaut par. ces SQL sont maintenant différents. Je ne l'ai pas remarqué de changement dans le temps de réponse
select *
from (select a.*, ROWNUM rnum
from (select * from xsd order by PREFIX asc, rowid) a
where ROWNUM <= 30
)
where rnum >= 20;
select *
from (select a.*, ROWNUM rnum
from (select * from xsd order by PREFIX asc, rowid) a
where ROWNUM <= 40
)
where rnum >= 30;
une autre victoire pour stackoverflow, gentelmen remercie, heureux tout le monde codage
Tag les DBMS utilisés. Ajoutez quelques exemples de données de table et ancien vs nouveau résultat. – jarlh
J'ai ajouté une balise oracle, oui, je peux facilement fournir des timings avant et après. la seule chose à savoir sur les données est qu'il y a des milliers de 'PREFIX' avec la même valeur. –