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