基于SQL Server统计更新机制
目前进行数据库优化的命令使用的是dbcc dbreindex或者采用SQL Server的重新生成索引的维护计划。
那么会关心一个问题,非索引的字段是否会被收集呢?
以物料表为例:
在表没有被查询的情况下,使用下面的SQL语句,可以看到统计信息的情况为:
select stats_date(s.object_id,s.stats_id) updatedate, c.name colname ,object_name(s.object_id) tablename ,s.name statsname from sys.stats s inner join sys.stats_columns sc on s.object_id = sc.object_id and s.stats_id = sc.stats_id inner join sys.columns c on s.object_id = c.object_id and sc.column_id = c.column_id where s.object_id=object_id('T_BD_MATERIAL')
可以看到非索引的字段没有在统计信息里面,组合索引的每个字段都被统计了。
那什么时候统计信息会发生变化呢?
执行一个带where条件查询语句,行数返回0行结果
查询统计信息的情况,可以看到默认增加了一条基于FSPUID字段名称为_WA…的统计信息。【_WA为系统自动生成统计的命名规则】
这个信息是如何产生的呢,实际上是通过下面的数据库的参数来实现的
如果关闭改参数后,那么执行带where条件的查询,是不会产生基于条件字段的统计系信息的。
如,执行
查看统计信息,可以看到并没有生成基于查询字段的统计信息。
那么,当系统自动生成统计后,使用dbcc dbreindex是否会同时更新系统生成的统计信息呢?执行下面的示例:
首先执行dbcc dbreindex(‘T_BD_MATERIAL’),然后再查询统计信息的情况,可以看到最后更新的日期已经改变,说明是一并更新的。
结论:基于非索引字段的统计信息,SQL Server会根据查询条件,如果字段没有建立统计,会自动建立统计信息(前提数据库的自动创建和更新统计需要开启),并且在执行dbcc dbreindex的时候会跟索引一并更新。
所以,进行表结构设计时,对于代码中会频繁使用的作为条件查询和关联的字段,唯一性高的字段,一定要建立索引。否则当备份的数据库没有统计信息时,还原到新的SQL Server时,会由于没有统计信息而导致第一查询非常慢。
基于SQL Server统计更新机制
本文2024-09-23 01:18:00发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-145049.html