经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server重建索引与重组索引会更新统计信息吗?
来源:cnblogs  作者:潇湘隐者  时间:2019/10/15 10:34:34  对本文有异议

在SQL Server中重建索引(Rebuild Index)与重组索引(Reorganize Index)会触发统计信息更新吗? 那么我们先来测试、验证一下:

 

我们以AdventureWorks2014为测试环境,如下所示:

 

Person.Person表的统计信息最后一次更新为2014-07-17 16:11:31,如下截图所示:

 

  1.  
  1. DECLARE @table_name NVARCHAR(32);
  1. SET @table_name='Person.Person'
  1. SELECT sch.name + '.' + so.name AS table_name
  1.       , so.object_id
  1.       , ss.name  AS stat_name
  1.       , ds.stats_id
  1.       , ds.last_updated
  1.       , ds.rows
  1.       , ds.rows_sampled
  1.       , ds.rows_sampled*1.0/ds.rows *100 AS sample_rate
  1.       , ds.steps
  1.       , ds.unfiltered_rows
  1.       --, ds.persisted_sample_percent
  1.       , ds.modification_counter
  1.       , 'UPDATE STATISTICS ' + QUOTENAME(DB_NAME()) + '.' + QUOTENAME(sch.name) + '.' + QUOTENAME( so.name) + ' "' +  RTRIM(LTRIM(ss.name)) + '" WITH SAMPLE 80 PERCENT;'
  1.         AS update_stat_script
  1. FROM sys.stats ss
  1. JOIN sys.objects so ON ss.object_id = so.object_id
  1. JOIN sys.schemas sch ON so.schema_id = sch.schema_id
  1. CROSS APPLY sys.dm_db_stats_properties(ss.object_id,ss.stats_id) ds
  1. WHERE  so.is_ms_shipped = 0
  1.         AND so.object_id NOT IN (
  1.         SELECT  major_id
  1.         FROM    sys.extended_properties (NOLOCK)
  1.         WHERE   name = N'microsoft_database_tools_support' )
  1.         AND so.object_id =OBJECT_ID(@table_name)

 

clip_image001

 

 

  1. ALTER INDEX IX_Person_LastName_FirstName_MiddleName ON Person.Person REORGANIZE;
  1.  
  1.  
  1.  
  1. ALTER INDEX PK_Person_BusinessEntityID ON Person.Person REORGANIZE;

 

 

重组索引(Reorganize Index)后,验证发现,索引重组不会触发索引对应的统计信息更新。验证发现其不会触发任何统计信息更新。

 

 

 

clip_image002

 

 

结论:重组索引(Reorganize Index)不会触发对应索引的统计信息更新. 也不会触发其它统计信息更新。也就说,重组索引(Reorganize Index)不会触发任何统计信息更新。

 

 

那么重建索引(Rebuild Index)会更新对应的统计信息吗? 你可以测试、验证一下:如下所示,索引重建后,索引对应的统计信息更新了。

 

 

ALTER INDEX PK_Person_BusinessEntityID ON Person.Person REBUILD;

 

 

 

clip_image003

 

 

 

结论:重建索引(Rebuild Index)会触发对应索引的统计信息更新。但是,重建索引(Rebuild Index)不会触发其它统计信息更新。

 

 

 

 

 

重建索引会触发对应索引的统计信息更新,那么统计信息更新的采样比例是多少? 根据测试验证,采样比例为100%,如上截图所示,也就说索引重建使用WITH FULLSCAN更新索引统计信息. 如果表是分区表呢?分区表的分区索引使用默认采样算法(default sampling rate),对于这个默认采样算法,没有找到详细的官方资料。

 

官方文档:https://docs.microsoft.com/zh-cn/sql/relational-databases/partitions/partitioned-tables-and-indexes?view=sql-server-ver15里面有简单介绍:

 

 

已分区索引操作期间统计信息计算中的行为更改

 

从SQL Server 2012 (11.x)开始,当创建或重新生成已分区索引时,不会通过扫描表中的所有行来创建统计信息。 相反,查询优化器使用默认采样算法来生成统计信息。 在升级具有已分区索引的数据库后,您可以在直方图数据中注意到针对这些索引的差异。 此行为更改可能不会影响查询性能。 若要通过扫描表中所有行的方法获得有关已分区索引的统计信息,请使用 CREATE STATISTICS  UPDATE STATISTICS 以及 FULLSCAN 子句。

 

Starting with SQL Server 2012 (11.x), statistics are not created by scanning all the rows in the table when a partitioned index is created or rebuilt. Instead, the query optimizer uses the default sampling algorithm to generate statistics. After upgrading a database with partitioned indexes, you may notice a difference in the histogram data for these indexes. This change in behavior may not affect query performance. To obtain statistics on partitioned indexes by scanning all the rows in the table, use CREATE STATISTICS or UPDATE STATISTICS with the FULLSCAN clause.

原文链接:http://www.cnblogs.com/kerrycode/p/11675370.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号