插入/更新大规模记录SQL Server

时间:2015-12-09 13:39:16

标签: c# sql sql-server entity-framework bigdata

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

我的问题描述:

我有一张桌子(让我们称之为FooTable),其中2.000.000.000 records带有一个id(让我们称之为FooId)。我需要总结我的FooId来检查重复的时间。这个表每秒都在增长,因为它就像一个日志表。

我尝试的程序:

读取600 records FooTable的块,处理代码执行FooId的所有记录(执行每个GroupBy的总和)并将结果存储到另一个table(我们称之为FooResults)。此FooResults新表是在旧表FooTable的相同架构中创建的。

程序结果:

每个块读取都和数据处理一样快。问题是节省。我的计算表明这将需要大约27天。这显然太多了。

试验:

我使用100.000 records进行了测试。处理完这个数据得到6000 records,大约是,读数花了32秒;处理耗时32毫秒;节省了18分钟。

未来尝试:

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

使用的技术:

  • C#
  • 实体框架
  • Sql Server 2012

修改1:

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

1 个答案:

答案 0 :(得分:3)

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

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会减慢速度。您可以考虑某种复制管理,以便可以使用该数据库的另一个副本进行此类分析。最好不要在每秒更新多次的表上运行此类查询。