现在我们有一个包含100万条记录的Firebird数据库,必须在所有记录都加载到RAM内存后进行处理。为了获取所有记录,我们必须使用“select * first 1000 ...”语句提取数据长达8个小时。有什么解决方案吗?
现在我们有一个包含100万条记录的Firebird数据库,必须在所有记录都加载到RAM内存后进行处理。为了获取所有记录,我们必须使用“select * first 1000 ...”语句提取数据长达8个小时。有什么解决方案吗?
您描述的每个“select * first 1000”都会进行全表扫描吗?请查看这些查询,并确保它们使用索引。
select *
from your_big_table
/
因为那确实只需要几秒钟。嗯,稍微长一点才能在屏幕上显示出来,但执行实际选择应该是闪电般快速的。
但你提到 C# 让我想你正在做其他事情。也许你真正拥有的是一个 RBAR 循环,实例化了一百万个对象。我可以看出这可能需要更长一些时间。但即便如此,八个小时?时间都去哪儿了?
编辑
我的猜测是正确的,你正在循环实例化 1000000 个对象。正确的建议是,在将所有对象加载到内存中后,找到其他方法实现所需操作。没有更多关于细节的了解,很难给出具体建议。但似乎这不是用户界面 - 哪个用户会浏览一百万个对象呢?
因此,一般性的观察就足够了:使用批量操作来实现批量活动。SQL 数据库擅长处理集合。利用 SQL 的强大功能,以单个集合而不是单个行处理您的一百万行。
如果您不认为这个答案有帮助,则需要提供更多有关您尝试实现的内容的详细信息。
每次数据读取创建DTO对象需要多长时间?
{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }
你正在创建一百万个这些对象。如果创建一个DTO对象需要29毫秒,那么完成这个任务需要超过8小时。