一、總結
1.網址
https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-stats-transact-sql?view=sql-server-2017(sys.stats)
2.什么是統計信息?
統計信息描述了表格或者索引視圖中的某些列的值的分布情況,屬於數據庫對象.
3.根據統計信息,查詢優化器就能評估查詢過程中需要讀取的行數以及結果集情況,同時也能創建高質量的查詢計划.其實統計信息就是對表的各個字段的總體數據進行分段分布,數據庫默認會自動維護.
4.當表的某列第一次作為條件查詢時,將創建單列的統計信息,名稱以_WA開頭,可以通過sys.stats視圖查看.
5.當創建索引時,將創建同名的統計信息.索引中,統計信息只統計首列,因此索引除了按首列排序存儲數據外,其統計信息也是按首列計算統計的,所以索引設計時定義首列非常重要.
6.臨時表上可以有統計信息,其維護策略和普通表一樣,但是表變量上不能創建統計信息.
7.SSMS中查看表的統計信息
8.查看統計信息是否自動更新
二、用到的SQL
1.列出表的所有統計信息
命令: select * from run.sys.stats where object_id=object_id('run.dbo.T1')
2.查看統計信息及其對應的列
命令: select s.name as statistics_name ,c.name as column_name ,sc.stats_column_id
from run.sys.stats as s
inner join run.sys.stats_columns as sc on s.object_id=sc.object_id and s.stats_id=sc.stats_id
inner join run.sys.columns as c on sc.object_id=c.object_id and sc.column_id=c.column_id
where s.object_id=object_id('run.dbo.bcp_bj_orderrec')
3.DBCC SHOW_STATISTICS()查看統計信息
命令: dbcc show_statistics('run.dbo.bcp_bj_orderrec','_WA_Sys_00000002_5595C582')
注:主要分為三部分,"統計信息頭部","密度向量","直方圖"
(1)統計信息頭部信息
(2)密度信息
(3)直方圖
4.用腳本設置統計信息
命令: alter database run set auto_create_statistics on with no_wait
5.創建統計信息
命令:create statistics serveridtest on run.dbo.bcp_bj_orderrec(serverid) with fullscan;
6.更新整個庫上的統計信息
命令: exec sp_updatestats
7.更新整個表的統計信息
命令:update statistics run.dbo.T1
update statistics test.dbo.T1 with fullscan --完全掃描
8.更新指定的的統計信息
命令:update statistics run.dbo.T1 [_WA_Sys_00000001_0EA330E9]
9.完全掃描,按行數掃描,按百分比掃描更新統計信息
(1).所有現有統計信息,完全掃描
命令:update statistics run.dbo.T1 with fullscan
(2).僅限列統計信息,按行數抽樣更新
命令:update statistics run.dbo.T1 with sample 50 rows,columns
(3).僅限索引統計信息,按百分比抽樣更新
命令:update statistics run.dbo.T1 with sample 50 percent,index
10.刪除統計信息
命令: drop statistics dbo.T1.[_WA_Sys_00000001_0EA330E9]
11、查看有索引的表有多少條數據需要更新統計信息
select
ss.name AS SchemaName
,st.name AS TableName
,si.name AS IndexName
,ssi.rowcnt
,ssi.rowmodctr
FROM sys.indexes si
INNER JOIN sys.sysindexes ssi ON si.object_id = ssi.id
AND si.name = ssi.name
INNER JOIN sys.tables st ON st.[object_id] = si.[object_id]
INNER JOIN sys.schemas ss ON ss.[schema_id] = st.[schema_id]
WHERE st.is_ms_shipped = 0
AND si.index_id != 0 --0代表的是堆表
AND ssi.rowcnt > 10
rowcnt:表的總行數
rowmodctr:自上次更新統計信息后,增刪改的行數,該值就是需要更新統計信息的count數