问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sqlserver 重建索引和update 统计数据的区别

发布网友 发布时间:2022-04-10 08:56

我来回答

2个回答

懂视网 时间:2022-04-10 13:18

在创建索引的时候,SQLServer就会在索引列上创建统计信息。简单来说,统计信息就是索引或者列上能够描述数据分布的数据。

 

查询选择性:

公式:列上不重复数据的总数/列上的数据总数

选择性越高,索引性能越好,当上述公式的值为1时,可以用于做为主键或者唯一键。

 

创建和更新统计信息:

统计信息有助于SQLServer优化引擎选择合适的索引及相关操作用于执行SELECT语句。有两个方式创建和更新统计信息:

1、  手动创建和更新统计信息

2、  自动创建和更新统计信息

 

准备工作:

在开始之前,先来看看如何查找数据库的当前统计信息设置:

[sql] view plain copy print?
  1. SELECT  CASE WHEN DATABASEPROPERTYEX(‘master‘, ‘IsAutoCreateStatistics‘) = 1  
  2.              THEN ‘Yes‘  
  3.              ELSE ‘No‘  
  4.         END AS ‘IsAutoCreateStatistics?‘ ,  
  5.         CASE WHEN DATABASEPROPERTYEX(‘Master‘, ‘IsAutoUpdateStatistics‘) = 1  
  6.              THEN ‘Yes‘  
  7.              ELSE ‘No‘  
  8.         END AS ‘IsAutoUpdateStatistics?‘ ,  
  9.         CASE WHEN DATABASEPROPERTYEX(‘Master‘, ‘Is_Auto_Update_stats_async_on‘) = 1  
  10.              THEN ‘Yes‘  
  11.              ELSE ‘No‘  
  12.         END AS ‘IsAutoUpdateStatsaAyncOn?‘  
  13. GO  
SELECT CASE WHEN DATABASEPROPERTYEX(‘master‘, ‘IsAutoCreateStatistics‘) = 1
  THEN ‘Yes‘
  ELSE ‘No‘
 END AS ‘IsAutoCreateStatistics?‘ ,
 CASE WHEN DATABASEPROPERTYEX(‘Master‘, ‘IsAutoUpdateStatistics‘) = 1
  THEN ‘Yes‘
  ELSE ‘No‘
 END AS ‘IsAutoUpdateStatistics?‘ ,
 CASE WHEN DATABASEPROPERTYEX(‘Master‘, ‘Is_Auto_Update_stats_async_on‘) = 1
  THEN ‘Yes‘
  ELSE ‘No‘
 END AS ‘IsAutoUpdateStatsaAyncOn?‘
GO

 

 

下面的语句用于显示where子句中的数据库或者表的统计信息情况:

 

[sql] view plain copy print?
  1. SELECT  object_id ,  
  2.   
  3.         OBJECT_NAME(object_id) AS TableName ,  
  4.   
  5.         name AS StatisticsName ,  
  6.   
  7.         auto_created  
  8.   
  9. FROM    sys.stats  
  10.   
  11. --where object_id=OBJECT_ID(‘Sales.SalesOrderHeader‘)  
  12.   
  13. ORDER BY object_id DESC   
  14.   
  15. GO  
SELECT object_id ,

 OBJECT_NAME(object_id) AS TableName ,

 name AS StatisticsName ,

 auto_created

FROM sys.stats

--where object_id=OBJECT_ID(‘Sales.SalesOrderHeader‘)

ORDER BY object_id DESC 

GO

 

 

 

还可以使用以下方式查看:

[sql] view plain copy print?
  1. sp_helpstats ‘Sales.SalesOrderHeader‘  
  2.    
sp_helpstats ‘Sales.SalesOrderHeader‘
 

 

 

步骤:

1、  现在开始来看看创建和更新统计信息的不同方式,在数据库级别,有一个选项,默认为ON,这个选项是:Auto_Create_Statistics:

[sql] view plain copy print?
  1. ALTER DATABASE AdventureWorks SET AUTO_CREATE_STATISTICS ON  
 ALTER DATABASE AdventureWorks SET AUTO_CREATE_STATISTICS ON
 

 

2、  启用同步创建列上统计信息的选项,Auto_Create_Statistics,当执行一个查询一个精确数据量的数据时,优化引擎会在这个列上创建一个柱状图表。由SQLServer创建的统计信息以_WA开头,可以看看这些列表:

 

