基于SQL Server统计更新机制

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

基于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统计更新机制

目前进行数据库优化的命令使用的是dbcc dbreindex或者采用SQL Server的重新生成索引的维护计划。 那么会关心一个问题,非索引的字...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息