Insert/Update海量记录SQL服务器

Insert/Update mass records SQL Server

我有很多记录需要处理的问题。我想知道哪种方法最快。

我的问题描述:

我有一个 table(我们称之为 FooTable),超过 2.000.000.000 records 个 ID(我们称之为 FooId)。我需要对 FooId 求和以检查它重复了多少次。这个 table 每秒都在增长,因为它就像一个日志 table.

我试过的程序:

读取我的 FooTable600 records 块,处理所有记录(对每个 FooId 求和)通过代码执行 GroupBy 并存储结果在另一个 table 中(我们称之为 FooResults)。此 FooResults 新 table 是在与旧 FooTable.

相同的架构中创建的

程序结果:

每个块的读取和数据处理都非常快。问题是储蓄。我的计算表明这大约需要 27 天。这明显过分了。

测试:

我用 100.000 records 做了一个测试。处理完此数据后结果为6000 records,读取大约耗时32秒;处理耗时 32 毫秒;并且节省了 18 分钟。

未来尝试:

我正在考虑尝试在另一个模式中创建一个table,对所有记录进行唯一的读取操作,直到最后一个,处理内存中的所有数据并将其添加到这个新的table。这个新的 table 将禁用索引。
尝试 sql 而不使用 Entity Framework.
尝试使用批处理。

使用的技术:

编辑 1:

此table中包含的数据是将用于分析的关键数据,无法删除。

您应该运行将此作为数据库中的查询。如果你想检查一个这样的值:

select count(*)
from table t
where fooid = @foodid;

table(fooid) 上创建索引,这将 运行 相当快,即使在 20 亿行上也是如此。

如果您需要查找所有 foo id 的计数:

select fooid, count(*)
from table t (with nolock)
group by fooid;

这个时间会长一些,但不会是27天,也可以利用索引。通常,您希望在数据库内部进行此类处理,而不是将数据带回应用程序。

您可能需要考虑是否要 运行 在用于插入的实时 table 上进行这些查询。 selectsinserts 可以减慢速度。您可能会考虑某种复制管理,以便您可以拥有另一个数据库副本来进行此类分析。最好不要 运行 对每秒更新多次的 table 进行此类查询。