共用方式為


sys.dm_db_stats_histogram (Transact-SQL)

適用於: SQL Server 2016 (13.x) 及以後版本 Azure SQL Database AzureSQL Managed InstanceSQL database in Microsoft Fabric

會傳回目前 SQL Server 資料庫中指定資料庫物件 (資料表或索引檢視表) 的統計長條圖。 類似於 DBCC SHOW_STATISTICS WITH HISTOGRAM

注意

從 SQL Server 2016 (13.x) SP1 CU2 開始,即可使用此 DMF

語法

sys.dm_db_stats_histogram (object_id , stats_id)

引數

object_id

現行資料庫中物件的 ID,要求其其中一個統計資料的內容。 @object_idint

stats_id

指定 object_id的統計資料 ID。 您可以從 sys.stats 動態管理檢視取得統計資料識別碼。 stats_idint

傳回的資料表

資料行名稱 資料類型 描述
object_id int 要傳回統計資料物件屬性之物件 (資料表或索引檢視表) 的識別碼。
stats_id int 統計資料物件的識別碼。 這在資料表或索引檢視表中是唯一的。 如需詳細資訊,請參閱 sys.stats
step_number int 長條圖中的步數。
range_high_key sql_variant 長條圖步驟的上限資料行值。 此資料行值也稱為索引鍵值。
range_rows real 資料行值在長條圖步驟內的預估資料列數,不包括上限。
equal_rows real 資料行值等於長條圖步驟之上限的預估資料列數。
distinct_range_rows bigint 在長條圖步驟內具有相異資料行值的預估資料列數,不包括上限。
average_range_rows real 在長條圖的步長內具有重複資料行值的平均資料列數,不包括上限 (RANGE_ROWS / DISTINCT_RANGE_ROWS 代表 DISTINCT_RANGE_ROWS > 0)。

備註

sys.dm_db_stats_histogram 的結果集會傳回類似 DBCC SHOW_STATISTICS WITH HISTOGRAM 的資訊,也包含 object_idstats_idstep_number

因為直欄 range_high_key 是sql_variant資料類型,所以您可能需要使用 CASTCONVERT if 述詞與非字串常數進行比較。

長條圖

長條圖會測量資料集中每一個相異值的發生頻率。 查詢最佳化工具會計算有關統計資料物件之第一個索引鍵資料行中資料行值的長條圖,以統計方式取樣資料列或執行資料表或檢視表中所有資料列的完整掃描來選取資料行值。 如果直方圖是從取樣的一組資料列建立,則資料列數和相異值數目的儲存總計是估計值,不需要是整數。

若要建立長條圖,查詢最佳化工具會排序資料行值、計算符合每一個相異資料行值的值數目,然後將資料行值彙總成最多 200 個連續長條圖步驟。 每一個步驟都包含某個範圍的資料行值,後面緊接著上限資料行值。 此範圍包括界限值之間的所有可能資料行值,但是不包括界限值本身。 最低的已排序資料行值就是第一個長條圖步驟的上限值。

下列長條圖顯示包含六個步驟的長條圖。 第一個上限值左側的區域就是第一個步驟。

如何根據取樣資料行值計算直方圖的圖表。

每一個長條圖步驟:

  • 粗線代表上限值 (range_high_key) 以及其所發生的次數 (equal_rows)

  • range_high_key 左邊的實線區域代表資料行值範圍,以及每一個資料行值發生的平均次數 (average_range_rows)。 第一個長條圖步驟的 average_range_rows 一定是 0。

  • 虛線代表用來預估範圍內相異值總數的取樣值 (distinct_range_rows) 以及範圍內的值總數 (range_rows)。 查詢最佳化工具會使用 range_rowsdistinct_range_rows 來計算 average_range_rows ,而且不會儲存取樣值。

查詢最佳化工具會根據長條圖步驟的統計重要性來定義長條圖步驟。 它會使用最大值差異演算法,讓長條圖中的步驟數減至最少,同時讓界限值之間的差異最大化。 步驟數的最大值為 200。 長條圖步驟的數目可以少於相異值數目,即使包含了少於 200 個界限點的資料行也是如此。 例如,包含 100 個相異值的資料行可以擁有少於 100 個界限點的長條圖。

權限

需要使用者具有統計資料欄的選取權限,或使用者擁有資料表,或使用者是 sysadmin 固定伺服器角色、 db_owner 固定資料庫角色或 db_ddladmin 固定資料庫角色的成員。

範例

A. 基本範例

下列範例會建立並填入基本資料表。 然後會在 Region_Name 資料行上建立統計資料。

CREATE TABLE Region
(
    Region_ID INT IDENTITY PRIMARY KEY,
    Region_Name VARCHAR (120) NOT NULL
);

INSERT Region (Region_Name)
VALUES ('Canada'), ('Denmark'), ('Iceland'), ('Peru');

CREATE STATISTICS Region_Stats ON Region(Region_Name);

主索引鍵會佔用 stat_id 數字 1,因此會呼叫 sys.dm_db_stats_histogram 數字 2 的 stat_id,以傳回 Region 資料表的統計資料長條圖。

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

B. 有用的查詢

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. 有用的查詢

下列範例會從資料表 Region (以一個在資料行 Region_Name 上的述詞) 中選取。

SELECT * FROM Region
WHERE Region_Name = 'Canada';

下列範例會針對符合上述查詢中述詞的長條圖步長,來查看先前在資料表 Region 和資料行 Region_Name 上所建立的統計資料。

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 AS ss
     INNER JOIN sys.stats_columns AS sc
         ON ss.stats_id = sc.stats_id
        AND ss.object_id = sc.object_id
     INNER JOIN sys.all_columns AS 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) AS shr
CROSS APPLY sys.dm_db_stats_histogram(ss.object_id, ss.stats_id) AS sh
WHERE ss.[object_id] = OBJECT_ID('Region')
      AND ac.name = 'Region_Name'
      AND sh.range_high_key = CAST ('Canada' AS CHAR (8));