【问题标题】:Assign proper fill factor option for each index为每个索引分配适当的填充因子选项
【发布时间】:2012-11-19 08:52:21
【问题描述】:

我使用SQL Server 并希望为每个索引分配适当的填充因子值。我知道每个索引的以下参数:

  1. 每个表的行数
  2. 每个索引发生的扫描量
  3. 每个索引发生的搜索量
  4. 每个索引发生的查找量。
  5. 每个索引发生的更新量。

我知道扫描、查找和查找会将填充因子值提高到 100 并将填充因子更新为 0。但我会根据每个表的上述参数寻找一个计算适当填充因子选项的公式。

编辑

我使用下面的脚本来获取上面的参数:

select  SCHEMA_NAME(B.schema_id)+'.'+B.name+' \ '+C.name AS IndexName,
        A.user_scans,
        A.user_seeks,
        A.user_lookups, 
        A.user_updates, 
        D.rowcnt,
        C.fill_factor
from sys.dm_db_index_usage_stats A
INNER JOIN sys.objects B ON A.object_id = B.object_id
INNER JOIN sys.indexes C ON C.object_id = B.object_id AND C.index_id = A.index_id
INNER JOIN sys.sysindexes D ON D.id = B.object_id AND D.indid = A.index_id

编辑 2 我使用以下参考来获得填充因子选项的最佳值:

Best value for fill factor 1

Best value for fill factor 2

【问题讨论】:

  • 是什么让您认为需要更改默认填充因子才能开始?你发现了什么问题,你做了什么测量?
  • 填充因子值对性能有直接影响。我想分配适当的填充因子值以获得更好的性能。
  • 您没有回答问题。你测量了什么?你怎么知道你有错误的填充因子? 如果我告诉您使用完整的 42 因子,您将如何衡量影响?。你在追逐红鲱鱼。
  • @Remus Rusanu:请看我的编辑。
  • 取决于索引的碎片化程度以及您能够安排索引维护的频率。看看 Paul Randal 关于索引碎片的 MCM 视频。

标签: sql-server sql-server-2008 sql-server-2008-r2 sql-server-2012


【解决方案1】:

我会使用 Brent Ozar Unlimited 的 Kendra Little 所描述的技术。 Here 是文章。她描述了她发现和解决填充因子问题的方法。

正如 Remus 在他的 cmets 中提到的,您在处理填充因子时应该谨慎行事。我意识到互联网上的很多文章听起来好像高填充因子会导致无数页面拆分并破坏您的性能,但降低填充因子可能会导致比它解决的问题更多。

Kendra 建议使用默认填充因子并随着时间的推移跟踪碎片,并且只有当索引由于页面拆分而出现碎片问题时,才应该慢慢降低填充因子。我一直在使用这种技术,我注意到我的缓存可以更好地使用,因为我的索引不必要地膨胀了很多。

“我经常发现人们在数据库中的所有索引上都设置了 80 或以下的填充因子设置。这会浪费许多 GB 的磁盘和内存空间。这种浪费的空间会导致额外的存储行程,整个事情都会拖累查询的性能。”

查看Books Online 中的这句话:“例如,填充因子值为 50 会导致数据库读取性能下降两倍。 “

所以说得很好。我不确定您是否应该开始不必要地弄乱填充因子。观察,研究,然后行动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多