数以千万计的插入索引表性能/策略(Sql Server >= 2005)

Posted

技术标签:

【中文标题】数以千万计的插入索引表性能/策略(Sql Server >= 2005)【英文标题】:Tens of Millions inserts into an indexed table performance/strategy (Sql Server >= 2005) 【发布时间】:2014-07-23 07:04:03 【问题描述】:

我必须从许多表中获取数据并将它们组合成一个表。 最终表将有大约 1.2 亿行。 我打算按照大表索引所需的确切顺序插入行。

我的问题是,就性能而言: 是从头开始创建新表的索引,还是先进行插入并在导入结束时创建索引?

另外,如果在最后构建索引时,行已经按照索引规范进行了排序,这会有所不同吗?

我无法测试这两种情况并进行客观比较,因为数据库位于主服务器上,该服务器用于许多其他数据库和应用程序,这些数据库和应用程序可能在不同的时间负载或不负载。我也无法将数据库恢复到本地服务器,因为我还没有对主服务器的完全访问权限。

【问题讨论】:

【参考方案1】:

我建议先复制日期,然后再创建索引。如果在有索引的表上插入记录,对于每次插入,SQL Server 都会刷新表索引。但是当您在将所有记录插入表后创建索引时,SQL Server 不需要为每个插入刷新表索引,并以一种方式重建索引。

您可以使用SSIS 将数据从源表复制到目标。 SSIS 使用 balk insert 并且具有良好的性能。另外,如果您在目标数据库上有任何触发器,我建议您在开始转换之前禁用它。

当您每次在表上创建索引时,根据您的索引存储的行。

【讨论】:

感谢您的回答,mehdi lotfi。我想如果我按照索引的确切顺序插入行,SQL Server 会知道并且不会刷新表索引。投票给了答案。等我可以比较之后,我会回来标记为答案。 @darkdante。请查看我的编辑。一年前我有一个与您的问题类似的问题,并通过首先删除所有索引、外键并禁用目标表上的所有触发器来解决我的问题。我的复制数据持续时间为 20 分钟(在使用此解决方案之前,复制持续时间约为 5 小时)。

以上是关于数以千万计的插入索引表性能/策略(Sql Server >= 2005)的主要内容,如果未能解决你的问题,请参考以下文章

SQL性能调优策略

sql server 2008r2 向带有索引的表里大批量插入数据

MySQL5.7性能优化系列——SQL语句优化——使用物化策略优化子查询

千万级别数据量mysql优化策略

sql server建立索引导致插入数据库变慢

数据库优化:52 条 SQL 语句性能优化策略,果断收藏!