適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft 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_rows は rows 列で返される値と同じです。 |
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_idがNULL。 - 指定されたオブジェクトが見つからなかったり、テーブルやインデックスビューに対応していません。
- 指定された統計IDは、指定されたオブジェクトIDの既存の統計とは一致しません。
- 現在のユーザーは統計オブジェクトを閲覧する権限を持っていません。
この動作により、sys.dm_db_stats_propertiesやsys.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;