SQL Server 统计信息(Statistics)-概念,原理,应用,维护

前言:统计信息作为sql server优化器生成执行计划的重要参考,需要数据库开发人员,数据库管理员对其有一定的理解,从而合理高效的应用,管理.

第一部分 概念

统计信息(statistics):描述某个(些)栏位,索引的数据分布情况.优化器用其评估生成高效执行计划.

密度(density):一个比率值,显示在一个(组)列中有多少唯一值.(实际应用中值越小越好)

Density = 1 / Number of distinct values for column(s)

直方图(histogram):将数据分割成不同的段(steps),用于描述,记录每段数据分布的具体情况(抽样创建).最多分为200 steps

DBCC show_statistics(object_name,Column_name)

Header(信息头)包含统计信息一系列元数据

Density(密度)包含列(列组)的密度信息及平均列(组)长度

Histogram(直方图)包含直方图描述信息.

Histogram(直方图)

RANGE_HI_KEY:直方图列(多列情况为首列记录)段的上限值.列值就是键值

RANGE_ROWS:其相应列值位于此段(不包含上限)的行得数量(估计值)

EQ_ROWS:等于其列值上限值的行数

DISTINCT_RANGE_ROWS: RANGE_ROWS中的非重复值数量

AVG_RANGE_ROWS:直方图段内值得平均行数(不包括上限)

DISTINCT_RANGE_ROWS > 0则为RANGE_ROWS / DISTINCT_RANGE_ROWS

第二部分 原理,应用

统计信息更新

统计信息可以人工维护更新或是由优化器在确认执行计划有效时依据之一:重编译阈值(recompilation threshold/RT)来决定统计信息是否过期而执行更新.

触发条件

当创建的表为空表时,添加一条数据则更新

当表数据小于500行时,记录更新标识(Modification Counters)大于500更新

当表数据大于500行时,记录更新标识大于500且20%行数变化(rowcnt)

注:临时表表很小(0行或者小于6行).6次变更触发更新.

表变量无统计信息

关于记录更新标识(Modification Counters)

Rowmodctr  sql2000及之前使用.记录在sys.sysindexes中.

注:此参数虽然高版本依赖其使用,但微软目前仍维护此参数变化可作为参考

colmodctr  sql2005及以后使用记录在sys.sysrscols. rcmodified中(需DAC访问)

此外DMV sys.system_internals_partition_columns的modified_count同样记录

Colmodctr(无需DAC)但不提供向上兼容.目前sql2012依然支持!

Colmodctr记录规则:

Insert    每添加一行所有列 Colmodctr+1=Colmodctr

Delete   每删除一行所有列Colmodctr+1=Colmodctr

Update  每修改一行 更新目标列Colmodctr+1=Colmodctr(sql2008+)

Sql2005更新目标列

        当修改列为NOKEY columns时Colmodctr+1=Colmodctr

当修改列为KEY columns时Colmodctr+2=Colmodctr

Bulk Insert 与N Rows Insert类似

Truncate table 与N Rows delete类似

注: Modification Counters非事务(如当插入1000条数据,然后rollback. Colmodctr会加1000)

过滤统计信息(filtered statistics)触发更新为整体数据区间而非过滤区间.一旦创建需人工维护

优化器应用统计信息.

优化器如何应用统计信息是一个比较复杂的方式.Sql Server在各版本之间应用方式甚至不尽相同.这里只做简单介绍.

优化器使用Statistics”偏好” 优先考虑最新的,Full Scan的统计信息

简单介绍下等式单谓词预估.

dbcc show_statistics(‘votes‘,‘IX_MultiColumn1‘)

select * from votes where topic_id=40

当谓词命中边界值时预估行数为EQ_ROWS

select * from votes where topic_id=10000

当谓词值在某个区间内,非命中边界值,预估值为AVG_Range_ROWS.即9042至16234间的所有谓词键值预估均为2.482208

declare @topic_id int

set @topic_id =1000

select * from votes where topic_id=@topic_id

当谓词为变量形式时,优化器不知道参数值.将采用 密度*行数的形式预估.

即topic_id=@topic_id 为0.000004936151*1943794=9.59486

第三部分 维护

查看统计信息

sp_autostats ‘votesbak‘---查看统计信息更新信息

sp_helpstats ‘votesbak‘,‘all‘ ---查看统计信息对应列/键值

dbcc show_statistics(‘votes‘,‘IX_MultiColumn1‘)—查看特定统计信息的详细内容

统计信息相关设置

AUTO_CREATE_STATISTICS         ----自动创建统计信息

AUTO_UPDATE_STATISTICS         ---自动更新统计信息

AUTO_UPDATE_STATISTICS_ASYNC   --自动异步更新统计信息(优化器会用旧的统计信息,而不重编译,立即执行.)

例子:

ALTER DATABASE [BitautoReview2] SET AUTO_UPDATE_STATISTICS_ASYNC ON

Trace Flag 2371       弹性根据条件更新统计信息

统计信息操作

Create Statistics  --创建统计信息

Update Statistics  --更新统计信息

Drop Statistics    --删除统计信息

维护统计信息时可选择样本量来进行创建,更新

update statistics [votes](IX_MultiColumn1)  with fullscan--手动更新指定索引的统计信息(一般针对特定统计信息问题时使用全扫描.更新时间较长可能影响性能)

UPDATE STATISTICS  Votes WITH SAMPLE 10 Percent;-----手动更新全表统计信息,样本采样10%(一般针对更新整个对象时使用,样本量与精确程度依环境而定)

UPDATE STATISTICS votes WITH ROWCOUNT =1000000,PAGECOUNT=100000---指定更新行数/页数(一般用于模拟当表数据量变得巨大时,优化器将采用何种执行计划)

