是否所有SQL Server版本都自动重建索引或具有默认的重建条件?

时间:2009-02-24 12:39:07

标签: sql-server indexing maintenance

是否所有SQL Server版本都自动重建索引或具有默认的重建条件?我知道统计数据会自动重建,但不确定索引是否也可以。

5 个答案:

答案 0 :(得分:9)

在任何版本的Microsoft SQL Server中都不会自动支持重建索引 - 原因是重建索引可能是非常昂贵的操作,因此需要仔细调度和规划。

在许多环境中,将编写特殊脚本来处理此问题,例如:

http://weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx

请注意,虽然SQL可以在很多情况下自动为您更新统计信息,但通过更仔细地管理这些统计信息可以获得性能提升。

答案 1 :(得分:7)

正如人们在此处提到的,您的索引不会自动重建。这在SQL Server中是一个非常大的问题,因为索引会随着时间的推移而碎片化。您可以发现您的索引是95%加上碎片,严重影响了查询性能。

这是一个检查现有索引碎片的简单查询:

DECLARE @DBNAME VARCHAR(130);
SET @DBNAME = 'MYDBNAME';

DECLARE @DBID INT;
SET @DBID = DB_ID(@DBNAME);

SELECT
OBJECT_ID AS objectID
, index_id AS indexID
, avg_fragmentation_in_percent AS fragmentation
, page_count 
INTO #indexDefragList
FROM
sys.dm_db_index_physical_stats 
(@DBID, NULL, NULL , NULL, N'Limited')
WHERE
index_id > 0
OPTION (MaxDop 1);

SELECT
i.[name] as indexname,
d.fragmentation,
d.page_count
FROM
#indexDefragList d
INNER JOIN sys.indexes i
ON d.objectid = i.object_id
ORDER BY 
d.fragmentation DESC

DROP TABLE #indexDefragList

这将返回当前数据库中所有索引的列表,其碎片为%。

您可以轻松构建脚本以自动重建或重新组织它们。有一个great article from SQLFool on this,包括一个完整的预制脚本。

答案 2 :(得分:1)

扩展克里斯所说的话:

对于统计信息,索引未涵盖的列不会通过重建所有索引来更新其统计信息。它们可能会定期由SQL Server更新,但您可能需要使用UPDATE STATISTICS语句自行完成此操作。

SQL Server 2005根据列修改计数器(colmodctrs)的更改确定是否自动更新统计信息。

在以下情况下,统计对象被视为过时:

1.表格大小从0到0行。

2.收集统计信息时表中的行数为500或更少,统计对象的前导列的colmodctr自那时起已经改变了500多个。

3.收集统计信息时,该表有超过500行,统计对象的前导列的colmodctr在统计数据时已更改超过表中行数的500 + 20%聚集

您可以找到以下有关使用统计数据的参考资料:

http://blogs.technet.com/rob/archive/2008/05/16/sql-server-statistics.aspx

希望这会有所帮助,但可以随意提出进一步的询问。

干杯,约翰

答案 3 :(得分:0)

必须安排好自己安排。

排序时,它取决于表的大小和维护窗口。

此外,重建索引时会自动重建统计信息,但可以单独安排。

要快速修复,假设一个很好的长维护窗口而不是太大(最多几百GB),只需安排一下:

EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)'

编辑:仅适用于> SQL 2005这个SQL

答案 4 :(得分:0)

正如@Chris所说,索引不会在任何SQL Server版本中自动重建。没有专门的DBA角色的站点通常会缺少适当的索引维护,并且通常只需将数据库从开发转移到生产(以及事务日志维护)。

SQL Server 2005+能够进行在线索引重组和脱机完全重建。