在SQL Server中重建索引(Rebuild Index)與重組索引(Reorganize Index)會觸發統計信息更新嗎? 那麼咱們先來測試、驗證一下:算法
咱們以AdventureWorks2014爲測試環境,以下所示:sql
Person.Person表的統計信息最後一次更新爲2014-07-17 16:11:31,以下截圖所示:數據庫
DECLARE @table_name NVARCHAR(32);
SET @table_name='Person.Person'
SELECT sch.name + '.' + so.name AS table_name
, so.object_id
, ss.name AS stat_name
, ds.stats_id
, ds.last_updated
, ds.rows
, ds.rows_sampled
, ds.rows_sampled*1.0/ds.rows *100 AS sample_rate
, ds.steps
, ds.unfiltered_rows
--, ds.persisted_sample_percent
, ds.modification_counter
, 'UPDATE STATISTICS ' + QUOTENAME(DB_NAME()) + '.' + QUOTENAME(sch.name) + '.' + QUOTENAME( so.name) + ' "' + RTRIM(LTRIM(ss.name)) + '" WITH SAMPLE 80 PERCENT;'
AS update_stat_script
FROM sys.stats ss
JOIN sys.objects so ON ss.object_id = so.object_id
JOIN sys.schemas sch ON so.schema_id = sch.schema_id
CROSS APPLY sys.dm_db_stats_properties(ss.object_id,ss.stats_id) ds
WHERE so.is_ms_shipped = 0
AND so.object_id NOT IN (
SELECT major_id
FROM sys.extended_properties (NOLOCK)
WHERE name = N'microsoft_database_tools_support' )
AND so.object_id =OBJECT_ID(@table_name)
ALTER INDEX IX_Person_LastName_FirstName_MiddleName ON Person.Person REORGANIZE;
ALTER INDEX PK_Person_BusinessEntityID ON Person.Person REORGANIZE;
重組索引(Reorganize Index)後,驗證發現,索引重組不會觸發索引對應的統計信息更新。驗證發現其不會觸發任何統計信息更新。app
結論:重組索引(Reorganize Index)不會觸發對應索引的統計信息更新. 也不會觸發其它統計信息更新。也就說,重組索引(Reorganize Index)不會觸發任何統計信息更新。性能
那麼重建索引(Rebuild Index)會更新對應的統計信息嗎? 你能夠測試、驗證一下:以下所示,索引重建後,索引對應的統計信息更新了。測試
ALTER INDEX PK_Person_BusinessEntityID ON Person.Person REBUILD;優化
結論:重建索引(Rebuild Index)會觸發對應索引的統計信息更新。可是,重建索引(Rebuild Index)不會觸發其它統計信息更新。ui
重建索引會觸發對應索引的統計信息更新,那麼統計信息更新的採樣比例是多少? 根據測試驗證,採樣比例爲100%,如上截圖所示,也就說索引重建使用WITH FULLSCAN更新索引統計信息. 若是表是分區表呢?分區表的分區索引使用默認採樣算法(default sampling rate),對於這個默認採樣算法,沒有找到詳細的官方資料。spa
官方文檔:https://docs.microsoft.com/zh-cn/sql/relational-databases/partitions/partitioned-tables-and-indexes?view=sql-server-ver15裏面有簡單介紹:code
已分區索引操做期間統計信息計算中的行爲更改
從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.