gpt4 book ai didi

c# - 插入/更新大量记录 SQL Server

转载 作者:行者123 更新时间:2023-11-30 21:53:07 25 4
gpt4 key购买 nike

我在处理大量记录时遇到了问题。我想知道哪种方法最快。

我的问题描述:

我有一个表(我们称它为 FooTable),其中包含超过 2.000.000.000 条记录 和一个 ID(我们称它为 FooId) .我需要对我的 FooId 求和以检查它重复了多少次。该表每秒都在增长,因为它就像一个日志表。

我尝试过的程序:

读取我的 FooTable600 条记录 block ,处理所有记录(对每个 FooId 求和)做一个 GroupBy 并将结果存储在另一个表中(我们称之为 FooResults)。此 FooResults 新表是在与旧表 FooTable 相同的架构中创建的。

程序结果:

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

测试:

我用 100.000 条记录 进行了测试。处理此数据后得到 6000 条记录,读取大约需要 32 秒;处理耗时 32 毫秒;节省了 18 分钟。

future 的尝试:

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

使用的技术:

  • C#
  • Entity Framework
  • SQL Server 2012

编辑 1:

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

最佳答案

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

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 天,而且还可以利用索引。通常,您希望在数据库内部进行此类处理,而不是将数据带回应用程序。

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

关于c# - 插入/更新大量记录 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com