sys.dm_db_stats_histogram (Transact-SQL)sys.dm_db_stats_histogram (Transact-SQL)

適用対象:Applies to:うんSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database 以降 はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed InstanceyesAzure Synapse Analytics適用対象:Applies to: うんSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) and later はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database はいAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance yesAzure Synapse Analytics

現在のデータベース内の指定されたデータベースオブジェクト (テーブルまたはインデックス付きビュー) の統計ヒストグラムを返し SQL ServerSQL Server ます。Returns the statistics histogram for the specified database object (table or indexed view) in the current SQL ServerSQL Server database. DBCC SHOW_STATISTICS WITH HISTOGRAM と似ています。Similar to DBCC SHOW_STATISTICS WITH HISTOGRAM.

注意

この DMF は、SP1 CU2 以降で使用できます。 SQL Server 2016 (13.x)SQL Server 2016 (13.x)This DMF is available starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1 CU2

構文Syntax

sys.dm_db_stats_histogram (object_id, stats_id)  

引数Arguments

object_idobject_id
統計のプロパティが要求された、現在のデータベース内にあるオブジェクトの ID です。Is the ID of the object in the current database for which properties of one of its statistics is requested. object_idintです。object_id is int.

stats_idstats_id
指定された object_idの統計情報の ID です。Is the ID of statistics for the specified object_id. 統計 ID は、 sys.stats 動的管理ビューから取得できます。The statistics ID can be obtained from the sys.stats dynamic management view. stats_idintです。stats_id is int.

返されるテーブルTable Returned

列名Column name データ型Data type 説明Description
object_idobject_id intint 統計オブジェクトのプロパティを返す対象のオブジェクト (テーブルまたはインデックス付きビュー) の ID。ID of the object (table or indexed view) for which to return the properties of the statistics object.
stats_idstats_id intint 統計オブジェクトの ID。ID of the statistics object. テーブルまたはインデックス付きビュー内で一意です。Is unique within the table or indexed view. 詳細については、「sys.stats (Transact-SQL)」を参照してください。For more information, see sys.stats (Transact-SQL).
step_numberstep_number intint ヒストグラムのステップ数。The number of step in the histogram.
range_high_keyrange_high_key sql_variantsql_variant ヒストグラム区間の上限の列値。Upper bound column value for a histogram step. この列値はキー値とも呼ばれます。The column value is also called a key value.
range_rowsrange_rows realreal ヒストグラム区間内 (上限は除く) に列値がある行の予測数。Estimated number of rows whose column value falls within a histogram step, excluding the upper bound.
equal_rowsequal_rows realreal ヒストグラム区間の上限と列値が等しい行の予測数。Estimated number of rows whose column value equals the upper bound of the histogram step.
distinct_range_rowsdistinct_range_rows bigintbigint ヒストグラム区間内 (上限は除く) にある個別の列値を持つ行の予測数。Estimated number of rows with a distinct column value within a histogram step, excluding the upper bound.
average_range_rowsaverage_range_rows realreal 上限を除く、ヒストグラムのステップ内で重複する列値を持つ行の平均数 ( RANGE_ROWS / DISTINCT_RANGE_ROWS の場合 DISTINCT_RANGE_ROWS > 0 )。Average number of rows with duplicate column values within a histogram step, excluding the upper bound (RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0).

解説Remarks

の resultset は sys.dm_db_stats_histogram 、と同様の情報を返し DBCC SHOW_STATISTICS WITH HISTOGRAM ます。また、、、およびも含まれ object_id stats_id step_number ます。The resultset for sys.dm_db_stats_histogram returns information similar to DBCC SHOW_STATISTICS WITH HISTOGRAM and also includes object_id, stats_id, and step_number.

range_high_key は sql_variant のデータ型であるため、 CAST 述語が CONVERT 文字列以外の定数と比較する場合は、またはを使用する必要がある場合があります。Because the column range_high_key is a sql_variant data type, you may need to use CAST or CONVERT if a predicate does comparison with a non-string constant.

ヒストグラムHistogram

ヒストグラムでは、データセットの個別の値ごとに出現頻度を測定します。A histogram measures the frequency of occurrence for each distinct value in a data set. クエリ オプティマイザーでは、統計オブジェクトの最初のキー列の列値に基づいてヒストグラムを計算し、行を統計的にサンプリングするかテーブルまたはビュー内のすべての行でフル スキャンを実行することによって列値を選択します。The query optimizer computes a histogram on the column values in the first key column of the statistics object, selecting the column values by statistically sampling the rows or by performing a full scan of all rows in the table or view. サンプリングされた行のセットからヒストグラムを作成する場合、格納される行の総数および個別の値の数は推定値であり、必ずしも整数にはなりません。If the histogram is created from a sampled set of rows, the stored totals for number of rows and number of distinct values are estimates and do not need to be whole integers.

ヒストグラムを作成するには、クエリ オプティマイザーで列値を並べ替え、個別の列値ごとに一致する値の数を計算し、列値を最大 200 の連続したヒストグラム区間に集計します。To create the histogram, the query optimizer sorts the column values, computes the number of values that match each distinct column value and then aggregates the column values into a maximum of 200 contiguous histogram steps. 各区間には、上限の列値までの列値の範囲が含まれます。Each step includes a range of column values followed by an upper bound column value. この範囲には、境界値の間 (境界値自体は除く) のすべての有効な列値が含まれます。The range includes all possible column values between boundary values, excluding the boundary values themselves. 格納される最小の列値は、最初のヒストグラム区間の上限境界値になります。The lowest of the sorted column values is the upper boundary value for the first histogram step.

