我遇到了很多需要处理的记录的问题。我想知道哪种方法最快。
我的问题描述:
我有一张桌子(让我们称之为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。
使用的技术:
修改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天,它也可以利用索引。通常,您希望在数据库中执行此类处理,而不是将数据带回应用程序。
您可能想要考虑是否要在用于插入的实时表上运行这些查询。 selects
和inserts
会减慢速度。您可以考虑某种复制管理,以便可以使用该数据库的另一个副本进行此类分析。最好不要在每秒更新多次的表上运行此类查询。