关于SQL-Server的统计信息介绍

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 关于sql-server统计信息的简单介绍

经常会有遇到一些sql-server用户遇到关于统计信息的问题:

  1. 为什么query在有时候会偶发性的出现慢?
  2. 为什么在执行query时,需要更新统计信息?

SQL Server在运行指令的时候,也要知道所涉及的表格每个有多大,预期每张表格能够返回多少数据,每一步的结果集会多大。知道了这些信息,才能够选择比较好的执行计划。可是SQL Server是一个计算机程序,它是怎么知道这些信息的呢?这要靠statistics(统计信息)来帮忙。SQL Server会在每个索引上自动建立统计信息,也会根据运行指令的需要,动态地创建一些统计信息。统计信息的准确度,会直接影响SQL Server完成指令的速度。

下面截图显示在表top5m(有500万行)中,在20130107这个range里面Range-rows为13162,EQ_ROWS为15992,distinct_range_rows等于2,Avg_Range_rows为6581.
image

下面的结果给了非常明确的解释,6691+6471=13162. 13162/2=6581. 所以 Range_Hi_Key为20130107,指的是这个range的最大值,Range_rows是指的是中间的结果总数,EQ_Rows只是等于这个最大值的数据量。

image

列名 说明
Name 统计信息的名称。这里就是索引的名字,SalesOrderHeader_test_CL
Updated 上一次更新统计信息的日期和时间。这里是2009/8/29 3:00PM。这个时间非常重要,根据它能够判断统计信息是什么时候更新的,是不是在数据量发生变化以后,是不是存在统计信息不能反映当前数据分布特点的问题
Rows 表中的行数。完全正确地反映了当前表里数据量
Rows Sampled 统计信息的抽样行数
Steps 在统计信息的第三部分,会把数据分成几组。这里是3组。(分组的依据是什么?答:会根据数据的一个分部情况来分,根据数据‘长得像不像’来分。)
Density 第一个列前缀的选择性(不包括 EQ_ROWS)。
Average key length 所有列的平均长度。因为SalesOrderHeader_test_CL索引只有一列,数据类型是int,所以长度就是4。
String Index 如果为“是”,则统计信息中包含字符串摘要索引,以支持为 LIKE 条件估算结果集大小。仅适用于 char、varchar、nchar 和 nvarchar、varchar(max)、nvarchar(max)、text 以及 ntext 数据类型的前导列。这里是int,所以这个值是”NO”。

###统计信息的会在什么时候进行自动更新:
SQL Server不仅要建立合适的统计信息,还要及时更新它们,使它们能够反映表格里数据的变化。数据的插入、删除、修改都可能会引起统计信息的更新。但是,更新统计信息本身也是一件消耗资源的事情,尤其是对比较大的表格。如果有一点点小的修改SQL Server都要去更新统计信息,可能SQL Server就得光忙活这个,来不及做其他事了。SQL还是要在统计信息的准确度和资源合理消耗之间作一个平衡。在SQL 2005&2008,触发统计信息自动更新的条件是:

· 如果统计信息是定义在普通表格上的,那么当发生下面变化之一后,统计信息就被认为是过时的了。下次使用到时,会自动触发一个更新动作。
        1. 表格从没有数据变成有大于等于1条数据。
        2. 对于数据量小于500行的表格,当统计信息的第一个字段数据累计变化量大于500以后。

对于数据量大于500行的表格,当统计信息的第一个字段数据累计变化量大于500 + (20% * 表格数据总量)以后。所以对于比较大的表,只有1/5以上的数据发生变化后,SQL Server才会去重算统计信息。

回到最开始的两个问题:

  1. 其实是由于有些统计信息只会在query在执行的被进行自动更新。真正的执行。
  2. 由于不更新统计信息的话,那么优化器对query执行选择的执行计划就会不准确。
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
5月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
4月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
115 13
|
4月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
4月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
61 6
|
4月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
389 1
|
3月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
494 0
|
4月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
314 3
|
4月前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
4月前
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
80 2