sys.dm_db_stats_properties(Transact-SQL)

适用于:SQL ServerAzure 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_idstats_idNULL.
  • 指定的对象找不到,或者不对应表或索引视图。
  • 指定的统计ID与该对象ID的现有统计数据不对应。
  • 当前用户没有查看统计对象的权限。

这种行为允许在交叉应用到视图(如 sys.objectssys.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;