2011-06-18 5 views
0

J'ai vu quelques messages détaillant des façons rapides d '"estimer" le nombre de lignes dans une table SQL donnée sans utiliser COUNT(*). Cependant, aucun d'entre eux ne semble vraiment résoudre le problème si vous avez besoin d'estimer le nombre de lignes qui satisfont un critères. J'essaie d'obtenir un moyen de d'estimer le nombre de lignes qui satisfont à un critère donné, mais l'information pour ces critères est dispersée autour de deux ou trois tables. Bien sûr, un SELECT COUNT(*) avec l'indice NOLOCK et quelques jointures suffiront, et je peux me permettre de sous-estimer ou de surestimer le nombre total d'enregistrements. Le problème est que ce type de requête sera exécuté toutes les 5-10 minutes environ, et comme je n'ai pas besoin du nombre réel - seulement une estimation - je voudrais échanger la précision pour la vitesse.Fast Way pour estimer les lignes par critères

La solution, le cas échéant, peut être spécifique à SQL Server. En fait, il doit être compatible avec SQL Server 2005. Des indices?

+0

Les tables sont-elles énormes? Exécuter quelque chose toutes les 5-10 minutes n'est pas si souvent que cela devrait affecter le serveur. –

+0

Oui, les tables peuvent devenir assez énormes. J'ai oublié de mentionner cela! Merci! –

+0

Énorme n'est pas un adjectif très utile dans le monde des données. C'est complètement relatif à l'expérience de chaque personne. –

Répondre

0

solutions possibles:

  • Si le numéro de compte est grand par rapport au nombre total de lignes dans le tableau, puis en ajoutant des index qui couvrent where état aideront et la requête sera très rapide.

  • Si le nombre de résultats est proche du nombre total de lignes dans la table, les index n'aideront pas beaucoup. Vous pourriez implémenter un déclencheur qui maintiendrait une «table de comptage conditionnelle». Ainsi, chaque fois que la condition de correspondance de ligne est ajoutée, vous incrémentez la valeur dans la table et lorsque la ligne est supprimée, vous décrémentez la valeur. Vous allez donc interroger cette petite table de comptage sommaire.

1

Il n'existe pas de solution simple pour ce faire. Vous pouvez obtenir une estimation pour le nombre total de lignes dans une table, par ex. à partir des vues du catalogue système.

Mais il n'y a aucun moyen de le faire pour un ensemble donné de critères dans une clause WHERE - soit vous devez garder des comptes pour chaque ensemble de critères et les valeurs, ou vous devez utiliser la magie noire pour trouver cela en dehors. Le seul endroit où SQL Server conserve quelque chose qui irait dans cette direction est les statistiques qu'il conserve sur les indices. Ceux-ci auront certaines informations sur le type de valeurs qui se produisent à quelle fréquence dans un index - mais honnêtement, je n'ai aucune idée si (et comment) vous pourriez tirer parti de l'information dans les statistiques dans vos propres requêtes ......

Si vous devez vraiment connaître le nombre de lignes correspondant à un certain critère, vous devez effectuer un décompte quelconque (SELECT COUNT(*) FROM dbo.YourTable WHERE (yourcriteria) ou autre).

Quelque chose d'autre pourrait être quelque chose comme ceci:

  • Enveloppez votre déclaration SELECT dans un CTE (Common Table Expression)
  • définissent un ROW_NUMBER() dans ce CTE de commander vos données par une colonne (ou un ensemble de colonnes
  • ajouter une seconde ROW_NUMBER() à cet CTE qui commande vos données par la même colonne (ou colonnes) - mais dans la direction opposée (DESC vs.ASC)

Quelque chose comme ceci:

;WITH YourDataCTE AS 
(
    SELECT (list of columns you need), 
     ROW_NUMBER() OVER(ORDER BY <your column>) AS 'RowNum', 
     ROW_NUMBER() OVER(ORDER BY <your column> DESC) AS 'RowNum2' 
    FROM 
     dbo.YourTable 
    WHERE 
     <your conditions here> 
) 
SELECT * 
FROM YourDataCTE 

Faire cela, vous obtiendrez l'effet suivant:

  • votre première ligne dans votre jeu de résultats contiendra vos colonnes de données habituelles
  • le premier ROW_NUMBER() contiendra la valeur 1
  • la seconde ROW_NUMBER() contiendra le nombre total de lignes correspondant à cet ensemble de critères

Il est étonnamment bon de traiter des ensembles de résultats de taille petite à moyenne - je n'ai pas encore essayé de savoir comment il résiste à de très grands ensembles de résultats - mais il pourrait être quelque chose à enquêter et voir si cela fonctionne.

Questions connexes