[sql] view plain copy print?
  1. SELECT  st.name AS StatName ,  
  2.   
  3.         COL_NAME(stc.object_id, stc.column_id) AS ColumnName ,  
  4.   
  5.         OBJECT_NAME(st.object_id) AS TableName  
  6.   
  7. FROM    sys.stats AS st  
  8.   
  9.         INNER JOIN sys.stats_columns AS stc ON st.object_id = stc.object_id  
  10.   
  11.                                                AND st.stats_id = stc.stats_id  
  12.   
  13. WHERE   st.name LIKE ‘_WA%‘  
SELECT st.name AS StatName ,

 COL_NAME(stc.object_id, stc.column_id) AS ColumnName ,

 OBJECT_NAME(st.object_id) AS TableName

FROM sys.stats AS st

 INNER JOIN sys.stats_columns AS stc ON st.object_id = stc.object_id

      AND st.stats_id = stc.stats_id

WHERE st.name LIKE ‘_WA%‘

 

 

3、  上面的统计信息不会因为Auto_Create_Statistics选项设为ON而结束。这些是强制你的统计信息更新以保证性能优秀。这个只是定义你的统计信息是否同步更新。默认情况下这个选项是为ON的。但是有时候不一定符合你的要求,此时可以使用手动更新计划:

[sql] view plain copy print?
  1. ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS ON  
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS ON

 

4、  Auto_Update_Statistics选项会在创建索引时、通过Auto_Create_Statistics或者用户使用CREATE STATISTICS命令手动创建统计信息时自动更新统计信息,下面命令使用异步方式更新统计信息:

[sql] view plain copy print?
  1. ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS_ASYNC ON  
ALTER DATABASE AdventureWorks SET AUTO_UPDATE_STATISTICS_ASYNC ON

 

5、  此时来看看执行上面语句后的数据库统计信息配置情况:

 

[sql] view plain copy print?
  1.  SELECT  is_auto_update_stats_async_on ,  
  2.   
  3.         is_auto_create_stats_on ,  
  4.   
  5.         is_auto_update_stats_on  
  6.   
  7. FROM    sys.databases  
  8.   
  9. WHERE   name = ‘AdventureWorks‘  
  10.    
 SELECT is_auto_update_stats_async_on ,

 is_auto_create_stats_on ,

 is_auto_update_stats_on

FROM sys.databases

WHERE name = ‘AdventureWorks‘
 

 

6、  上面的方式均为自动创建和更新统计信息,现在来看看如何手动实现:

[sql] view plain copy print?
  1. --创建统计信息在Sales.SalesOrderHeader表的DueDate列上  
  2.   
  3. CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate)  
  4.   
  5. GO  
  6.   
  7. --更新Sales.SalesOrderHeader表的全部统计信息  
  8.   
  9. UPDATE STATISTICS Sales.SalesOrderHeader  
  10.   
  11. GO  
  12.   
  13.    
  14.   
  15. --更新Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader统计信息  
  16.   
  17. UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader  
  18.   
  19. GO  
  20.   
  21.    
  22.   
  23. --更新数据库中所有可用的统计信息  
  24.   
  25. EXEC sys.sp_updatestats  
  26.   
  27. GO  
  28.   
  29. --手动删除统计信息  
  30.   
  31. DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader  
  32.   
  33. GO  
--创建统计信息在Sales.SalesOrderHeader表的DueDate列上

CREATE STATISTICS st_DueDate_SalesOrderHeader ON Sales.SalesOrderHeader(DueDate)

GO

--更新Sales.SalesOrderHeader表的全部统计信息

UPDATE STATISTICS Sales.SalesOrderHeader

GO

 

--更新Sales.SalesOrderHeader表的st_DueDate_SalesOrderHeader统计信息

UPDATE STATISTICS Sales.SalesOrderHeader st_DueDate_SalesOrderHeader

GO

 

--更新数据库中所有可用的统计信息

EXEC sys.sp_updatestats

GO

--手动删除统计信息

DROP STATISTICS Sales.SalesOrderHeader.st_DueDate_SalesOrderHeader

GO

 

分析:

当索引创建时,优化器会创建统计信息到索引列所在的表或者视图上,除此之外,如果对Auto_Create_Statistics选项设置了ON,优化器会创建一个单列统计信息,及时它没有出现在查询的所需列上。如果你觉得一些查询性能有问题,检查所有谓词,如果这些列缺失了统计信息,你可以手动增加,有时候,DTA(数据库优化顾问)也会建议你创建统计信息。

