SQL Server 查找統計信息的相關採樣信息 有時候我們會遇到,由於統計信息不准確導致優化器生成了一個錯誤的執行計劃(或者這樣表達:一個較差的執行計劃),從而引起了系統性能問題。那麼如果我們懷疑這個錯誤的執行計劃是由於統計信息不准確引起的。那麼我們如何判斷統計信息不准確呢?當然首先得去查看實際執... ...
SQL Server 查找統計信息的相關採樣信息
有時候我們會遇到,由於統計信息不准確導致優化器生成了一個錯誤的執行計劃(或者這樣表達:一個較差的執行計劃),從而引起了系統性能問題。那麼如果我們懷疑這個錯誤的執行計劃是由於統計信息不准確引起的。那麼我們如何判斷統計信息不准確呢?當然首先得去查看實際執行計劃中,統計信息的相關數據是否與實際情況有較大的出入,下麵我們拋開這個大命題,僅僅從統計信息層面去查看統計信息的更新時間,統計信息的採樣行數等情況。
1:首先,我們要查查統計信息是什麼時候更新的。
2:其次,我們查看統計信息的採樣信息:採樣選取的行數、自上次更新統計信息以來前導統計信息列(構建直方圖的列)的總修改次數。。。
查看統計信息的最後更新時間。
方法1:
--查看統計信息的更新時間
DECLARE @TableName NVARCHAR(128);
SET @TableName = 'dbo.pbCutClothCost';
SELECT @TableName AS Table_Name,
name AS Stats_Name ,
STATS_DATE(object_id, stats_id) AS Last_Stats_Update
FROM sys.stats
WHERE object_id = OBJECT_ID(@TableName)
ORDER BY 2 DESC;
如上所示,我們通過這個腳本查看某個表,所有的統計信息最後一次更新時間。如果你需要查看某個具體的統計信息的最後更新時間,那麼在這個SQL的基礎上增加相關查詢條件即可。
方法2:
--查看統計信息的更新時間
EXEC sp_autostats 'dbo.pbCutClothCost';
方法3:
還有一種方法可以通過 sys.dm_db_stats_properties 返回統計信息的更新時間,不過這個DMF只有SQL Server 2008 R2 SP2這個版本之後的才有。
列名 |
數據類型 |
Description |
object_id |
int |
要返回統計信息對象屬性的對象(表或索引視圖)的 ID。 |
stats_id |
int |
統計信息對象的 ID。 在表或索引視圖中是唯一的。 有關詳細信息,請參閱 sys.stats (Transact-SQL)。 |
last_updated |
datetime2 |
上次更新統計信息對象的日期和時間。 有關詳細信息,請參閱此頁中的備註部分。 |
rows |
bigint |
上次更新統計信息時表或索引視圖中的總行數。 如果篩選統計信息或者統計信息與篩選索引對應,該行數可能小於表中的行數。 |
rows_sampled |
bigint |
用於統計信息計算的抽樣總行數。 |
Step |
int |
直方圖中的值範圍數(步長)(Number of steps in the histogram)。 有關詳細信息,請參閱 DBCC SHOW_STATISTICS (Transact-SQL)。 |
unfiltered_rows |
bigint |
應用篩選表達式(用於篩選的統計信息)之前表中的總行數。 如果未篩選統計信息,則 unfiltered_rows 等於行列中返回的值。 |
modification_counter |
bigint |
自上次更新統計信息以來前導統計信息列(構建直方圖的列)的總修改次數。 |
persisted_sample_percent |
float |
持久樣本百分比用於未顯式指定採樣百分比的統計信息更新。 如果值為零,則不為此統計信息設置持久樣本百分比。 |
查看採樣的相關信息
SELECT sch.name + '.' + so.name AS table_name
, so.object_id
, ss.name AS stat_name
, ds.stats_id
, ds.last_updated
, ds.rows
, ds.rows_sampled
, ds.steps