С тех пор как в SQL Server 2005 появились представления динамического управления (DMV), в нашем распоряжении оказались удобные инструменты, позволяющие наблюдать работу внутренних механизмов SQL Server с использованием самого распространенного языка, T-SQL. До выпуска Azure SQL Database v12 существовало около 148 представлений динамического управления, которые были в локальной (не «облачной») версии, но отсутствуют в Azure SQL Database. В Azure было реализовано 13 представлений динамического управления, которые отсутствовали в локальном продукте. Одновременно с выпуском v12 в Azure SQL Database было добавлено более 100 DMV, отсутствовавших в предыдущей версии. На момент подготовки данной статьи из-за изменений в Azure в локальной версии SQL Server доступно только 16 уникальных DMV. 14 уникальны для Azure SQL Database v12. Имеется 166 представлений динамического управления в локальной версии SQL Server и 132 в Azure SQL Database (между действительными и уникальными числами существует небольшое расхождение).

Однако главное не количество. Важнее расширенная функциональность Azure SQL Database для сбора информации о базах данных. Давайте посмотрим на представления динамического управления, по-прежнему находящиеся в локальной версии, но не в Azure, и поговорим о данных, просто неприменимых к версии SQL Server для PaaS (платформа как услуга), которую представляет Azure SQL Database. В PaaS отсутствуют зеркалирование и кластеры, так как эти функции выполняются самой платформой. Поэтому отсутствие соответствующих DMV не вызывает проблем.

С точки зрения традиционных запросов большинство необходимых DMV давно существует. Уже много лет назад можно было направлять запросы sys.dm_exec_requests, чтобы увидеть запросы, выполняемые вашей базой данных. Их можно было соединить с sys.dm_exec_sql_text или sys.dm_exec_query_plan для извлечения соответствующей информации из представлений динамического управления в Azure SQL Database. Большинство функций, необходимых для проверки и мониторинга системы, были доступны. Однако теперь наши возможности значительно расширились.

Примеры новых функций мониторинга в v12

Начнем с небольшого примера. В SQL Server важно отслеживать размер транзакций при использовании журнала транзакций. Посмотрим на файл журнала с помощью DMV sys.dm_db_log_space_usage (появившегося в SQL Server 2012) в Azure SQL Database. Выполните следующий код:

SELECT DB_NAME (ddlsu.database_id)
   AS DatabaseName,
database_id,
CAST ((ddlsu.total_log_size_in_bytes/
   1048576.0)
   AS DECIMAL (10, 1))
AS LogSizeMB,
CAST ((ddlsu.used_log_space_in_bytes/
   1048576.0) AS DECIMAL (10, 1))
AS LogSpaceUsedMB,
CAST (ddlsu.used_log_space_in_percent
   AS
   DECIMAL (10, 1)) AS PercentLogSpace
FROM sys.dm_db_log_space_usage AS
   ddlsu;

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

Регулирование может вызвать затруднения внутри Azure SQL Database, если производительность системы невысока. Поэтому необходимо разобраться с длительно исполняемыми запросами. С помощью реализованного в SQL Server 2014 представления dm_exec_query_profiles можно увидеть состояние запроса в плане выполнения. Будет показано число строк, обработанных в операторе, число повторных использований внутреннего цикла (rewind) и сбросов на начало (rebind), которые пришлось выполнить, а также состояние запроса в активном динамическом выполнении. Теперь это возможно и в Azure SQL Database:

SELECT dest.text,
deqpl.query_plan,
deqp.physical_operator_name,
deqp.row_count
FROM sys.dm_exec_query_profiles AS deqp
CROSS APPLY sys.dm_exec_sql_text
   (deqp.sql_handle) AS dest
CROSS APPLY sys.dm_exec_query_plan
   (deqp.plan_handle) AS deqpl;

Для очень коротких транзакций sys.dm_exec_query_profiles не работают столь же успешно или вовсе неприменимы. Захват плана выполнения должен происходить одновременно с выполнением запроса. Данное DMV предназначено для диагностики действительно неудачных запросов, которые выполняются долго и могут регулироваться Azure SQL Database. Результат выполнения моих запросов с плохой производительностью показан на экране 1.

 

Список запросов с низкой производительностью
Экран 1. Список запросов с низкой производительностью

При каждом повторном выполнении запроса можно увидеть, как меняются значения row_count в операторах. Но знать особенности работы вовсе не обязательно, важно наличие такой функциональности в Azure SQL Database. Мы добиваемся абсолютного равенства с локальной версией SQL Server на всех типовых задачах и большинстве нетипичных, для которых требуется поддержка DMV.

Можно привести множество примеров, иллюстрирующих типы мониторинга, которые стали доступными после обновления v12. Так, до выпуска v12 чтобы определить, входит ли DMV в состав Azure, достаточно было взглянуть на его имя. Если оно начиналось с sys.dm_os_, то представление наверняка отсутствовало в Azure SQL Database. Сейчас положение изменилось. Теперь их 35, от sys.dm_os_buffer_descriptors до sys.dm_os_workers. В результате мы можем составлять запросы, которые выполняют следующие действия:

