对 Project Server 2010 数据库的索引进行碎片整理
适用于: Project Server 2010
上一次修改主题: 2016-11-30
可以通过执行 Transact-SQL 命令或运行数据库维护向导来执行数据库维护任务。本文包含有关这两种方法的详细信息。
Microsoft Project Server 2010 数据库的建议的数据库维护任务包括:
检查数据库完整性
通过重新组织或重新构建索引来对索引进行碎片整理
设置服务器的填充因子
监视数据库大小以预增长数据库或收缩数据库
清理历史记录
更新统计信息
通过重新组织或重新构建来对索引进行碎片整理
当数据库的逻辑和物理存储分配包含很多分散的、空间不够的存储区域(在物理上不连续)或太零碎而无法有效使用的存储区域时,将会出现碎片。碎片可以是对表执行多个插入、更新或删除操作所产生的结果。当表变得零碎时,表上定义的索引也会变得零碎。
Project Server 2010 会将 GUID 类型用作聚集键,虽然这将避免并发插入争用相同的数据页(插入热点),但这将导致出现表和索引碎片。由于可以在 B 树中的任何位置(而非末尾)插入新记录,这会导致更倾向于进行页面拆分(索引和数据),从而产生碎片。可以通过对使用项目 UID 的复合键进行聚集以确保数据页包含相关数据,从而减小出现此情况的可能性,而大型表的常规碎片整理可提高性能,尤其是在 Project Server 2010 的大型部署中。
随着时间的推移,数据库碎片整理会导致性能降低(不必要的磁盘活动)和空间使用率低下。若要减少碎片并最小化碎片的出现频率,请手动将内容数据库的大小设置为尽可能的大(在给定业务要求和数据库体系结构的情况下)。例如,如果您必须将内容数据库的大小限制为 100 GB,请在创建内容数据库后,在 SQL Server Management Studio 中将其大小设置为 100 GB。
虽然可以对表进行碎片整理,但对索引进行碎片整理对数据库性能的作用更大且速度更快。本文仅说明如何对索引进行碎片整理。
在实施数据库碎片维护计划之前,确定最为零碎的表和索引,然后创建一个维护计划以重新构建或重新组织这些索引。
使用 sys.dm_db_index_physical_stats 度量碎片
使用 sys.dm_db_index_physical_stats 动态管理视图以确定指定表或视图上的索引的碎片。
对于度量碎片,建议您监视“avg_fragmentation_in_percent”列。“avg_fragmentation_in_percent”的值应尽可能地接近零,以实现最佳性能。不过,0% 到 10% 之间的值也是可接受的。
有关如何使用 sys.dm_db_index_physical_stats 的信息,请参阅 sys.dm_db_index_physical_stats (Transact-SQL) (https://technet.microsoft.com/zh-cn/library/ms188917.aspx)
减少数据库的碎片
有关减少数据库的碎片的信息,请参阅 Microsoft SharePoint 2010 产品的数据库维护 白皮书的“度量和减少碎片”一节。可从 SharePoint Server 2010 的数据库维护下载该白皮书。
减少特定表及其索引的碎片
如果您需要对与特定表(而非整个数据库)关联的索引进行碎片整理,则可以重新组织或重新构建索引。有关详细信息,请参阅群集索引结构 (https://technet.microsoft.com/zh-cn/library/ms177443.aspx)。
重新组织 某个索引意味着将重新对该索引的叶级别进行组织。索引重新组织将对表和视图上的群集和非群集索引进行碎片整理和压缩,从而显著提高索引扫描性能。重新组织始终是联机执行的,以使基础表对用户可用。
重新构建 某个索引意味着将使用相同的列、索引类型、唯一性属性和排序顺序来重新构建该索引。重新构建将提高索引扫描和搜索的性能。可以联机或脱机使用表来重新构建索引。
索引的碎片级别决定了应用于对索引进行碎片整理的方法,以及索引是可以保持联机还是应脱机。
| 碎片级别 | 碎片整理方法 |
|---|---|
最多 10% |
重新组织(联机) |
10 – 75% |
重新构建(联机) |
75% 或更多 |
重新构建(脱机) |
请注意,不能在 Microsoft SharePoint Server 2010 数据库上使用 DROP INDEX 和 CREATE INDEX 命令。
使用 ALTER INDEX
ALTER INDEX 允许数据库管理员对现有表或视图索引执行维护操作。此命令可用于禁用、重新构建和重新组织索引或选择性地设置索引的选项。
大多数情况下,可以在数据库联机时重新构建索引,因为脱机重新构建索引不会获得显著改进。但请注意,在重新构建索引时,会对表实施共享表锁定,以阻止执行除 SELECT 操作以外的任何其他操作。SharePoint Server 2010 数据库专门使用群集索引。在重新构建群集索引时,会对表实施专用表锁定,以阻止最终用户访问任何表。
可以自定义以下示例脚本来在表上重新构建所有索引。
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 编写和索引创建的最佳做法,以确保可扩展的性能报告解决方案。Project Server 2010 不会在主键外部为这些表(动态生成的)创建索引。
在您与 Microsoft 客户服务和支持协作时,支持工程师可能会要您删除创建的任何附加索引或删除已添加到现有索引中的任何附加列。这是因为,附加索引会更改数据访问路径,并且在某些情况下会导致意外的性能和锁定/死锁问题。
设置服务器的填充因子
可以使用填充因子来进一步改进索引数据存储和性能。在创建或重新构建索引时,填充因子的值 (1–100) 将确定可填入数据的每个叶级别的页面上的空间百分比。其余空间将保留以供将来增长。在许多情况下,默认服务器端填充因子级别最好为 0;但对于 SharePoint Server 2010,服务器端设置最好为 70,以支持增长并最小化碎片。
虽然可以为单个表或索引设置填充因子,但建议你不要这样做。
若要查看一个或多个索引的填充因子值,请查询 sys.indexes 目录视图。有关该视图的详细信息,请参阅 sys.indexes (Transact-SQL) (https://technet.microsoft.com/zh-cn/library/ms173760.aspx)。
若要配置服务器端的填充因子值,请使用 sp_configure 系统存储过程。有关详细信息,请参阅 sp_configure (Transact-SQL) (https://technet.microsoft.com/zh-cn/library/ms188787.aspx)。