2010-09-02 8 views
1

Il est souhaitable d'effectuer des calculs de moyenne sur un grand ensemble de données. Les données sont souvent capturées à partir des périphériques et nous voulons obtenir la moyenne du dernier jour, la moyenne de la dernière semaine, la moyenne du dernier mois et la moyenne de l'année dernière.Étalement de grandes quantités de données dans SQL Server

Malheureusement, il faut plusieurs minutes pour effectuer la moyenne des données de l'année précédente. Je n'ai qu'une connaissance de base de SQL et espère qu'il y a une bonne information ici pour accélérer les choses.

La table comporte un horodatage, un ID qui identifie le périphérique auquel les données appartiennent et une valeur de données en virgule flottante.

La requête que je me sers suit cet exemple général:

select avg(value) 
from table 
where id in(1,2,3,4) timestamp > last_year 

Edit: Je dois préciser aussi qu'ils demandent que ces moyennes sont calculées sur une base de roulement. Comme dans "l'année à ce jour" moyennes. Je réalise que tout simplement en raison du volume de résultats, nous pourrions avoir à faire des compromis.

Répondre

0

Vous pouvez faire une table de mise en cache, pour le cache de statistiques, il devrait avoir quelque chose de semblable à cette structure:

year | reads_sum | total_reads | avg 
=====|============|=============|===== 
2009 | 6817896234 | 564345  | 

à la fin de l'année, vous remplissez le terrain avg (moyenne) avec, maintenant rapide pour calculer, valeur.

+0

Nous vous remercions de votre réponse. J'espère pouvoir demander qu'ils modifient leur système pour s'adapter à cela. Je vais devoir y réfléchir un peu, ils veulent une moyenne de «l'année à ce jour» pour calculer assez souvent. – user438199

+0

Vous êtes les bienvenus, j'ai édité la réponse en changeant "table temporaire" en "table de mise en cache" parce que je ne veux pas dire une table de mémoire-vie comme "table temporaire" peut se référer à. – aularon

1

Pour ce genre de problèmes, vous pouvez toujours essayer les solutions suivantes: 1) optimiser la requête: regardez le plan de requête, créer des index, défragmenter ceux qui existent déjà, exécutez la requête lorsque le serveur est libre, etc 2) créer une table de cache. Pour remplir la table de cache, choisissez l'une des stratégies suivantes: 1) utilisez des déclencheurs sur les tables qui affectent le résultat et insérez, mettez à jour et supprimez l'actualisation de la table de cache. Le déclencheur devrait fonctionner très, très, très vite. L'autre condition est de ne pas bloquer les enregistrements (sinon vous finirez dans un interblocage si le serveur est occupé) 2) remplir la table de cache avec un travail une fois par jour/heure/etc 3) une solution que j'aime est de remplir le cache par un SP lorsque le résultat est nécessaire (ex: lorsque le rapport est demandé par l'utilisateur) et utiliser une logique pour sérialiser le processus (un seul utilisateur à la fois peut générer le cache) plus une optimisation pour ne pas recalculer les mêmes lignes la prochaine fois (ex: si aucune ligne n'a été ajoutée hier, et en cache j'ai le résultat pour hier, je ne recalcule pas cette valeur - calcule seulement les nouvelles valeurs de la dernière exécution)

0

Vous peut vouloir envisager de créer l'index cluster sur l'horodatage. L'index en cluster est généralement gaspillé sur l'ID. Une mise en garde à cet égard, l'ordre de tri de la sortie d'autres instructions sql peut changer s'il n'y avait pas de tri explicite.

Questions connexes