在表中插入和更新数百万行的性能

use*_*478 2 performance sql-server-2008 sql-server

我们有一个用户导入应用程序的 CSV。

在检查 CSV、验证和应用一些业务逻辑之后,我们得到了应该在表(订阅者)中执行的插入和更新操作

我们获得了大约 100 万次插入和 100 万次更新操作。

执行它们的最有效方法是什么?

1) 对于插入,我们计划将它们放在一个 CSV 文件中并作为 BULK INSERT 执行它们。

2)我们应该为更新做些什么?有没有类似于 BULK INSERT 的东西?

3)我们还应该看看其他优化吗?

3a)例如在执行此操作时禁用索引?我们应该考虑数据库应该对应用程序的其他用户正常保持可用......

3b) 建议???

Tho*_*ger 5

如果您通过大型导入过程从 CSV 中获取数据,我建议您使用staging table。这将允许您将所有导入的数据转储到最终用户/应用程序不会查询的临时表中。您可以使用此临时表作为您INSERTUPDATE操作的来源。

一旦数据在临时表中,你可以踢掉一个存储过程(或多个存储过程,这取决于你的业务逻辑有多么辽阔的)做必要的INSERTUPDATEDML语句转换为实际的查询表。

至于性能,您需要决定什么对您的实现更重要。如果您希望尽快获取表中的数据,一个非常可行的方法可能是禁用索引。但要意识到 OLAP 性能会受到影响。如果您想确保对最终用户的影响最小,那么您必须以不同的方式来解决这个问题。当你说“数据库应该保持正常可用”时,我会假设后者。

在这种情况下,性能是双刃剑。数据导入的性能很可能会影响最终用户与数据交互的性能,反之亦然。

  • 一旦数据位于临时表中,您就可以批量执行插入/更新,一次 1000 条记录(只是猜测,您将不得不查看系统性能以查看在哪里设置我已将批次设置为 500 到 50,000) . 这将对您的系统造成的破坏较小,但总体上需要更长的时间。如果有的话,我还建议在用户数量较少的时间内执行此过程。我们在深夜进行大部分大型进口。 (2认同)
  • 我从来没有*不*使用过临时表。+1 (2认同)
  • 临时表也有助于研究何时出现问题。您可以轻松查看是否是他们的数据出错(大多数情况下在成熟的导入过程中)。 (2认同)