你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

数据库观察程序数据收集和数据集(预览版)

适用于:Azure SQL 数据库Azure SQL 托管实例

数据库观察程序从 SQL 系统视图收集监视数据,并将其引入“数据集”形式的数据存储中。 每个数据集都使用来自一个或多个 SQL 系统视图的数据形成。 对于每个数据集,数据存储中都有一个单独的表。

数据收集

数据库观察程序使用 T-SQL 查询定期收集监视数据。 每次执行查询时收集的数据称为“样本”。 样本收集频率因数据集而异。 例如,可能会每隔 10 秒收集一次频繁更改的数据(例如 SQL 性能计数器),而大部分静态数据(例如数据库配置)可能每五分钟收集一次。 有关详细信息,请参阅数据集

数据库观察程序利用 Azure 数据资源管理器中的流式引入Microsoft Fabric 中的实时分析来提供近乎实时的监视。 通常,收集的 SQL 监视数据仅需要不到 10 秒即可用于报告和分析。 可以使用“引入统计信息”链接监视数据库观察程序仪表板的数据引入延迟。

数据库观察程序与应用程序工作负荷之间的交互

启用数据库观察程序不太可能对应用程序工作负荷产生明显影响。 更频繁的监视查询通常在亚秒范围内执行,而查询可能需要更多时间以不频繁的间隔运行(例如返回大型数据集)。

为了进一步降低对应用程序工作负荷造成影响的风险,Azure SQL 数据库中的所有数据库观察程序查询都作为内部工作负荷进行资源调控。 当存在资源争用时,监视查询的资源消耗限制为数据库或弹性池可用资源总量的一小部分。 较之监视查询,这会优先处理应用程序工作负荷。

在 Azure SQL 托管实例中,可以根据需要让 Resource Governor 以类似的方式管理监视查询的资源消耗。

以下示例在 SQL 托管实例上配置 Resource Governor。 当没有 CPU 争用时,数据库观察程序查询的 CPU 消耗将限制为 30%。 当存在 CPU 争用时,此配置将为监视查询保留 5% 的 CPU,并将其 CPU 使用率限制为 10%。 它还会将每个监视查询的内存授予大小限制为可用内存的 10%。

USE master;
GO

CREATE OR ALTER FUNCTION dbo.dbw_classifier()
RETURNS sysname
WITH SCHEMABINDING
AS
BEGIN

DECLARE @WorkloadGroupName sysname = 'default';

IF APP_NAME() IN (N'SQLExternalMonitoring',N'x_ms_reserved_sql_external_monitoring')
    SET @WorkloadGroupName = N'database_watcher_workload_group'

RETURN @WorkloadGroupName;

END;
GO

BEGIN TRY

IF EXISTS (
          SELECT 1
          FROM sys.resource_governor_configuration
          WHERE classifier_function_id <> 0 OR is_enabled <> 0
          )
    THROW 50001, 'Resource Governor is already configured. No changes were made.', 1;

CREATE RESOURCE POOL database_watcher_resource_pool
WITH (MIN_CPU_PERCENT = 5, MAX_CPU_PERCENT = 10, CAP_CPU_PERCENT = 30);

CREATE WORKLOAD GROUP database_watcher_workload_group
WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 10)
USING database_watcher_resource_pool;

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.dbw_classifier);

ALTER RESOURCE GOVERNOR RECONFIGURE;

END TRY
BEGIN CATCH
    THROW;
END CATCH;

注意

若要使 Resource Governor 配置在 SQL 托管实例的高可用性次要副本上立即生效,请连接到副本并执行 ALTER RESOURCE GOVERNOR RECONFIGURE;

为了避免在 Azure SQL 资源上运行的数据收集和数据库工作负荷之间的阻塞和死锁等并发冲突,监视查询使用短锁超时和低死锁优先级。 如果存在并发冲突,则为应用程序工作负荷查询提供更高优先级。 根据应用程序工作负荷模式,这可能会导致某些数据集的所收集数据偶尔出现差距。

弹性池中的数据收集