WITH RingBuffer
AS (SELECT CAST (dorb.record AS XML)
   AS xRecord,
dorb.timestamp
FROM sys.dm_os_ring_buffers AS dorb
WHERE dorb.ring_buffer_type =
   'RING_BUFFER_RESOURCE_MONITOR'
)
SELECT xr.value
   (' (ResourceMonitor/Notification) [1]',
   'varchar (75)')
AS RmNotification,
xr.value (' (ResourceMonitor/
   IndicatorsProcess) [1]', 'tinyint')
AS IndicatorsProcess,
xr.value (' (ResourceMonitor/
   IndicatorsSystem) [1]', 'tinyint')
AS IndicatorsSystem,
DATEADD (ss,
(-1 * ((dosi.cpu_ticks/CONVERT
   (FLOAT, (dosi.cpu_ticks
/dosi.ms_ticks)))
— rb.timestamp)/1000), GETDATE ()) AS
   RmDateTime,
xr.value (' (MemoryNode/TargetMemory) [1]',
   'bigint')
AS TargetMemory,
xr.value (' (MemoryNode/ReserveMemory)
   [1]', 'bigint')
AS ReserveMemory,
xr.value (' (MemoryNode/CommittedMemory)
   [1]', 'bigint')
AS CommitedMemory,
xr.value (' (MemoryNode/SharedMemory) [1]',
   'bigint')
AS SharedMemory,
xr.value (' (MemoryNode/PagesMemory) [1]',
   'bigint')
AS PagesMemory,
xr.value (' (MemoryRecord/
   MemoryUtilization) [1]', 'bigint')
AS MemoryUtilization,
xr.value (' (MemoryRecord/
   TotalPhysicalMemory) [1]', 'bigint')
AS TotalPhysicalMemory,
xr.value (' (MemoryRecord/
   AvailablePhysicalMemory) [1]', 'bigint')
AS AvailablePhysicalMemory,
xr.value (' (MemoryRecord/TotalPageFile) [1]',
   'bigint')
AS TotalPageFile,
xr.value (' (MemoryRecord/
   AvailablePageFile) [1]', 'bigint')
AS AvailablePageFile,
xr.value (' (MemoryRecord/
   TotalVirtualAddressSpace) [1]', 'bigint')
AS TotalVirtualAddressSpace,
xr.value (' (MemoryRecord/
   AvailableVirtualAddressSpace) [1]',
'bigint') AS AvailableVirtualAddressSpace,
xr.value (' (MemoryRecord/
   AvailableExtendedVirtualAddressSpace)
   [1]',
'bigint') AS
   AvailableExtendedVirtualAddressSpace
FROM RingBuffer AS rb
CROSS APPLY rb.xRecord.nodes ('Record')
   record (xr)
CROSS JOIN sys.dm_os_sys_info AS dosi
ORDER BY RmDateTime DESC;

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

Уникальные функции мониторинга Azure SQL Database

Здесь речь идет не только о возможности выполнять действия, уже доступные в локальном продукте. Нужно обращать особое внимание на уникальные сведения, необходимые внутри собственно Azure. Например, один из способов понять, какие именно неполадки произошли на сервере, — это обратиться к sys.dm_os_wait_stats. В Azure есть другое DMV, sys.dm_db_wait_stats (база данных PaaS). Вывод показан на экране 2.

 

Статистика времени ожидания в базе данных PaaS
Экран 2. Статистика времени ожидания в базе данных PaaS

Однако возникает интересный вопрос. До появления v12 таким образом проводился мониторинг статистики ожидания в Azure. Но теперь имеется sys.dm_os_wait_stats, и непонятно, одинаковы ли они. Я выполнил следующий запрос:

SELECT *
FROM sys.dm_os_wait_stats AS dows
WHERE dows.wait_type =
   'PAGEIOLATCH_SH';
SELECT *
FROM sys.dm_db_wait_stats AS ddws
WHERE ddws.wait_type =
   'PAGEIOLATCH_SH';

Полученные результаты показаны на экране 3.

 

Сравнение времени ожидания
Экран 3. Сравнение времени ожидания

На самом деле мне неизвестно, почему они разные. Max_wait_time_ms идентичны в обоих представлениях динамического управления. В дальнейшем я постараюсь выяснить причину различия, а пока будем придерживаться sys.dm_db_wait_stats, специфической для Azure.

Еще одна уникальная особенность Azure SQL Database — возможность просто организовывать параметры GeoLocation для баз данных. У вас есть несколько способов обеспечить доступность и защиту данных, не только локально в вашем собственном центре обработки данных, но и на всем земном шаре. Но нужно ли отслеживать все эти действия? Конечно, да. Поэтому вам пригодятся представления динамического управления, такие как sys.dm_operation_stats.

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