Назад | Перейти на главную страницу

Запрос на вставку SQL Azure в версии 12 в десять раз медленнее, чем в версии 11?

Около двух недель назад я заметил снижение производительности, которое сказалось на одном из наших приложений с серверной частью SQL Azure. Он работает на V12 на уровне S1 90% времени, иногда с масштабированием до S2, S3 или P1.

В основном у меня было значительно более медленное время выполнения запросов, особенно в запросах INSERT. Итак, я тестировал и тестировал, тестировал и тестировал, а затем тестировал и тестировал еще несколько. На каждом шагу я пытался исключить неопределенные факторы из уравнения. Оказалось, что с тех пор, как мы перешли на V12, производительность S1 была намного ниже, чем раньше.

То, что я в конце концов придумал, было легко воспроизвести: создать две новые образцы баз данных (Adventureworks_LT) на портале Azure. Один на новом сервере v12, а другой на новом сервере V11. Оба уровня S1.

Затем запустите мой тест (вроде) на обоих:

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;

Мои результаты:

Среднее время выполнения V11: 17 мс

Среднее время выполнения V12: 131 мс

В некоторых версиях разница больше, чем в других, но V11 каждый раз значительно превосходит V12.

sys.dm_db_resource_stats теперь показывает признаки превышения пределов DTU или даже близкого к нему. Так что, как вы думаете, здесь происходит? Я убежден, что я кое-что нахожу, но мои ребята из службы поддержки Microsoft постоянно говорят: оптимизируйте, масштабируйте, профилируйте ваши запросы и т. Д.

Полагаю, я просто ищу кого-то с похожим опытом, который смог найти первопричину в Microsoft, или даже кого-то, кто может сказать мне, что мой тест не подходит.

Я получил ответ от службы поддержки Microsoft, который имеет смысл. В любом случае для будущих поисков:

Независимо от платформы, выпуски (не Web / Biz) предоставляют возможность гарантировать DTU и ограничения ответа, как указано https://azure.microsoft.com/en-us/documentation/articles/sql-database-benchmark-overview/#metrics (см. раздел «Метрики»). Ограничения по времени отклика для базового и стандартного уровней выражаются в секундах на шкале 90 процентилей и, таким образом, неявно не гарантируют среднего порядка миллисекунд.

Подводя итог: мы не можем сравнивать производительность V1 и V12, измеряя среднее количество миллисекунд на выполнение определенного оператора.