DBCC SHOW_STATISTICS (Transact-SQL)
DBCC SHOW_STATISTICS 會針對資料表或索引檢視表顯示目前的查詢最佳化統計資料。 查詢最佳化工具會使用統計資料來預估基數或查詢結果中的資料列數,如此可讓查詢最佳化工具建立高品質的查詢計畫。 例如,查詢最佳化工具可使用基數預估來選擇查詢計畫中的索引搜尋運算子,而不是索引掃描運算子,避免發生資源密集的索引掃描來提高查詢效能。
查詢最佳化工具會將資料表或索引檢視表的統計資料儲存在統計資料物件中。 如果是資料表,將會在索引或資料表資料行清單上建立統計資料物件。 統計資料物件包含標頭 (其中包含有關統計資料的中繼資料)、長條圖 (包含統計資料物件之第一個索引鍵資料行中的值分佈),以及用來測量跨資料行關聯的密度向量。 Database Engine 可以使用統計資料物件中的任何資料來計算基數預估。
DBCC SHOW_STATISTICS 會根據儲存在統計資料物件中的資料來顯示標頭、長條圖和密度向量。 此語法可讓您指定資料表或索引檢視表,連同目標索引名稱、統計資料名稱或資料行名稱。 此主題描述如何顯示統計資料以及如何了解顯示的結果。
如需詳細資訊,請參閱<統計資料>。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
語法
DBCC SHOW_STATISTICS ( table_or_indexed_view_name , target )
[ WITH [ NO_INFOMSGS ] < option > [ , n ] ]
< option > :: =
STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM
引數
table_or_indexed_view_name
要顯示統計資料資訊之資料表或索引檢視表的名稱。target
要顯示統計資料資訊之索引、統計資料或資料行的名稱。 如果 target 是資料表或索引檢視表上現有索引或統計資料的名稱,便會傳回這個目標的相關統計資料資訊。 如果 target 是現有資料行的名稱,而且這個資料行含有自動建立的統計資料,便會傳回自動建立之統計資料的相關資訊。 如果資料行目標之自動建立的統計資料不存在,就會傳回錯誤訊息 2767。NO_INFOMSGS
抑制所有嚴重性層級在 0 到 10 的參考用訊息。STAT_HEADER | DENSITY_VECTOR | HISTOGRAM | STATS_STREAM [ **,**n ]
如果指定其中一或多個選項,就會限制陳述式針對指定之選項所傳回的結果集。 如果沒有指定任何選項,便會傳回所有的統計資料資訊。STATS_STREAM 是 僅供參考之用。不支援。我們無法保證未來的相容性。
結果集
下表描述指定 STAT_HEADER 時,結果集所傳回的資料行。
資料行名稱 |
說明 |
---|---|
Name |
統計資料物件的名稱。 |
Updated |
上次更新統計資料的日期和時間。 STATS_DATE 函數是擷取這項資訊的替代方式。 |
Rows |
上一次更新統計資料時位於資料表或索引檢視表中的資料列總數。 如果篩選了統計資料或是統計資料對應至篩選過的索引,此資料列數可能會少於資料表中的資料列數。 如需詳細資訊,請參閱<統計資料>。 |
Rows Sampled |
針對統計資料計算進行取樣的資料列總數。 如果取樣的資料列數 < 資料列數,顯示的長條圖和密度結果將會是根據取樣資料列數的預估值。 |
Steps |
長條圖中的步驟數。 每一個步驟都會跨越某個範圍的資料行值,後面緊接著上限資料行值。 長條圖步驟會在統計資料中的第一個索引鍵資料行上定義。 步驟數的最大值為 200。 |
Density |
針對統計資料物件第一個索引鍵資料行中的所有值,計算為 1 / distinct values,不包括長條圖界限值。 查詢最佳化工具不會使用這個 Density 值,而且會針對與 SQL Server 2008 之前版本之間的回溯相容性顯示。 |
Average Key Length |
針對統計資料物件中的所有索引鍵資料行計算之每個值的平均位元組數。 |
String Index |
Yes 表示統計資料物件包含了字串摘要統計資料來改善使用 LIKE 運算子之查詢述詞的基數預估,例如 WHERE ProductName LIKE '%Bike'。 字串摘要統計資料會與長條圖分開儲存,而且會在具有 char、varchar、nchar、nvarchar、varchar(max)、nvarchar(max)、text 或 ntext. 類型時於統計資料物件的第一個索引鍵資料行上建立。 |
Filter Expression |
包含在統計資料物件中之資料表資料列子集的述詞。 NULL = 非篩選的統計資料。 如需有關已篩選之述詞的詳細資訊,請參閱<建立篩選的索引>。 如需有關已篩選之統計資料的詳細資訊,請參閱<統計資料>。 |
Unfiltered Rows |
套用篩選運算式之前,資料表中的資料列總數。 如果 Filter Expression 為 NULL,Unfiltered Rows 就會等於 Rows。 |
下表描述指定 DENSITY_VECTOR 時,結果集所傳回的資料行。
資料行名稱 |
說明 |
---|---|
All Density |
密度是 1 / distinct values。 結果會針對統計資料物件中資料行的每個前置詞來顯示密度,一個密度一個資料列。 相異值是每個資料列和每個資料行前置詞的資料行值相異清單。 例如,如果統計資料物件包含索引鍵資料行 (A, B, C),結果就會報告每一個資料行前置詞中相異值清單的密度:(A)、(A,B) 和 (A, B, C)。 使用前置詞 (A, B, C) 時,這些清單的每一個都會是相異值清單:(3, 5, 6)、(4, 4, 6)、(4, 5, 6)、(4, 5, 7)。 使用前置詞 (A, B) 時,相同的資料行值都會有這些相異值清單:(3, 5)、(4, 4) 和 (4, 5)。 |
Average Length |
平均長度 (以位元組為單位),用來儲存資料行前置詞的資料行值清單。 例如,如果清單 (3, 5, 6) 中的每一個值都需要 4 位元組,長度就是 12 位元組。 |
Columns |
在前置詞中顯示 All density 和 Average length 的資料行名稱。 |
下表描述指定 HISTOGRAM 選項時,結果集所傳回的資料行。
資料行名稱 |
說明 |
---|---|
RANGE_HI_KEY |
長條圖步驟的上限資料行值。 此資料行值也稱為索引鍵值。 |
RANGE_ROWS |
資料行值在長條圖步驟內的預估資料列數,不包括上限。 |
EQ_ROWS |
資料行值等於長條圖步驟之上限的預估資料列數。 |
DISTINCT_RANGE_ROWS |
在長條圖步驟內具有相異資料行值的預估資料列數,不包括上限。 |
AVG_RANGE_ROWS |
在長條圖步驟內具有重複資料行值的平均資料列數,上限不包括在內 (RANGE_ROWS / DISTINCT_RANGE_ROWS for DISTINCT_RANGE_ROWS > 0)。 |
備註
長條圖
長條圖會測量資料集中每一個相異值的發生頻率。 查詢最佳化工具會計算有關統計資料物件之第一個索引鍵資料行中資料行值的長條圖,以統計方式取樣資料列或執行資料表或檢視表中所有資料列的完整掃描來選取資料行值。 如果長條圖是從一組取樣的資料列所建立,資料列數和相異值數的儲存總計會是預估值,而且不需要為整數。
若要建立長條圖,查詢最佳化工具會排序資料行值、計算符合每一個相異資料行值的值數目,然後將資料行值彙總成最多 200 個連續長條圖步驟。 每一個步驟都包含某個範圍的資料行值,後面緊接著上限資料行值。 此範圍包括界限值之間的所有可能資料行值,但是不包括界限值本身。 最低的已排序資料行值就是第一個長條圖步驟的上限值。
下列長條圖顯示包含六個步驟的長條圖。 第一個上限值左側的區域就是第一個步驟。
每一個長條圖步驟:
粗線代表上限值 (RANGE_HI_KEY) 以及其所發生的次數 (EQ_ROWS)
RANGE_HI_KEY 左邊的實線區域代表資料行值範圍以及每一個資料行值發生的平均次數 (AVG_RANGE_ROWS)。 第一個長條圖步驟的 AVG_RANGE_ROWS 一定是 0。
虛線代表用來預估範圍內相異值總數的取樣值 (DISTINCT_RANGE_ROWS) 以及範圍內的值總數 (RANGE_ROWS)。 查詢最佳化工具會使用 RANGE_ROWS 和 DISTINCT_RANGE_ROWS 來計算 AVG_RANGE_ROWS,而且不會儲存取樣值。
查詢最佳化工具會根據長條圖步驟的統計重要性來定義長條圖步驟。 它會使用最大值差異演算法,讓長條圖中的步驟數減至最少,同時讓界限值之間的差異最大化。 步驟數的最大值為 200。 長條圖步驟的數目可以少於相異值數目,即使包含了少於 200 個界限點的資料行也是如此。 例如,包含 100 個相異值的資料行可以擁有少於 100 個界限點的長條圖。
密度向量
查詢最佳化工具會使用密度來增強查詢的基數預估,這些查詢會從相同的資料表或索引檢視表傳回多個資料行。 密度向量針對統計資料物件中資料行的每個前置詞各包含一個密度。 例如,如果統計資料物件具有 CustomerId、ItemId、Price 等索引鍵資料行,就會根據下列每一個資料行前置詞來計算密度。
資料行前置詞 |
計算密度的依據 |
---|---|
(CustomerId) |
與 CustomerId 的值相符的資料列 |
(CustomerId, ItemId) |
與 CustomerId 和 ItemId 的值相符的資料列 |
(CustomerId, ItemId, Price) |
與 CustomerId、ItemId 和 Price 的值相符的資料列 |
限制
DBCC SHOW_STATISTICS 不會提供空間或 xVelocity 記憶體最佳化的資料行存放區索引之統計資料。
權限
使用者必須擁有資料表,或者使用者必須是系統管理員 (sysadmin) 固定伺服器角色、db_owner 固定資料庫角色或 db_ddladmin 固定資料庫角色的成員,才能檢視統計資料物件。
SQL Server 2012 SP1 修改了權限限制,允許具有 SELECT 權限的使用者使用此命令。 請注意,必須先符合下列需求,足夠的 SELECT 權限才能執行此命令:
使用者必須有統計資料物件的所有資料行的權限
使用者必須有篩選條件 (如果有) 的所有資料行的權限
若要停用此行為,請使用追蹤旗標 9485。
範例
A.傳回所有的統計資料資訊
下列範例會顯示 AdventureWorks2012資料表中 Person.Address 資料表之 AK_Address_rowguid 索引的所有統計資料資訊。
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid);
GO
B.指定 HISTOGRAM 選項
下列範例會限制 HISTOGRAM 資料之 AK_Address_rowguid 索引所顯示的統計資料資訊。
DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid) WITH HISTOGRAM;
GO
請參閱
參考
CREATE STATISTICS (Transact-SQL)
DROP STATISTICS (Transact-SQL)
UPDATE STATISTICS (Transact-SQL)