【问题标题】:Fill Factor And Insert Speed填充系数和插入速度
【发布时间】:2012-02-13 18:49:11
【问题描述】:

我有 3 个非常大的表,在复合键上具有聚簇索引。没有更新只有插入。新插入将不在现有索引范围内,但新插入不会与聚集索引对齐,并且这些表会获得大量插入(每秒数百 - 数千)。想要做的是填充因子 = 100 的 DBREINDEX,但随后将填充因子设置为 5,并将该填充因子仅应用于插入。现在填充因子仅适用于整个表格。有没有办法让填充因子仅适用于插入(或插入和更新)?我现在不在乎选择速度。我正在加载数据。数据加载完成后,我将 DBREINDEX 设为 100。填充因子为 10 与 30 相比,插入新数据的速率加倍。此加载将需要几天时间,并且在加载数据之前无法上线。聚集索引与最终用户应用程序使用的主导查询对齐。

我的做法是每天进行 DBREINDEX,但问题是现在表变大了,10 个 DBREINDEX 需要很长时间。我考虑过对“每日”表进行索引,然后将按聚集索引每天排序的数据插入到生产表中。

如果你读得更多。索引都是复合的,我在 8 核服务器上运行 6 个解析器实例(大量测试,似乎具有最佳吞吐量)。来自 SINGLE 解析器的数据是 PK 顺序的,我一次插入 990 个值(SQL 值限制)。 3 个活动表仅通过外键关系与单个相对不活动的第 4 个表共享数据。我此时的想法是为每个解析器保留表,然后有另一个进程轮询这些表以进行下一个完整插入并将数据以 PK 顺序移动到生产表中。这将是很多工作。我希望有人有更好的主意。

解析以 PK 顺序开始,但很少以 PK 顺序结束。一些单独的解析是如此之大,以至于我无法将所有数据保存在内存中,直到最后。现在,SQL 插入比创建数据的解析稍快。在单独的解析中,我运行插入异步并继续解析,但在之前的插入完成之前不要插入。

【问题讨论】:

  • 我同意您应该为解析器数据保留表格,并且只有在您准备好时才插入主表格。我在前世实现了类似的东西(它根据唯一 ID 的 mod 10 被准散列到 10 个表中,然后稍后滚动到主表中 - 主要是为了提高加载速度)。
  • 如果你要使用固定桌,那么我认为除了 FF = 100 之外不需要使用它们。你必须使用的页面越少越好
  • @AaronBertrand 谢谢,在持牌策略上,一个解析可能(实际上是这样)无序完成,所以它会进入前一个。如果我在解析的末尾插入填充因子应该在生产表上。如果一个表的填充因子为 100 并且存在增量页面拆分,那么该页面拆分为 50 吗?对我来说,这将是理想的。
  • 使用 4 个并发 parse.exe 实现了保存表并在较小的解析上对其进行了测试,我将让它运行一整夜。大解析是我期望(希望)性能提升的地方。
  • 我将尝试 TVP 并绕过 #temp。使用 #temp insert 和 select into from #temp SQL 受到重创,只有一个 SQL,所以我将尝试将更多负载转移到 parse.exe。

标签: sql-server-2008 tsql


【解决方案1】:

我同意您应该为解析器数据保留表格,并且只有在您准备好时才插入到主表格中。我在前世实现了类似的东西(它根据唯一 ID 的 mod 10 被准散列到 10 个表中,然后稍后滚动到主表中 - 主要是为了提高加载速度)。如果您要使用固定桌,那么我认为除了 FF = 100 之外没有必要使用它们。您必须使用的页面越少越好。

显然,您也应该测试不同的永久表、#temp 表和表值参数。 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 2016-06-28
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多