2010-02-11 5 views
1

Je suis en train de refactoriser des SQL plus anciens, qui ont du mal après 4 ans et 1.7m de rangées de données. Y at-il un moyen d'améliorer la MS SQL requête suivante:Vous recherchez des améliorations des performances du compte SQL.

SELECT  ServiceGetDayRange_1.[Display Start Date], 
SUM (CASE WHEN Calls.line_date BETWEEN [Start Date] AND [End Date] THEN 1 ELSE 0 END) AS PerDayCount 
FROM   dbo.ServiceGetDayRange(GETUTCDATE(), 30, @standardBias, @daylightBias, @DST_startMonth, @DST_endMonth, @DST_startWeek, @DST_endWeek, @DST_startHour, @DST_endHour, @DST_startDayNumber, @DST_endDayNumber) AS ServiceGetDayRange_1 CROSS JOIN 
         (select [line_date] from dbo.l_log where dbo.l_log.line_date > dateadd(day,-31,GETUTCDATE())) as Calls 
GROUP BY ServiceGetDayRange_1.[Display Start Date], ServiceGetDayRange_1.[Display End Date] 
ORDER BY [Display Start Date] 

Il compte les entrées du journal au cours des 30 derniers jours (fonction ServiceGetDayRange retourne gammes détaillant table, TZ calée) pour tracer sur une carte .. informations inutiles, mais je ne suis pas le client.

Le plan d'exécution indique que 99% du temps d'exécution est utilisé pour compter les entrées .. comme vous pouvez vous y attendre. Très peu de frais généraux dans l'élaboration des décalages TZ (rappelez-vous max 30 rangées).

Stupide je pensais 'ah, vue indexée', mais ensuite réalisé je ne peux pas lier à une fonction.

Temps actuel de l'exécutif si elles sont 6,25 secondes. Toute amélioration sur ce + rep

Merci d'avance.

Répondre

3

Est-ce plus rapide si vous transformez le CASE en O WH?

SELECT  ServiceGetDayRange_1.[Display Start Date], COUNT(*) AS PerDayCount 
FROM  dbo.ServiceGetDayRange(GETUTCDATE(), 30, @standardBias, @daylightBias, @DST_startMonth, @DST_endMonth, @DST_startWeek, @DST_endWeek, @DST_startHour, @DST_endHour, @DST_startDayNumber, @DST_endDayNumber) AS ServiceGetDayRange_1 CROSS JOIN 
         (select [line_date] from dbo.l_log where dbo.l_log.line_date > dateadd(day,-31,GETUTCDATE())) as Calls 
WHERE Calls.line_date BETWEEN [Start Date] AND [End Date] 
GROUP BY ServiceGetDayRange_1.[Display Start Date], ServiceGetDayRange_1.[Display End Date] 
ORDER BY [Display Start Date] 
+0

omg ... c'est un tout 4,5 secondes plus vite ... j'ai effectivement escompté que comme je supposais qu'il devrait compter la plage de dates (c'est-à-dire toujours 30) vous monsieur, êtes un gent. –

+1

Content de l'entendre. À supposer, je pense que pour un CAS, il devrait visiter chaque rangée et évaluer l'expression d'une manière non-optimisable. Le COUNT (*)/WHERE a la possibilité de faire un meilleur usage des indices, peut-être ... –

0

6,25 secondes pour les lignes près de 2 m est assez bon .. peut-être essayer un nombre de lignes valides (votre 1/0 conditionnelle devrait permettre que) par opposition à une somme de valeurs .. Je pense que ce plus efficace environnements oracle.

+0

En fait, je pensais également que 6,25 secondes n'était pas mauvais toutes les choses concidérées, presque laissé à cela - content je didn; t. Je sais maintenant que les comptes basés sur les tests de cas ne sont pas toujours meilleurs. –

Questions connexes