ALTER INDEX [PK_Foo] ON [dbo].[Foo] REORGANIZE --Generally used on low fragmentation count
ALTER INDEX [PK_Foo] ON [dbo].[Foo] REBUILD --Used for high fragmentation count
ALTER TABLE [dbo].[Bar] REBUILD --Used for HEAP indexes with medium-high fragmentation
虽然这可能更适合 dba stackexchange,但它有点像灰色区域/边界线。
简短的回答是索引会变得支离破碎,需要根据它们的支离破碎程度定期检查和重组或重建。
我们主要通过查询找到碎片级别:
但是,此查询还返回 index_types。我们在哪里看到预期的聚簇索引和非聚簇索引。还有“HEAP”索引类型,它实际上不是索引(object_ID 在 sys.indexes 视图中也没有任何类型的名称)。
这些用于根本没有索引的表,因此也没有主键(自动创建索引)。这些也可能变得支离破碎。因为它们只代表数据在磁盘上的分布情况。
您还应该检查并“修改”这些,或者简单地通过实际给他们说一个主键。或者,如果希望它们没有索引/PK。只需重建表即可。这也会重新组织表中的数据。
一个简单的代码示例:
这些语句可以有很多选项,比如填充因子。需要注意的一件事是 REORGANIZE 允许表保持联机状态,并且除了使用资源外不会阻止用户。其他选项会阻止用户在此过程中访问该表。
这取决于您所说的“其他对象”是什么意思。
具有聚簇索引的表:聚簇索引是表数据,因此可以像任何其他索引一样分段
没有聚集索引的表(堆):堆结构也可能碎片化,并且根据使用模式也可能容易出现其他问题(例如随着时间的推移空间/效率损失+由于转发记录而使用,请参见https://www .brentozar.com/archive/2016/07/fix-forwarded-records/ )
存储过程、视图等:这些的定义文本存储为
NVARCHAR(MAX)
值,因此它们是页外的,如果超过 ~8kb(~4K 个字符,因为它们存储为每个字符两个字节),它们可能会碎片化,但这并不重要。我假设您是一个相当新的 DBA。除了现有的两个答案之外,您可能还应该查看一些相关的内容。
数据文件
对于更大的数据库性能,数据文件的数量适合您拥有的处理器数量。我在Split .mdf datafile methods的回答中详细介绍了它
日志文件
您应该只有一个日志文件,但它被细分为 VLF 文件,作为一名 DBA,您可以控制它的处理方式。在为什么虚拟日志文件不总是按顺序分配的帖子中对 VLF 进行了相当深入的研究?
堆可以通过两种方式“碎片化”。一切都取决于你如何定义“碎片化”:
删除行后 ages 上的空白空间。即使页面为空也不会被释放。我有一个案例,在只有 3000 行的表上执行 SELECT 花了几分钟!
转发记录(又名转发指针)。我在这里有一些关于这些的信息:https ://karaszi.com/rebuild-all-fragmented-heaps
请注意,您不会看到您将 sys.dm_db_index_physical_stats 与 NULL 一起用于最后一个参数,因为 NULL 表示 LIMITED。您需要 DETAILED 或 SAMPLED。