若要监视弹性池,必须将池中的一个数据库指定为“定位点数据库”。 数据库观察程序连接到定位点数据库。 由于观察程序持有VIEW SERVER PERFORMANCE STATE 权限,因此定位点数据库中的系统视图为整个池提供监视数据。

提示

可以将空数据库添加到要监视的每个弹性池,并将其指定为定位点数据库。 这样,就可以将其他数据库移入和移出池,或者在池之间移动,而不会中断弹性池监视。

从定位数据库收集的数据包含池级指标,以及池中每个数据库的特定数据库级性能指标。 例如,这包括每个数据库的资源利用率和请求率指标。 在某些情况下,监视整个弹性池便无需监视池中的每个单独数据库。

某些监视数据(例如池级 CPU、内存和存储利用率)和等待统计信息仅在弹性池级别收集,因为它不能归于池中的单个数据库。 相反,某些其他数据(如查询运行时统计信息、数据库属性、表和索引元数据)仅在数据库级别可用。

如果将弹性池中的单个数据库添加为数据库观察程序目标,还应将弹性池也添加为目标。 这样,就可以更全面地了解数据库和池性能。

监视密集弹性池

密集弹性池包含大量数据库,但计算大小相对较小。 此配置使客户可以通过将计算资源分配保持在最低水平来大幅节省成本,前提是池中只有少量数据库同时处于活动状态。

可用于密集弹性池中数据库观察程序查询的计算资源进一步受到限制,以避免影响应用程序查询。 因此,数据库观察程序可能无法从密集弹性池中的每个数据库收集监视数据。

提示

若要监视密集弹性池,请通过将弹性池添加为目标,在池级别启用监视。

不建议在密集弹性池中监视过多单独的数据库。 由于数据库观察程序查询可用的计算资源不足,可能会导致收集到的数据中出现间隙或数据样本之间的间隔大于预期。

数据集

本节介绍可用于每个目标类型的数据集,包括数据存储中的收集频率和表名。

注意

在预览期间,可能会添加和删除数据集。 数据集属性(如名称、说明、收集频率和可用列)可能会更改。

数据集名称 表名 收集频率 (hh:mm:ss) 说明
可用的会话 sqldb_database_active_sessions 00:00:30 每一行表示会话运行一个请求、是一个阻止程序或具有一个打开的事务。
备份历史记录 sqldb_database_sql_backup_history 00:05:00 每行表示一个已成功完成的数据库备份。
更改流程 sqldb_database_change_processing 00:01:00 每行表示更改处理功能(例如变更数据捕获或更改源,Azure Synapse Link)的聚合日志扫描统计信息的一个快照。
更改处理错误 sqldb_database_change_processing_errors 00:01:00 每行表示使用更改处理功能(如更改数据捕获或更改源,Azure Synapse Link)时,更改处理过程中发生的一个错误。
连接 sqldb_database_connectivity 00:00:30 每行表示数据库的一个连接探测(登录名和查询)。
异地副本 sqldb_database_geo_replicas 00:00:30 每行表示一个主要或辅助异地副本,包括异地副本元数据和统计信息。
索引元数据 sqldb_database_index_metadata 00:30:00 每行表示一个索引分区,包括索引定义、属性和操作统计信息。
内存利用率 sqldb_database_memory_utilization 00:00:10 每行表示一个内存分配器,包括数据库引擎实例上的分配器的内存消耗量。
缺失索引 sqldb_database_missing_indexes 00:15:00 每行表示一个可提高查询性能的索引(如果已创建)。
内存不足事件 sqldb_database_oom_events 00:01:00 每行表示数据库引擎中的一个内存不足事件。
性能计数器(常见) sqldb_database_performance_counters_common 00:00:10 每行表示数据库引擎实例的一个性能计数器。 此数据集包括常用的计数器。
性能计数器(详细信息) sqldb_database_performance_counters_detailed 00:01:00 每行表示数据库引擎实例的一个性能计数器。 此数据集包括可能需要用于详细监视和故障排除的计数器。
属性 sqldb_database_properties 00:05:00 每行表示一个数据库,包括数据库选项、资源治理限制和其他数据库元数据。
查询运行时统计信息 sqldb_database_query_runtime_stats 00:15:00 每行表示一个查询存储运行时间隔,并包括查询执行统计信息。
查询等待统计信息 sqldb_database_query_wait_stats 00:15:00 每行表示一个查询存储运行时间隔,并包括等待类别统计信息。
副本 sqldb_database_replicas 00:00:10 每行表示一个数据库副本,包括副本元数据和统计信息。 包括主要副本、异地副本(在主要副本上收集时)和次要副本(在次要副本上收集时)。
资源利用率 sqldb_database_resource_utilization 00:00:15 每行表示一个时间间隔内,一个数据库的 CPU、数据 IO、日志 IO 和其他资源消耗统计信息。
会话统计信息 sqldb_database_session_stats 00:01:00 每行表示数据库的一个会话统计信息摘要,这些统计信息按非累加会话属性(例如登录名、主机名、应用程序名称等)聚合。
SOS 计划程序 sqldb_database_sos_schedulers 00:01:00 每行表示一个 SOS 计划程序,并包括计划程序、CPU 节点和内存节点的统计信息。
存储 IO sqldb_database_storage_io 00:00:10 每行表示一个数据库文件,包括文件的累积 IOPS、吞吐量和延迟统计信息。
存储利用率 sqldb_database_storage_utilization 00:01:00 每行表示一个数据库,并包括其存储使用情况,包括 tempdb、查询存储和持久版本存储。
表元数据 sqldb_database_table_metadata 00:30:00 每行表示一个表或索引视图,并包括行计数、空间使用情况、数据压缩、列和约束等元数据。
等待统计信息 sqldb_database_wait_stats 00:00:10 每行表示一个等待类型,并包括数据库引擎实例的累积等待统计信息。 对于弹性池中的数据库,仅收集数据库范围的等待统计信息。

