所有的SQL Server版本都会自动重建索引或者有默认的重建标准吗?我知道统计信息会自动重建,但不确定索引是否也会。
所有的SQL Server版本都会自动重建索引或者有默认的重建标准吗?我知道统计信息会自动重建,但不确定索引是否也会。
微软SQL Server的任何版本都不支持自动重建索引 - 原因是重建索引可能是非常昂贵的操作,因此需要仔细安排和计划。
在许多环境中,将编写特殊脚本来处理此操作,例如:
http://weblogs.sqlteam.com/tarad/archive/2008/09/03/Defragmenting-Indexes-in-SQL-Server-2005.aspx
请注意,尽管在许多情况下 SQL 可以自动为您更新统计信息,但通过更加谨慎地管理这些统计信息,也可以获得性能提升。正如其他人在这里提到的,你的索引不会自动重建。这在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的优秀文章,其中包括一个完整的预制脚本。
正如@Chris所指出的那样,在任何SQL Server版本中,索引都不会自动重建。对于没有专门的DBA角色的站点来说,适当的索引维护经常缺失,通常在数据库仅从开发阶段移至生产阶段时(连同事务日志维护一起)。
SQL Server 2005+具有在线索引重组和离线完全重建的功能。
进一步解释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
希望这可以帮到你,如果有进一步的问题,请随时提出。必须自己安排和安排时间表。
在整理时,取决于您的表格大小和维护窗口。
此外,当重建索引时,统计信息会自动重建,但可以单独安排时间表。
对于快速修复,假设有足够长的维护窗口且不太大(最多几百GB),只需安排如下:
EXEC sp_msforeachtable 'SET QUOTED_IDENTIFIER ON ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR = 90)'
编辑:仅适用于 > SQL 2005 的 SQL