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