注意

对于弹性池中的数据库,不会收集包含池级别数据的“SQL 数据库”数据集。 这包括“内存利用率”、“内存不足事件”“性能计数器(通用)”和“性能计数器(详细)”数据集。 收集“等待统计信息”数据集,但仅包含数据库范围的等待。 这可以避免从池中的每个数据库收集相同的数据。

池级数据在“SQL 弹性池”数据集中收集。 对于给定的弹性池,“性能计数器(通用)”“性能计数器(详细)”数据集包含池级指标和某些数据库级指标,例如 CPU“数据 IO”、“日志写入”、“请求”、“事务”等。

常见列

对于每个目标类型,数据集都有通用列,如下表所述。

列名称 说明
sample_time_utc 观察到行中值的时间 (UTC)。
collection_time_utc 观察程序收集行的时间 (UTC)。 此列存在于收集时间可能与样本时间不同的数据集中。
replica_type 其中之一:“主要”“HA 辅助”、“异地副本转发器”、“命名辅助”。
logical_server_name 包含受监视的数据库或弹性池的 Azure SQL 数据库中的逻辑服务器的名称。
database_name 受监视数据库的名称。
database_id 受监视数据库的数据库 ID,在逻辑服务器内是唯一的。
logical_database_id 在用户数据库的生存期内保持不变的唯一数据库标识符。 重命名数据库或更改其服务目标不会更改此值。
physical_database_id 与用户数据库对应的当前物理数据库的唯一数据库标识符。 更改数据库服务对象会导致此值更改。
replica_id 超大规模计算副本的唯一标识符。

如果数据集包含数据库观察程序收集行之前观察到的样本,则数据集具有 sample_time_utccollection_time_utc 列。 否则,观察时间和收集时间相同,并且数据集仅包含 sample_time_utc 列。

例如,sqldb_database_resource_utilization 数据集派生自 sys.dm_db_resource_stats 动态管理视图 (DMV)。 DMV 包含 end_time 列,这是每行报告 15 秒间隔的聚合资源统计信息的观察时间。 此时间在 sample_time_utc 列中报告。 当数据库观察程序查询此 DMV 时,结果集可能包含多个行,每个行具有不同的 end_time。 所有这些行具有相同的 collection_time_utc 值。