12

是否所有 SQL Server 版本都会自动重建索引或具有默认的重建标准?我了解统计信息是自动重建的,但不确定索引是否也可以。

4

5 回答 5

9

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

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

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

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

于 2009-02-24T12:42:38.817 回答
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有一篇很棒的文章,其中包括一个完整的预制脚本。

于 2009-02-24T14:55:58.233 回答
1

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

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

于 2009-02-24T12:48:31.393 回答
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

希望这会有所帮助,但请随时提出进一步的疑问。

干杯,约翰

于 2009-02-24T16:13:53.367 回答
0

必须自己安排和安排。

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

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

为了快速修复,假设维护窗口很长且不太大(最多 100 GB),只需安排以下时间:

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

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

于 2009-02-24T12:46:37.467 回答