10-SQLServer中統計信息的使用


一、總結

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數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM