现在我们有一个1.000.000的firebird数据库,必须在将所有内容加载到RAM内存后处理。要获得所有这些,我们必须使用(选择*前1000 ...)提取数据8小时。解决方案是什么?
答案 0 :(得分:4)
您的每个“select * first 1000”(如您所述)是否都进行全表扫描?查看这些查询,并确保它们使用索引。
答案 1 :(得分:1)
从表中加载数据 C#中的1.000.000行使用firebird db至少需要Pentium 4 3Ghz 8小时
每个人都在假设您正在运行SQL查询以从数据库中选择记录
select *
from your_big_table
/
因为那真的需要几秒钟。好吧,稍长一点就可以在屏幕上显示它,但是执行实际选择应该是快速的。
但是对C#的引用让我觉得你正在做别的事情。也许你真正拥有的是一个实例化一百万个对象的RBAR循环。我可以看到这可能需要更长的时间。但即便如此,八个小时?时间到了哪里?
修改强>
我的猜测是对的,你在循环中实例化1000000个对象。正确的建议是找到一些其他方法,一旦你在内存中拥有所有对象,就可以做任何事情。如果不了解更多细节,很难给出具体细节。但这似乎不太可能是UI的想法 - 用户将阅读一百万个对象?
因此,一般观察就足够了:使用批量操作来实现批量活动。 SQL数据库擅长处理集合。利用SQL的强大功能来处理单个集合中的百万行,而不是单个行。
如果您没有找到有用的答案,那么您需要向我们提供有关您希望实现的更多详细信息。
答案 2 :(得分:1)
构建每次读取数据时创建的DTO对象需要多长时间?
{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }
您正在创建一百万个这些对象。如果创建一个DTO对象需要29毫秒,那么完成将花费8个多小时。
答案 3 :(得分:0)
您需要做什么样的处理才能将它们加载到内存中而不只是通过SQL语句处理它们?
我使用的两种技术取决于我想要做什么。
假设存在某种人工密钥(身份),则批量工作,增加处理的最后一个身份值。
将数据BCP输出到文本文件,浏览更新,然后将其重新打包,记住在IN步骤之前关闭约束和索引。
答案 4 :(得分:0)