为 Project Server 2007 数据库索引进行碎片整理
更新时间: 2008年9月
上一次修改主题: 2015-03-09
可以通过执行 Transact-SQL 命令或运行数据库维护向导来执行数据库维护任务。本文提供了有关这两种方法的详细信息。
针对 Microsoft Office Project Server 2007 数据库推荐的数据库维护任务包括:
检查数据库完整性
通过重新组织或重新生成索引以对其进行碎片整理
设置服务器的填充因子
监视数据库大小以预先增大数据库或缩小数据库
清理历史记录
更新统计信息
通过重新组织或重新生成操作对索引进行碎片整理
在以下情况下会出现碎片:数据库的逻辑和物理存储分配中包含众多零散的存储区域,这些区域或是空间不足、物理上不连贯,或是包含太多碎片以致无法得到有效利用。碎片可能是由于对表进行了过多的插入、更新或删除操作造成的。当表中出现碎片时,在表上定义的索引中也会出现碎片。
Office Project Server 2007 将 GUID 类型用作聚集键,这样可以避免在相同数据页(插入热点)上同时进行插入操作,但这可能是造成表碎片和索引碎片的原因。可能出现碎片的原因是,在 B 树中可以将新记录插入到末尾以外的任何地方,导致页面拆分(索引和数据)趋势增强,因而出现碎片。可通过聚集组合键来减少碎片,这些组合键使用项目 UID 确保数据页中包含相关数据,但是对较大的表进行定期碎片整理将改进性能,特别是在 Office Project Server 2007 的大型部署中。
随着时间的推移,数据库碎片可能导致性能降低(不必要的磁盘活动)和空间利用率不足。若要减少碎片并最大程度降低碎片发生率,请根据业务要求和数据库体系结构,手动将内容数据库大小尽可能设大。例如,如果要求您将内容数据库大小限制为 100 GB,则在创建了内容数据库后,您需要在 SQL Server Management Studio 中将数据库大小设置为 100 GB。
尽管您可以对表进行碎片整理,但是对索引进行碎片整理更利于提高数据库性能,而且速度快得多。本文仅介绍如何对索引进行碎片整理。
在执行数据库碎片维护计划之前,先确定碎片最多的表和索引,然后创建维护计划以重新生成或重新组织这些索引。
可以按以下方式测量碎片值:
在 SQL Server 2005 中,使用 sys.dm_db_index_physical_stats 动态管理视图
在 SQL Server 2000 中,使用 DBCC SHOWCONTIG
请注意,sys.dm_db_index_physical_stats 中的碎片算法较 DBCC SHOWCONTIG 中的更为精确。因此,由 sys.dm_db_index_physical_stats 计算得出的碎片值会较大。
使用 sys.dm_db_index_physical_stats (SQL Server 2005) 测量碎片值
在 SQL Server 2005 中,使用 sys.dm_db_index_physical_stats 动态管理视图来确定指定表或视图中索引的碎片。
为了测量碎片值,建议您监视“avg_fragmentation_in_percent”列。“avg_fragmentation_in_percent”的值应尽可能接近 0,才能获得最佳性能。但是,可以接受从 0% 到 10% 之间的值。
有关如何使用 sys.dm_db_index_physical_stats 的信息,请参阅 sys.dm_db_index_physical_stats (https://go.microsoft.com/fwlink/?linkid=128479\&clcid=0x804)
使用 DBCC SHOWCONTIG (SQL Server 2000) 测量碎片值
若要检查数据库表的碎片,管理员可以使用 DBCC SHOWCONTIG 功能来报告逻辑和区扫描碎片。有关 DBCC SHOWCONTIG 结果的完整说明,请参阅 DBCC SHOWCONTIG(该链接可能指向英文页面) (https://go.microsoft.com/fwlink/?linkid=110841\&clcid=0x804)。
为了测量碎片值,建议您监视由 DBCC SHOWCONTIG 返回的扫描密度值。在各部分连贯的表中,扫描密度为 100。
减少数据库碎片
若要降低索引碎片的级别,请运行 Microsoft 知识库文章如何对 Windows SharePoint Services 3.0 数据库和 SharePoint Server 2007 数据库进行碎片整理 (https://go.microsoft.com/fwlink/?linkid=110843\&clcid=0x804) 中的存储过程。
在确定数据库的碎片级别之后,您可以安排每日、每周或每月运行存储过程,具体取决于您的需求以及环境的整体更改率。通常,我们建议您至少制定一个碎片整理周计划。还建议您在运行 DBCC CHECKDB REPAIR 操作之后安排碎片整理操作。
该存储过程会更改您的内容数据库索引。不支持对存储过程进行任何修改。有关对 SharePoint 产品和技术内容数据库支持的更改的其他信息,请参阅 Microsoft 知识库文章支持对 Office Server 产品和 Windows SharePoint Services 所使用的数据库进行更改 (https://go.microsoft.com/fwlink/?linkid=110844\&clcid=0x804)。
减少特定表及其索引的碎片
如果希望对与特定表(而非整个数据库)关联的索引进行碎片整理,则可以重新组织或重新生成索引。有关详细信息,请参阅聚集索引结构 (https://go.microsoft.com/fwlink/?linkid=128480\&clcid=0x804)。
重新组织 索引即重新组织索引叶级别。索引重新组织操作会对表和视图上的聚集索引和非聚集索引进行碎片整理和压缩,并且可以显著提高索引扫描性能。重新组织始终联机执行,以便用户可以使用基础表。重新组织等效于 SQL Server 2000 的 DBCC INDEXDEFRAG 语句。
重新生成 索引即使用相同的列、索引类型、唯一属性和排序顺序来重新生成索引。重新生成操作可提高索引扫描和搜寻的性能。您可以用表联机或脱机重新生成索引。重新生成等效于 SQL Server 2000 的 DBCC DBREINDEX 语句。
索引的碎片级别决定了应对索引采用的碎片整理方法,以及是应该保持联机还是脱机。
碎片级别 | 碎片整理方法 |
---|---|
最多 10% |
重新组织(联机) |
10 – 75% |
重新生成(联机) |
75% 或更高 |
重新生成(脱机) |
请注意,不支持对 SharePoint 产品和技术数据库使用 DROP INDEX 和 CREATE INDEX 命令。
通过使用 SQL Server 2005 ALTER INDEX 语句、SQL Server 2005 维护向导、SQL Server 2000 DBCC INDEXDEFRAG 和 DBCC DBREINDEX 语句,或使用 SQL Server 2000 维护向导,您可以重新组织和重新生成索引。本主题仅详细介绍 SQL Server 2005 选项。有关 SQL Server 2000 选项的详细信息,请参阅以下资源:
DBCC INDEXDEFRAG(该链接可能指向英文页面) (https://go.microsoft.com/fwlink/?linkid=128482\&clcid=0x804)
DBCC DBREINDEX(该链接可能指向英文页面) (https://go.microsoft.com/fwlink/?linkid=128483\&clcid=0x804)
数据库维护计划向导(该链接可能指向英文页面) (https://go.microsoft.com/fwlink/?linkid=110849\&clcid=0x804)
使用 ALTER INDEX
ALTER INDEX 允许数据库管理员对现有的表或视图索引执行维护操作。它可以用于禁用、重新生成和重新组织索引,或者可用于设置索引选项(可选)。ALTER INDEX 将代替 DBCC DBREINDEX 和 DBCC INDEXDEFRAG 语句。
在大多数情况下,您可以在数据库处于联机状态时重新生成索引,原因是脱机重新生成索引没有显著的优势。但是,请务必注意,在重新生成索引时,表上应该有一个共享表锁,用于阻止执行 SELECT 操作以外的所有操作。SharePoint 产品和技术数据库专门使用聚集索引。在重新生成聚集索引时,表上应该有一个独占表锁,用于阻止最终用户访问任何表。
通过自定义下列示例脚本,您可以重新生成表上的所有索引。
USE Contoso_Content_1
GO
ALTER INDEX ALL ON [database_name. [ schema_name ] . | schema_name. ]table_or_view_name
REBUILD WITH (FILLFACTOR = 70, SORT_IN_TEMPDB = ON, ONLINE = ON,
STATISTICS_NORECOMPUTE = ON)
GO
报表数据库的特殊注意事项
由于我们希望客户基于报表数据库中提供的自定义域和数据来实现自定义报表,因此,我们建议按照 T-SQL 编写和索引创建的最佳实践执行操作,以保证报表解决方案的可伸缩性和性能。Office Project Server 2007 不会对主键以外的这些动态生成的表编制索引。Microsoft Office Server 的基础结构更新提供了附加功能。有关详细信息,请参阅标题为服务器和客户端的 Project 2007 结构更新发布 (https://go.microsoft.com/fwlink/?linkid=121912\&clcid=0x804) 的可下载文章中“自定义域的 RDS 优化”一节。
在与 Microsoft 客户服务和支持部门合作时,支持工程师可能要求您移除已创建的任何附加索引,或移除添加到现有索引中的任何附加列。这是因为附加索引可能会更改数据的访问路径,并在某些情况下导致意外的性能和锁定/死锁问题。
设置服务器的填充因子
填充因子可用于进一步改进索引数据的存储和性能。在创建或重新生成索引后,填充因子值 (1–100) 可确定每个叶级别页上可填充数据的空间所占的百分比。剩余的空间保留下来供以后数据增长时使用。对于多数情况,默认的服务器范围内的填充因子级别 0 为最佳;但是,对于 Microsoft Office SharePoint Server 2007,服务器范围内的设置 70 对于支持增长和尽可能减少碎片来说是最佳值。
尽管该办法可行,但是我们不建议为个别表或索引设置填充因子。
若要查看一个或多个索引的填充因子值,请查询 sys.indexes 目录视图。有关该视图的详细信息,请参阅 sys.indexes (Transact-SQL) (https://go.microsoft.com/fwlink/?linkid=128510\&clcid=0x804)。
若要配置服务器范围内的填充因子值,请使用 sp_configure 系统存储过程。有关详细信息,请参阅 spconfigure (Transact-SQL) (https://go.microsoft.com/fwlink/?linkid=128512\&clcid=0x804)。