适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
动态管理函数返回 sys.dm_db_stats_properties 当前数据库中指定数据库对象的统计数据。
关于分区表,也请参见类似 的 sys.dm_db_incremental_stats_properties。
语法
sys.dm_db_stats_properties (object_id, stats_id)
参数
object_id
当前数据库中对象的ID。
object_id 是 智力。
stats_id
指定 object_id的统计 ID 。 你可以从 sys.stats 动态管理视图获取统计 ID。
stats_id 是 智力。
返回的表
| 列名称 | 数据类型 | 说明 |
|---|---|---|
object_id |
int | 对象的ID(表或索引视图)。 |
stats_id |
int | 统计信息对象的 ID。 在表或索引视图中是唯一的。 有关详细信息,请参阅 sys.stats (Transact-SQL)。 |
last_updated |
datetime2 | 上次更新统计信息对象的日期和时间。 有关详细信息,请参阅本文中的 备注 部分。 |
rows |
bigint | 上次更新统计信息时表或索引视图中的总行数。 如果筛选统计信息或者统计信息与筛选索引对应,该行数可能小于表中的行数。 |
rows_sampled |
bigint | 用于统计信息计算的抽样总行数。 |
steps |
int | 直方图中的梯级数。 有关详细信息,请参阅 DBCC SHOW_STATISTICS (Transact-SQL)。 |
unfiltered_rows |
bigint | 应用筛选表达式(用于筛选的统计信息)之前表中的总行数。 如果统计数据未被过滤, unfiltered_rows 则等于列中返回 rows 的值。 |
modification_counter |
bigint | 自上次更新统计信息以来前导统计信息列(构建直方图的列)的总修改次数。 内存优化表:启动 SQL Server 2016(13.x),Azure SQL 数据库此列包含:自上次更新统计信息或重新启动数据库以来表的修改总数。 |
persisted_sample_percent |
float | 持久样本百分比用于未显式指定采样百分比的统计信息更新。 如果值为零,则不为此统计信息设置持久样本百分比。 适用于:SQL Server 2016(13.x)SP1 CU4及更高版本 |
注解
sys.dm_db_stats_properties函数在以下任一条件下返回空行集:
-
object_id或stats_id为NULL. - 指定的对象找不到,或者不对应表或索引视图。
- 指定的统计ID与该对象ID的现有统计数据不对应。
- 当前用户没有查看统计对象的权限。
这种行为允许在交叉应用到视图(如 sys.objects 和sys.stats)中的行时安全使用 sys.dm_db_stats_properties 。
统计信息更新日期连同直方图和密度矢量一起存储在统计信息 blob 对象中,而不是存储在元数据中。 如果未读取任何数据以生成统计信息数据,则不会创建统计信息 Blob、日期不可用,并且 last_updated 列为 NULL。 该条件适用于谓词未返回任何行的过滤统计量,或新的空表。
权限
你需要SELECT对统计列拥有权限,或者拥有该表,或者是固定服务器角色、db_owner固定数据库角色db_ddladmin或固定数据库角色的成员sysadmin。
示例
A. 简单示例
以下示例返回数据库中该表AdventureWorks的统计Person.Person信息。
SELECT * FROM sys.dm_db_stats_properties (object_id('Person.Person'), 1);
B. 返回表中的所有统计属性
以下示例返回表中所有存在 Sales.SalesOrderDetail的统计量的属性。
SELECT
OBJECT_SCHEMA_NAME(stat.object_id) AS schema_name,
OBJECT_NAME(stat.object_id) AS table_name,
sp.stats_id,
stat.[name],
stat.filter_definition,
sp.last_updated,
sp.[rows],
sp.rows_sampled,
sp.steps,
sp.unfiltered_rows,
sp.modification_counter
FROM sys.stats AS stat
OUTER APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp
WHERE stat.object_id = OBJECT_ID(N'Sales.SalesOrderDetail')
°C 返回频繁修改对象的统计属性
以下示例返回当前数据库中自上次统计更新以来,首列被修改超过1000次的所有表格、索引视图和统计数据。
SELECT
OBJECT_SCHEMA_NAME(obj.[object_id]) AS schema_name,
obj.[name],
stat.[name],
stat.stats_id,
sp.last_updated,
sp.modification_counter
FROM sys.objects AS obj
INNER JOIN sys.stats AS stat ON stat.object_id = obj.object_id
OUTER APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) AS sp
WHERE sp.modification_counter > 1000;