2010-11-30 4 views
2

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 aiderait
    • count(*) est zéro ou très faible, ici une limite de temps aiderait. Ou je pourrais juste ne pas faire un count(*) si le jeu de résultats est déjà en dessous de la limite de la page.
+0

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. –

Répondre

3

Vous pouvez utiliser 'où rownum < x' pour limiter le nombre de lignes à compter. Et si vous devez montrer à votre utilisateur que vous avez plus de registre, vous pouvez utiliser x + 1 en compte juste pour voir s'il y a plus de x registres.

+0

Ah très gentil. Je n'ai pas réalisé que je peux utiliser rownum avec count (*). – reto

+0

Il y a aussi une astuce étrange à limiter au temps de fonctionnement, mais cela semble extrêmement hacky. – reto

Questions connexes