统计信息最佳实践

AUTO_CREATE_STATISTICS , AUTO_UPDATE_STATISTICS一般无特殊应用自动打开.

AUTO_UPDATE_STATISTICS_ASYNC当触发更新的表巨大,统计信息更新会明显影响当前性能,且旧的统计信息对原有更新无明显影响时应设置为ON

Trace flag 2371 根据相应环境设置

由表变量造成的因无统计信息而使执行计划糟糕的情况用临时表代替

只读库(Readonly)配置前应创建相应统计信息

尽量避免变量,使用PROC传参形式,当使用动态SQL时用exec sp_executesql形式

过滤统计信息应人为维护

表达式(CTE)再参与Join的操作后,可能因执行逻辑无法获取准确统计信息,当出现此问题时用临时表或重写等方式代替

当数据倾斜很大,造成参数嗅探等问题时,应创建过滤统计信息(过滤索引),或是用query Hint,重写逻辑处理等方式处理.

SQL Server 统计信息(Statistics)-概念,原理,应用,维护

时间: 2024-10-13 20:59:38

SQL Server 统计信息(Statistics)-概念,原理,应用,维护的相关文章

SQL Server 统计信息维护策略的选择

SQL Server 统计信息维护策略的选择 问题描述: 在对OLTP系统的一个上千万的表做归档后,循环分批删除源表数据时,业务应用收到超时告警,如下: V1.1.1.1: ****Process - QueryTransactionFor****: 23075129 Timeout expired.   The timeout period elapsed prior to completion of the operation or the server is not responding.

全废话SQL Server统计信息(2)——统计信息基础

接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让全部习惯黑暗的眼睛都习惯光明--顾城<我是一个任性的孩子> 这一节主要介绍一些理论层面的东西,主要针对SQL Server,为后面的做铺垫.假设从实操层面考虑能够跳过,可是我强烈建议还是要找时间看一下这节.本节的内容例如以下: SQL Server统计信息 列级统计信息 统计信息与运行计划 统计信息与内存分配 开销预估模型 SQL Server统计

翻译之:SQL Server统计信息简介

本文选自<Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress 出版年: 2016-12-29 页数: 804 作者简介:Dmitri Korotkevitchis是微软SQL Server MVP和微软认证大师.作为应用程序和数据库开发人员.数据库管理员和数据库架构师,他具有多年使用SQL Server的经验.他专门从事OLTP系统在高负载下的设计.开发和性能调优.Dmitri经常在各种Microsoft和SQL PASS

SQL Server统计信息:问题和解决方式

在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看原文:SQL Server Statistics: Problems and Solutions 正文: SQL Server统计信息协助查询优化器计算执行查询的最优方式. Holger描写叙述了常见的统计信息出错的事情,而且怎样改善 通常你不须要太操心运行SQL查询的方式.他们被传送到查询优化器,

SQL Server统计信息:问题和解决方案

在网上看到一篇介绍使用统计信息出现的问题已经解决方案,感觉写的非常全面.在自己看的过程中顺便做了翻译.由于本人英文水平有限,可能中间有一些错误.如果有哪里有问题欢迎大家批评指正.建议英文好的直接看原文:SQL Server Statistics: Problems and Solutions 正文: SQL Server统计信息协助查询优化器计算运行查询的最优方式. Holger描述了常见的统计信息出错的事情,并且如何改善 通常你不需要太担心执行SQL查询的方式.他们被传送到查询优化器,首先检查

SQL Server统计信息偏差影响表联结方式案例浅析

原文:SQL Server统计信息偏差影响表联结方式案例浅析   我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适的例子上,所以一直拖着没有写.巧合,最近在生产环境中遇到这么一个案例,下面对案例中的相关信息做了脱敏处理,有些中间步骤也省略了,只关注核心部分SQL.如下所示,同事反馈一个SQL语句执行很慢.   UPDATE  b SET     b.[Status] = '已扫描,未签收' ,      

全废话SQL Server统计信息(1)——统计信息简介

当心空无一物,它便无边无涯.树在.山在.大地在.岁月在.我在.你还要怎样更好的世界?--张晓风<我在> 为什么要写这个内容? 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题,其根源在于统计信息.这里说的是根源,其实很多时候大家觉得的那些什么索引失效等都只是表象.当然,不能一概而论,还有很多问题如配置问题.设计问题等等,甚至电源也会影响性能. 之所以得出这个结论,因为在常规的开发和部署过程中,一般企业级系统已经大量使用较为高级的磁盘阵列甚至企业级SSD,IO方面的问题已经很少,而

SQL SERVER 统计信息概述(Statistics)

前言 查询优化器使用统计信息来创建可提高查询性能的查询计划,对于大多数查询,查询优化器已经为高质量查询计划生成必要的统计信息,但是在少数情况下,您需要创建附加的统计信息或者修改查询设计以得到最佳结果.因此理解和合理使用统计信息是数据库优化的方式之一.   统计信息的分类 根据创建源的不同,统计信息分为两种表统计信息和索引统计信息,除非你自定义它们,否则它们之间没有本质的区别. 索引统计信息建立在索引上面,因此对于创建已经存在的数据上,在创建索引的时候会扫描全部数据,这些数据也会创建在索引的统计信

Statistics Sql Server 统计信息

统计信息的作用是:查询优化器使用统计信息来创建可提高查询性能的查询计划. 统计信息是数据库的object,提供的统计信息是关于table或indexed view上列的统计信息. Statistics for query optimization are objects that contain statistical information about the distribution of values in one or more columns of a table or indexed