En utilisant MS SQL 2008, je sélectionne un champ moyen à partir de 2,5 millions d'enregistrements. Chaque enregistrement représente une seconde. Myfield est une moyenne horaire de ces 1 seconde enregistrements. Bien sûr, la CPU du serveur atteint 100% et la sélection prend trop de temps. Je dois éventuellement enregistrer ces valeurs moyennes afin que SQL ne soit pas obligé de sélectionner tous ces enregistrements sur chaque demande. Ce qui peut être fait?
SELECT DISTINCT
CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR) AS TimeStampHour,
MIN([timestamp]) as TimeStamp,
AVG(MyField) As AvgField
FROM MyData
WHERE TimeStamp > '4/10/2011'
GROUP BY CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR)
ORDER BY TimeStamp
Voir cette question ( étage A Date ) En outre, pourquoi vous soucier de la conversion de tout entrant - vous pouvez le faire plus tard (si vous en avez besoin).
SELECT DISTINCT
dateadd(hour,datediff(hour,0,[timestamp]),0) AS TimeStampHour,
MIN([timestamp]) as TimeStamp,
AVG(MyField) As AvgField
FROM MyData
WHERE TimeStamp > '4/10/2011'
GROUP BY dateadd(hour,datediff(hour,0,[timestamp],0);
ORDER BY TimeStamp
Voulez-vous rendre la requête plus rapide ou que vous vous demandez comment créer un instantané de données et l'enregistrer?
Si vous voulez le rendre plus rapide, vous avez certainement besoin d'un index sur le champ Timeestamp. En outre, je suggérerais d'utiliser ceci pour convertir une heure:
select convert(varchar(13), getdate(), 121)
Si vous avez besoin de faire un instantané et de la réutiliser ultérieurement, utilisez insert into
Pour créer une nouvelle table avec les résultats de votre requête. Table d'index en fonction et utilisez-la. De ce que je comprends, vous aurez besoin d'un index sur TimeStamphour.
Vous pouvez également configurer un travail qui prévoit des données quotidiennes dans votre nouvelle table d'agrégats.