【问题标题】:How to load 1 milion records from database fast?如何快速从数据库加载 100 万条记录?
【发布时间】:2010-04-20 17:10:24
【问题描述】:

现在我们有一个 1.000.000 的 firebird 数据库,必须在 ALL 加载到 RAM 内存后对其进行处理。要获得所有这些,我们必须使用 (select * first 1000 ...) 提取数据 8 小时。解决办法是什么?

【问题讨论】:

  • 桌子的尺寸是多少?你确定你的记忆可以容纳吗?
  • 听起来像是一份工作……The World's Fastest Database!
  • 发布你的while循环的全部代码
  • 我认为你做错了什么......当我看到这样的模式时,通常意味着程序员/架构师不完全了解如何在他们的设计中使用数据库。
  • 需要更多信息,如上所述。

标签: sql optimization large-data-volumes


【解决方案1】:

您的每个“选择 * 前 1000 个”(如您所描述的)是否进行全表扫描?查看这些查询,并确保它们使用的是索引。

【讨论】:

  • 问题不是选择速度。将数据从选择记录集传输到内存,while (read.Read()) 需要很长时间...
【解决方案2】:

每次读取数据时构建您正在创建的 DTO 对象需要多长时间?

{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); }

您正在创建一百万个这样的对象。如果创建一个 DTO 对象需要 29 毫秒,那么这将需要 8 个多小时才能完成。

【讨论】:

    【解决方案3】:

    从表中加载数据 使用 firebird db 的 C# 中的 1.000.000 行至少采用 Pentium 4 3Ghz 8小时

    每个人都假设您正在运行 SQL 查询以从数据库中选择记录 类似

    select * 
    from your_big_table
    /
    

    因为这确实需要几秒钟。好吧,在屏幕上显示的时间要长一点,但执行实际选择应该很快。

    但是对 C# 的引用让我觉得你在做其他事情。也许你真正拥有的是一个实例化一百万个对象的 RBAR 循环。我可以看到这可能需要更长的时间。但即便如此,八小时?时间都去哪儿了?

    编辑

    我的猜测是正确的,您正在循环中实例化 1000000 个对象。正确的建议是,一旦将所有对象都放入内存中,就可以找到其他方法来做任何事情。在不了解更多细节的情况下,很难给出细节。但这似乎不太可能是 UI 的想法——什么用户会细读一百万个对象?

    所以一般的观察就足够了:使用批量操作来实现批量活动。 SQL 数据库擅长处理集合。利用 SQL 的强大功能在一个集合中处理百万行,而不是单独的行。

    如果您认为此答案没有帮助,那么您需要向我们提供有关您想要达到的目标的更多详细信息。

    【讨论】:

    • 我们的流程在最坏的情况下最多每月运行一次。是的,我们在一个大的单循环中从表中加载所有数据。这个循环是我们的瓶颈。有一段时间我在考虑克隆一些数据库,现在运行一些并行查询以更快地加载数据。
    • 好吧,当你有那么多记录时,你永远不会循环加载记录。那是数据库 101。我不知道 firebird,但大多数数据库都支持在插入中使用 select,例如 insert table2 (field1, field2) select field1, field2 from table1 这比一次一行要快得多
    【解决方案4】:

    您需要进行什么样的处理才能将它们加载到内存中,而不仅仅是通过 SQL 语句处理它们?

    根据我想要做的事情,我使用了两种技术。

    1. 假设存在某种人工密钥(身份),分批工作,递增最后处理的身份值。

    2. BCP 将数据输出到文本文件,搅动更新,然后将其 BCP 重新输入,记住在 IN 步骤之前关闭约束和索引。

    【讨论】:

    • 我们对来自 db 的每一个进行一些分析,我们需要将它们加载到内存中。瓶颈是我们将数据从记录集传输到 DTO 对象的时刻。
    【解决方案5】:

    【讨论】:

    • 在那个链接上没有任何帮助,也许所有数据库都遇到这个问题。我需要优化“while (read.Read())”的时间。
    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 2012-03-06
    • 2022-11-12
    • 2017-12-30
    • 1970-01-01
    • 2021-11-27
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多