所有的 SQL Server 版本都会自动重建索引或有默认的重建标准吗?

12

所有的SQL Server版本都会自动重建索引或者有默认的重建标准吗?我知道统计信息会自动重建,但不确定索引是否也会。


我认为统计数据不会自动重建 - 它们只有在索引重建时或通过特定命令重建。维护向导将允许您设置合理的“入门级”数据库维护程序,但对于更大/繁忙的数据库,您可能需要构建更复杂的程序。 - Kristen
请查看我的答案,了解SQL Server中统计信息的工作原理。 - John Sansom
5个回答

9

微软SQL Server的任何版本都不支持自动重建索引 - 原因是重建索引可能是非常昂贵的操作,因此需要仔细安排和计划。

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

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

请注意,尽管在许多情况下 SQL 可以自动为您更新统计信息,但通过更加谨慎地管理这些统计信息,也可以获得性能提升。

我看到你的答案是从2009年的,这对于更新版本的SQL Server是否仍然有效呢? - Felipe Sabino
据我所知,这仍然有效,尽管可能有更好的选择来帮助您设置此类维护作业。也许可以在http://dba.stackexchange.com上检查一下? - Chris

8

正如其他人在这里提到的,你的索引不会自动重建。这在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

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

您可以轻松构建一个脚本来自动重建或重新组织它们。有一篇SQLFool的优秀文章,其中包括一个完整的预制脚本。


感谢提供脚本。但是我不得不将OBJECT_ID替换为object_id,d.objectid替换为d.objectID。我猜这是因为根据我的当前编码,小写字符的大小写敏感性导致的。 - Fer

1

正如@Chris所指出的那样,在任何SQL Server版本中,索引都不会自动重建。对于没有专门的DBA角色的站点来说,适当的索引维护经常缺失,通常在数据库仅从开发阶段移至生产阶段时(连同事务日志维护一起)。

SQL Server 2005+具有在线索引重组和离线完全重建的功能。


1

进一步解释Chris所说的:

关于统计数据,未被索引覆盖的列将不会在重建所有索引时更新其统计数据。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

希望这可以帮到你,如果有进一步的问题,请随时提出。
祝好,约翰

0

必须自己安排和安排时间表。

在整理时,取决于您的表格大小和维护窗口。

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

对于快速修复,假设有足够长的维护窗口且不太大(最多几百GB),只需安排如下:

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

编辑:仅适用于 > SQL 2005 的 SQL


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接