Il y a environ deux semaines, j'ai remarqué une dégradation des performances de l'une de nos applications avec un backend SQL Azure. Elle fonctionne sous V12 sur le niveau S1 90 % du temps, avec parfois une mise à l'échelle vers S2, S3 ou P1.
En fait, les temps d'exécution des requêtes étaient beaucoup plus lents, surtout pour les requêtes INSERT. J'ai donc testé et évalué, testé et évalué, puis testé et évalué encore. À chaque étape, j'ai essayé d'éliminer les facteurs incertains de l'équation. Il s'est avéré que depuis que nous sommes passés à la V12, les performances de S1 sont beaucoup plus lentes qu'auparavant.
Ce que j'ai finalement trouvé était facile à reproduire : Créer deux nouvelles bases de données Sample (Adventureworks_LT) dans le portail Azure. Une sur un nouveau serveur V12, et l'autre sur un nouveau serveur V11. Les deux sont de niveau S1.
Ensuite, je fais mon benchmark (en quelque sorte) sur les deux :
DECLARE @start_time DATETIME, @end_time DATETIME
SET @start_time = CURRENT_TIMESTAMP
DECLARE @cnt INT = 0;
DECLARE @until INT = 100;
DECLARE @timeNow DATETIME;
WHILE @cnt < @until
BEGIN
Set @timeNow = CURRENT_TIMESTAMP;
INSERT INTO dbo.ErrorLog
(
ErrorTime,
UserName,
ErrorNumber,
ErrorMessage
)
VALUES
(
@timeNow,
'BENCHMARK',
DATEDIFF(MILLISECOND,@timeNow,CURRENT_TIMESTAMP),
'BENCHMARK'
)
SET @cnt = @cnt + 1;
WAITFOR DELAY '00:00:00:500'; /* wait 500 miliseconds*/
END
SET @end_time = DateAdd(MILLISECOND,(@until)*-500.,CURRENT_TIMESTAMP)
/*subtract 500ms per iteration to make up for the built-in delay*/
SELECT DATEDIFF(ms, @start_time, @end_time) as 'total query execution time', DATEDIFF(ms, @start_time, @end_time)/@until as 'average query execution time'
SELECT * FROM sys.dm_db_resource_stats;
Mes résultats :
Temps d'exécution moyen V11 : 17ms
Temps d'exécution moyen V12 : 131ms
La différence est plus grande pour certaines courses que pour d'autres, mais la V11 est nettement plus performante que la V12 à chaque fois.
sys.dm_db_resource_stats ne montre aucun signe de dépassement des limites DTU, ni même d'en être proche. Alors, que pensez-vous qu'il se passe ici ? Je suis convaincu que je suis sur quelque chose, mais le support technique de Microsoft ne cesse de me dire d'optimiser, d'augmenter l'échelle, de profiler vos requêtes, etc.
Je suppose que je cherche simplement quelqu'un qui a eu une expérience similaire et qui a réussi à trouver une cause profonde avec Microsoft, ou même quelqu'un qui peut me dire que mon benchmark n'est pas bon.
0 votes
J'ajoute simplement que, bien que je ne sois pas un expert du fonctionnement interne de SQL Server ou de SQL Azure, je suis conscient que je fais 100 transactions distinctes. En regroupant les 100 insertions en une seule transaction, ce test aurait probablement les mêmes performances sur tous les niveaux possibles, tant sur V11 que sur V12. Cependant, le batching n'est presque jamais possible lorsque vos requêtes sont appelées par différentes requêtes dans un environnement d'application web. Par conséquent, si ma base de données de niveau S1 a obtenu une surcharge supplémentaire sur chaque transaction, comme je le soupçonne, cela aura un impact sévère sur les performances globales de mes applications.