3

我每天大约有 3000 万行要在 SQL Server 中插入更新,我有哪些选择?

如果我使用 SqlBulkCopy,它是否处理不插入已经存在的数据?

在我的场景中,我需要能够在不重复数据的情况下使用相同的数据一遍又一遍地运行它。

目前我有一个带有更新语句和插入语句的存储过程,它从数据表中读取数据。

我应该寻找什么来获得更好的性能?

4

2 回答 2

5

执行此类操作的常用方法是维护一个对它们没有限制的永久工作表(或多个表)。通常这些可能存在于同一服务器上的单独工作数据库中。

要加载数据,请清空工作表,通过 BCP/批量复制将数据爆破。加载数据后,您可以执行任何必要的清理和/或转换来准备新加载的数据。完成后,作为最后一步,您可以通过执行更新/删除/插入操作来实现旧数据和新数据之间的增量所必需的操作,或者通过简单地截断真实表并重新加载它们来将数据迁移到真实表。

另一种选择,如果您有类似稳定的数据流流入,可能是设置一个守护程序来监视数据的到达,然后进行插入。例如,如果您的数据是平面文件,通过 FTP 或类似方式将文件放入目录中,则守护程序可以监视目录的更改并在内容到达时执行必要的工作(如上所述)。

需要考虑的一件事是,如果这是一个生产系统,那么执行大量插入/删除/更新语句可能会在事务进行时导致阻塞。此外,巨大的事务失败和回滚也有其自身的缺点:

  • 回滚可能需要相当长的时间来处理。
  • 在回滚期间持有锁,因此有更多的机会在数据库中进行阻塞和其他争用。
  • 最糟糕的是,在这一切发生之后,你没有取得任何前进,可以这么说:大量的时间和精力,你又回到了你开始的地方。

因此,根据您的情况,您最好以较小的批次进行插入/更新/删除,以保证您取得进展。24 小时内有 3000 万行计算结果是 c。每秒 350 个。

于 2013-01-11T19:00:05.937 回答
2

Bulk insert into a holding table then perform either a single Merge statement or an Update and an Insert statement. Either way you want to compare your source table to your holding table to see which action to perform

于 2013-01-11T19:00:49.507 回答