次の図は、6 つの区間があるヒストグラムを示しています。The following diagram shows a histogram with six steps. 最初の上限境界値の左側にある領域が最初の区間です。The area to the left of the first upper boundary value is the first step.

ヒストグラムHistogram

ヒストグラムの各区間は、以下のように表されます。For each histogram step:

  • 太線は、上限境界値 (range_high_key) およびその出現回数 (equal_rows) を表します。Bold line represents the upper boundary value (range_high_key) and the number of times it occurs (equal_rows)

  • range_high_key の左にある領域は、列値の範囲、およびそれぞれの列値の平均出現回数 (average_range_rows) を表します。Solid area left of range_high_key represents the range of column values and the average number of times each column value occurs (average_range_rows). 最初のヒストグラム区間の average_range_rows は常に 0 です。The average_range_rows for the first histogram step is always 0.

  • 点線は、範囲内の個別の値の合計数 (distinct_range_rows) と範囲内の値の合計数 (range_rows) を推定するために使用される、サンプリングされた値を表します。Dotted lines represent the sampled values used to estimate total number of distinct values in the range (distinct_range_rows) and total number of values in the range (range_rows). クエリ オプティマイザーでは、range_rows および distinct_range_rows を使用して average_range_rows を計算します。サンプリングされた値は格納されません。The query optimizer uses range_rows and distinct_range_rows to compute average_range_rows and does not store the sampled values.

クエリ オプティマイザーでは、統計的有意性に応じてヒストグラム区間を定義します。The query optimizer defines the histogram steps according to their statistical significance. 区間幅を最大にするアルゴリズムを使用して境界値の差を最大にし、ヒストグラムの区間の数を最小限に抑えます。It uses a maximum difference algorithm to minimize the number of steps in the histogram while maximizing the difference between the boundary values. 区間の最大数は 200 です。The maximum number of steps is 200. ヒストグラムの区間の数は、境界点が 200 より少ない列でも、個別の値の数より少なくなることがあります。The number of histogram steps can be fewer than the number of distinct values, even for columns with fewer than 200 boundary points. たとえば、個別の値が 100 個ある列のヒストグラムの境界点が 100 より少なくなる場合もあります。For example, a column with 100 distinct values can have a histogram with fewer than 100 boundary points.

アクセス許可Permissions

では、ユーザーが統計列に対する select 権限を持っているか、ユーザーがテーブルを所有しているか、固定 sysadmin サーバーロール、 db_owner 固定データベースロール、または固定データベースロールのメンバーである必要があり db_ddladmin ます。Requires that the user has select permissions on statistics columns or the user owns the table or the user is a member of the sysadmin fixed server role, the db_owner fixed database role, or the db_ddladmin fixed database role.

Examples

A.A. 簡単な例Simple example

次の例では、単純なテーブルを作成して設定します。The following example creates and populates a simple table. 次に、列に対して統計を作成し Country_Name ます。Then creates statistics on the Country_Name column.

CREATE TABLE Country
(Country_ID int IDENTITY PRIMARY KEY,
Country_Name varchar(120) NOT NULL);
INSERT Country (Country_Name) VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Country_Stats  
    ON Country (Country_Name) ;  

主キーは stat_id 数値1を占有するため、数値2を呼び出して、 sys.dm_db_stats_histogram stat_id テーブルの統計ヒストグラムを返し Country ます。The primary key occupies stat_id number 1, so call sys.dm_db_stats_histogram for stat_id number 2, to return the statistics histogram for the Country table.

SELECT * FROM sys.dm_db_stats_histogram(OBJECT_ID('Country'), 2);

B.B. 便利なクエリ:Useful query:

SELECT hist.step_number, hist.range_high_key, hist.range_rows, 
    hist.equal_rows, hist.distinct_range_rows, hist.average_range_rows
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_histogram(s.[object_id], s.stats_id) AS hist
WHERE s.[name] = N'<statistic_name>';

C.C. 便利なクエリ:Useful query:

次の例では、列の述語を含むテーブルからを選択し Country Country_Name ます。The following example selects from table Country with a predicate on column Country_Name.

SELECT * FROM Country 
WHERE Country_Name = 'Canada';

次の例では、 Country 上記のクエリの述語に Country_Name 一致するヒストグラムのステップのテーブルと列に対して以前に作成した統計を確認します。The following example looks at the previously created statistic on table Country and column Country_Name for the histogram step matching the predicate in the query above.

SELECT ss.name, ss.stats_id, shr.steps, shr.rows, shr.rows_sampled, 
    shr.modification_counter, shr.last_updated, sh.range_rows, sh.equal_rows
FROM sys.stats ss
INNER JOIN sys.stats_columns sc 
    ON ss.stats_id = sc.stats_id AND ss.object_id = sc.object_id
INNER JOIN sys.all_columns ac 
    ON ac.column_id = sc.column_id AND ac.object_id = sc.object_id
CROSS APPLY sys.dm_db_stats_properties(ss.object_id, ss.stats_id) shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) sh
WHERE ss.[object_id] = OBJECT_ID('Country') 
    AND ac.name = 'Country_Name'
    AND sh.range_high_key = CAST('Canada' AS CHAR(8));

関連項目See Also

DBCC SHOW_STATISTICS (Transact-sql) DBCC SHOW_STATISTICS (Transact-SQL)
オブジェクト関連の動的管理ビューおよび関数 (Transact-SQL)Object Related Dynamic Management Views and Functions (Transact-SQL)
sys.dm_db_stats_properties (Transact-SQL)sys.dm_db_stats_properties (Transact-SQL)