sys.dm_db_stats_properties(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

sys.dm_db_stats_properties動的管理関数は、現在のデータベース内の指定されたデータベースオブジェクトの統計情報を返します。

パーティションテーブルについては、同様の sys.dm_db_incremental_stats_propertiesも参照してください。

Syntax

sys.dm_db_stats_properties (object_id, stats_id)  

引数

object_id

現在のデータベースにあるオブジェクトのIDです。 object_id 知性

stats_id

指定された object_idの統計IDです。 統計IDは sys.stats の動的管理ビューから取得できます。 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_rowsrows 列で返される値と同じです。
modification_counter bigint 統計情報が前回更新されてから先頭の統計列 (構築するヒストグラムの基になる列) に対して行われた変更の総数。

メモリ最適化テーブル: SQL Server 2016 (13.x) 以降と Azure SQL Database のこの列には、前回統計が更新されたか、データベースが再起動されてからのテーブルの変更の合計数が含まれます。
persisted_sample_percent float サンプリングの割合を明示的に指定しない統計情報の更新に使用される永続化されたサンプルのパーセンテージです。 値がゼロの場合、永続化されたサンプルのパーセンテージがこの統計に設定されていません。

対象:SQL Server 2016(13.x)SP1 CU4以降バージョン

注釈

sys.dm_db_stats_properties関数は、以下のいずれかの条件下で空の行セットを返します。

  • object_id または stats_idNULL
  • 指定されたオブジェクトが見つからなかったり、テーブルやインデックスビューに対応していません。
  • 指定された統計IDは、指定されたオブジェクトIDの既存の統計とは一致しません。
  • 現在のユーザーは統計オブジェクトを閲覧する権限を持っていません。

この動作により、sys.dm_db_stats_propertiessys.objectsなどのビューで行にクロス適用した際に安全に使用sys.statsが可能になります。

統計の更新日付は、メタデータではなく統計 BLOB オブジェクトヒストグラムおよび密度ベクトルと共に格納されます。 統計データを生成するためのデータが読み取られない場合、統計 BLOB は作成されず、日付は使用できません。また、 last_updated 列は NULL。 この条件は、述語が行を返さないフィルタリング統計や、新しい空テーブルに適用されます。

Permissions

統計カラムの権限 SELECT 、テーブルの所有者であるか、 sysadmin 固定サーバーロール、 db_owner 固定データベースロール、 db_ddladmin 固定データベースロールのメンバーである必要があります。

Examples

A. 単純な例

以下の例は、Person.Personデータベース内の AdventureWorks テーブルの統計情報を表示します。

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. 頻繁に変更されたオブジェクトの統計プロパティを返す

以下の例は、前回の統計更新以降、先頭列が1,000回以上修正された現在のデータベース内のすべてのテーブル、インデックス表示、統計情報を返します。

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;