Nous utilisons le ici technique de mise en page suivante:Pagination sur de grands ensembles de données? - Abandonner count (*) après un certain temps
- obtenir
count(*)
de filtre donné - obtenir 25 premiers enregistrements de filtre donné
-> render quelques liens de pagination sur la page
Cela fonctionne plutôt bien tant que count(*)
est raisonnable rapide. Dans notre cas, la taille des données a augmenté à un point où une requête non-indexd (bien que la plupart des choses soient couvertes par des indices) prend plus d'une minute. Donc, à ce stade, l'utilisateur attend un numéro peu important (nombre total d'enregistrements correspondant au filtre, nombre de pages). Les premiers N enregistrements sont souvent prêts assez rapidement.
J'ai donc deux questions:
- puis-je limiter l'
count(*)
à un certain nombre - ou serait-il possible de limiter le temps? (pas de
count()
connu après 20ms)
Ou juste en général: existe-t-il des moyens simples d'éviter ce problème? Nous aimerions garder le système aussi intact que possible.
Base de données: Oracle 10g
Mise à jour
Il existe plusieurs scénarios
- a) il y a un indice -> ni
count(*)
, ni la sélection réelle devrait être un problème - b) il n'y a pas d'index
count(*)
est énorme, et il faut des années pour le déterminer -> Rownum aideraitcount(*)
est zéro ou très faible, ici une limite de temps aiderait. Ou je pourrais juste ne pas faire uncount(*)
si le jeu de résultats est déjà en dessous de la limite de la page.
Un index ne peut être utilisé que pour satisfaire une requête COUNT (*) si elle concerne une ou plusieurs colonnes NOT NULL. Et si l'utilisateur ne se soucie que des premiers N enregistrements, disons les enregistrements 1-25 d'au moins 25 - ils n'obtiendront le compte final que lorsqu'ils auront atteint le dernier enregistrement. –