最佳填充因子,以防止碎片

时间:2015-03-22 15:52:10

标签: sql sql-server database

目前,我使用> REORGANIZE 1000+个索引的日常工作5%和< => 30%碎片和REBUILD索引> 30%碎片: https://msdn.microsoft.com/en-us/library/ms189858.aspx

所有索引都使用80%的填充因子进行重建,但根据我的最新检查,100多个索引的碎片级别保持不变。他们中的大多数具有高度碎片化。我尝试在测试环境中使用填充因子值,但遗憾的是无法模拟生产环境。

我想知道是否找到了最好的'每个指数的填充因子都是个好主意?

1 个答案:

答案 0 :(得分:3)

  

找到最好的'每个指数的填充因子都是个好主意?

如果选项是:

  1. 保持当前全球80%FILLFACTOR

  2. 为每个表找到最佳FILLFACTOR

  3. 然后绝对 YES ,为每个表找到最合适的值。当然,如果有选择:

    1. 将所有内容放回默认的FILLFACTOR为0(与100相同)并将较低的值(每个表确定)应用于那些应从中受益的表
    2. 然后我会选择#3 :-)。为什么?因为碎片和填充因子都有点复杂和棘手。设置全局低(80是"低"假设默认值为100)值可能对更大的表组产生负面影响,而不是可能带来的好处来获得有意义的桌子。

      考虑:

      • 碎片是影响性能的几个因素之一:这个特殊因素是与表大小的权衡,因为它会影响数据页上适合的行数。数据页面上的行越少意味着需要从磁盘读取更多页面(而不是快速)以满足查询,并且这些页面将占用更多内存(即缓冲池)。事实上,由于表格大于它们应该存在很多负面影响,例如索引维护/备份/恢复/更新统计/等操作所需的时间比它们应该的长。

        在大表上设置填充因子太低意味着表格会更大。缓冲池中所需的磁盘读取和大小的增加需要与针对该表的操作类型进行平衡。单例操作不会因碎片而受到如此大的影响,因此如果这是大多数用例,那么您可能会减少表所需的数据页数。如果你有很多范围操作,那么你可能需要在较少碎片化方面犯错误。

      • 数据访问模式:表格主要附加到?如果INSERT仅发生在表的末尾,那么只有在发生更新时才会真正发生碎片,这些更新会增加具有可变长度数据类型的行的大小,或者如果行由于值1的更改而移动位置或者更多关键领域。

        此外,删除大量行可能会导致碎片。当数据页上没有任何行时会发生这种情况。在这种情况下,碎片化不仅不能通过降低FILLFACTOR来缓解(即使所有其他条件都有利于降低它),但实际上通过降低它实际上会变得更糟。如果删除频繁发生以留下空数据页,那么减少这些页面上的行数会增加它们变空的速率(即3个数据页之间大部分填充500行,5个数据页 - 带有较低的FILLFACTOR - 每个只填充300行,删除700行将在第一个场景中留下1个空数据页,但在第二个场景中留下2个空数据页)。更多空数据页意味着更多"未使用"空间。

      • 行大小:行大小为100字节的表格几乎没有浪费"由于试图维持特定的填充因子而导致的空间。意思是,如果想要填充80%的页面,那么小行大小可能会导致实际填充页面的78%(作为示例)。但行大小3500字节将导致每页只有1行,实际上只使用了不到50%。最后,您认为需要多少行"保留"对于无序插入或扩展大小的行?行数大小为3500字节,无论如何都只能在页面上再容纳1行,所以实际保存的并不多。另一方面,行大小为100字节会为很多行保留空间,这很好,但如果它将被使用。

      • 整个表中的数据分布:含义,我们假设您有一个包含1亿行的表。我们还要说这个表 允许非顺序插入和/或更新,以扩展行的大小。如果可能导致碎片的插入或更新的位置均匀分布(或至少覆盖表的50%),则较低的FILLFACTOR可能是有用的。 但是,如果插入和/或更新被限制在最近的500万行中,那么为什么在永远不会使用它的前9500行中保留空闲空间?例如,如果您有一个在DATETIME字段上排序的表,保留数年数据,并且更改仅在最近2个月内发生,那么您也可以使用100%。

      • FILLFACTOR仅在创建或重建索引时适用:新创建的数据页(包括从页面拆分创建的数据页)将填充到100%(或尽可能接近)。这意味着,如果您插入大量数据,以便创建多个(或许多)新数据页,并且顺序完成插入,以便在插入的末尾没有碎片,但是然后以某种方式在这样的行中更新行导致碎片的方式,或者可能是刚刚插入的行之间发生的新插入,然后无论如何也无法阻止碎片化(至少在每组插入后都没有做REBUILD,这只是傻)。

      因此,真正受益于较低(比默认100% - 表示为0)FILLFACTOR的情况远远少于受益于默认情况的情况。因此,将它们全部设置为100(或0)并查找符合以下配置文件的表:

      • 不小。这是非常主观的,但我认为可以忽略10,000行以下的任何内容(即获得默认值)
      • 行大小小于1000字节(甚至可能小于1000?)。如果你只保留1或2行的空间,那么你的弊大于利。
      • 可能导致碎片的数据访问模式:非顺序插入,以及扩展行大小或导致其位置移动的更新。

        请注意,留下空数据页的删除会造成多少碎片。降低FILLFACTOR会对这种类型的碎片产生不利影响,因此删除应该弥补,最多,碎片的一小部分。

      • 数据分布导致碎片在索引中分布均匀,而不是限制在40%或更少

      请记住:

      • 与许多(或大多数?)其他优化一样,效果与系统规模成正比。小型系统不会发现很多效果,但是表格越大,正确设置与不正确设置越明显。

      • 系统当然有可能以这样的方式表现出最佳的"所有表的填充因子在某种程度上最终都是相同的 - 无论是80%还是其他值。我不确定这样一个系统存在的可能性有多大,但它肯定属于可能性范围。