Функция масштабирования для чтения в SQL Azure: отслеживание запросов в реплике, доступной только для чтения - PullRequest
0 голосов
/ 27 июня 2018

Проблема : у нас возникают проблемы с производительностью, когда реплика только для чтения включена на премиум-уровне в Azure SQL, что очень странно и необъяснимо.

Я могу узнать, выполняется ли запрос для реплики только для чтения, используя следующую встроенную функцию

DATABASEPROPERYEX (DB_NAME (), 'Updateability')

Однако нет способа отслеживать запросы только для чтения.

Согласно следующей статье, расширенные события и хранилище запросов не поддерживаются в предварительном просмотре для реплики только для чтения. https://docs.microsoft.com/en-us/azure/sql-database/sql-database-read-scale-out

в то время как в следующей статье предполагается, что функция масштабирования чтения теперь общедоступна. Тем не менее я не могу отслеживать запросы, выполняемые на реплике только для чтения, в уровне базы данных премиум SQL

https://azure.microsoft.com/en-in/roadmap/azure-sql-database-announces-preview-of-read-scale-out-support-in-premium-service/

Я вижу голосовой элемент пользователя

https://feedback.azure.com/forums/217321-sql-database/suggestions/34337935-monitor-queries-on-secondary-database-when-read-sc

Есть ли другая опция для мониторинга рабочей нагрузки только для чтения?

1 Ответ

0 голосов
/ 27 июня 2018

Как вы упомянули, вы не можете использовать Query Store или Extended Events для мониторинга запросов к репликам, доступным только для чтения, но по-прежнему можете использовать sys.dm_exec_query_stats динамическое представление, которое может дать вам, например, самые популярные запросы по загрузке процессора

SELECT TOP (25) MIN(query_stats.statement_text) AS [Statement Text],
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS [Avg CPU Time],
query_stats.query_hash AS [Query Hash]
FROM (SELECT QS.*, SUBSTRING(ST.[text], (QS.statement_start_offset/2) + 1,
    ((CASE statement_end_offset
        WHEN -1 THEN DATALENGTH(st.[text])
        ELSE QS.statement_end_offset END
            - QS.statement_start_offset)/2) + 1) AS statement_text
     FROM sys.dm_exec_query_stats AS QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) AS ST) AS query_stats
GROUP BY query_stats.query_hash
ORDER BY [Avg CPU Time] DESC;

Вы можете изменить предложение ORDER BY в запросе ниже, чтобы отслеживать другие ресурсы:

SELECT TOP 10
    (total_logical_reads/execution_count) AS avg_logical_reads,
    (total_logical_writes/execution_count) AS avg_logical_writes,
    (total_physical_reads/execution_count) AS avg_phys_reads,
    (total_worker_time/execution_count) AS avg_cpu_over_head,
total_logical_reads, total_logical_writes, total_physical_reads,
total_worker_time, execution_count, total_elapsed_time AS Duration,
plan_generation_num AS num_recompiles,
statement_start_offset AS stmt_start_offset,
    (SELECT SUBSTRING(text, statement_start_offset/2 + 1,
        (CASE WHEN statement_end_offset = -1
            THEN LEN(CONVERT(nvarchar(MAX),text)) * 2
                ELSE statement_end_offset
            END - statement_start_offset)/2)
     FROM sys.dm_exec_sql_text(sql_handle)) AS query_text,
      (SELECT query_plan FROM sys.dm_exec_query_plan(plan_handle)) AS query_plan
FROM sys.dm_exec_query_stats a
--JUST CHANGE THE ORDER BY TO GET THE OTHER RESOURCES
ORDER BY (total_logical_reads + total_logical_writes)/execution_count DESC

Возможно, вы захотите сохранить результаты запросов, подобных приведенным выше, для последующего анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...