填充因子和插入速度

时间:2012-02-13 18:49:12

标签: sql-server-2008 tsql

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我同意您应该拥有解析器数据的表,并且只有在您准备好时才插入主表。我在以前的生活中实现了类似的东西(它基于唯一ID的mod 10被准分为10个表,然后在以后滚动到主表中 - 主要是为了协助加载速度)。如果您打算使用保持表,那么除了FF = 100之外,我认为不需要使用保持表。您使用的页面越少越好。

显然,你应该测试差异永久表,#temp表和表值参数。 : - )