一般情况下,在查询编译之前,如果开启了同步更新统计信息,SQLServer如果发现统计信息过时,会引发更新统计信息的操作,然后你的查询就会使用上实时的统计信息。而这个操作会阻塞查询,知道更新结束,但是不会保留这些查询,它会更新统计信息以便下次运行查询的时候可以使用上较新的统计信息。

 

扩充知识:

默认情况下,只有sysadmin/db_owner/对象的创建者这三种角色的成员才有权限创建和更新统计信息。

 

柱状图:

柱状图是一类由SQLServer为了统计信息而生成的表。可以认为是一个显示对应列上统计信息最大和最小值范围的报表。

第十二章——SQLServer统计信息(1)——创建和更新统计信息

标签:启用   order by   权限   column   http   命令   title   like   列表   

热心网友 时间:2022-04-10 10:26

这个东西没有必须,谁也无法规定你一定要怎样,搞清楚做这件事是为了什么,你才知道有没有必要做。 重建索引的目的是为了让索引更高效的工作,如果一个索引长时间的没有整理,那么整个索引上的数据就会杂乱无章的排列,无法起到提高效率的作用,...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
想买红米但没银行卡 开美宜佳便利店是加盟好还是直接转一个美宜佳店好 ...就给你一个交易号,能到美宜佳付款,请问美宜佳是怎样付款的_百度知 ... 用美宜佳代购会不会看到我买的东西 重返帝国弓弩营对诸葛连弩有加成吗 重返帝国城市风格选什么好 重返帝国城市风格选择推荐 重返帝国城市风格怎么切换 重返帝国城市如何切换风格 重返帝国城市风格大全 特色兵种及增益介绍 重返帝国特殊兵种怎么生产-特殊兵种生产攻略 重返帝国怎么训练诸葛弩 新浪微博改密码的时候 为什么说异地登陆 暂不能修改密码!怎么弄好啊! 新浪微博常用地登陆设置在哪?我明明在家登陆 非说我在异地。。。 新浪微博账号由于被异地登陆,但是手机号码是以前的我已经换了没办法通过验证,现在已经锁定账号了,除了 关于新浪微博的问题 新浪微博被别人异地登陆了,怎么办?求解释? 韩剧幽灵最后结尾处柳江美说自己美女是过去的称呼,现在是新万金迷糊虫?什么意思呢》 苏志燮主演的电视剧幽灵最后一集,为什么朴奇永告诉赵贤敏申孝静死的时候,他会选择自杀,他爱申孝静吗? 枸杞,桂圆,荔枝可以放在一起泡酒吗 红枣荔枝桂圆可以和菊花枸杞金银花一起泡水喝吗 红塘枸杞荔枝泡水是否能喝 荔枝能和枸杞一起泡酒吗 我信用卡透支了五千元九年还没有还怎么办 三星a5手机看爱奇艺为什么不能竖屏 王守义的人物经历 信用卡透支五千六个月后还款可以吗? 信用卡透支五千多,没钱还,银行说让公安找我,怎么办 荔枝肉和枸杞一起煮可以吗?荔枝和玫瑰花可以一起泡水吗 信用卡逾期当天我还了最底还款额,但还欠款五千元该怎么还 荔枝能与枸杞同食吗? 信用卡欠了五千多块,没钱还怎么办 荔枝能和枸杞一起吃吗? DN50的PE管多少钱一米?DN300mm双壁波纹管(HDPE)多少钱一米? 华硕笔记本电脑怎么用u盘装linux 华硕linux系统怎么安装 华硕N43S,11年买的,安装Linux 系统,如何安装? 华硕eeebookx205ta安装Linux系统? 华硕r500VD怎么装win10和linux双系统? 接直径50公分燃气管(PE管)人工费多少钱一米 小额贷款被诈骗怎么处理 225pe场外按装多少钱一米 我想把linux系统装在u盘上,但是安装之前。要关闭sata。。我是华硕452m不知道怎么在bio 网上小额贷款被骗怎么办 pe管110多少钱一米 华硕bm6630怎么安装linux系统 请问大家遭遇诈骗了是怎么解决? 从50到200pE管焊接人工费多少钱一米 华硕F5笔记本安装LINUX 华硕F8H725SR_SL如何安装Linux操作系统(如ubuntu)? 华硕电脑装linux(回答满意有追加分) 中财PE管有没有穿线管 我朋友去小贷公司贷款被骗了,还签的有合同,怎么办