【问题标题】:What happens when a query gets very large results当查询得到非常大的结果时会发生什么
【发布时间】:2013-06-16 07:08:22
【问题描述】:

大多数用法/教程/手册解释了如何在可管理的数据库的上下文中使用这些方法。

因此,如果User.where( some condition) 会返回数十或数百个结果,那么认为 Rails/DB/server 可以处理它是合理的

如果相同的查询返回数千或数十万条记录的结果会怎样?我敢说百万条记录吗?

它取决于什么? Rails 或硬件(如果有)施加了哪些限制?

最重要的是,有没有一种方法可以在 Rails 中处理如此庞大的数据集(而不会使一切崩溃?)

【问题讨论】:

  • 处理大型数据集的最佳方法是将其留在数据库中,然后在数据库中完成所有工作。
  • 问题是“您需要对数百万条选定记录做什么?向用户显示它们?”
  • 假设有问题的表格是模型生命周期的坐标。如果每秒获取一个坐标,那么可能有数百万个坐标。如果我想显示它们,我需要获取每一个(假设我必须,并且不能使用快捷方式)
  • @NickGinanto Postgres 可以处理 100 万个对象。但我不知道任何可以同时向用户显示 1 m 个对象的界面。也许您需要更小的对象子集?
  • 那么如果结果超过100万则查询会失败?

标签: sql ruby-on-rails-3 postgresql bigdata


【解决方案1】:

好的,让我们开始吧:

如果您尝试将一桶水放入玻璃杯中会发生什么?

就是这么说的:

  1. 第一个依赖项是您的数据库大小。
  2. 选择数百万行需要 (百万 * 行大小) 的大小,因此需要那么多的假脱机空间。如果进一步连接 Spool,则对空间的需求会大大增加。
  3. 如果数据库不支持并行且没有智能优化器,那么这些行数会影响性能并使查询更加缓慢。

无论如何,我认为如果您正在处理数百万/数万亿的数据,您应该考虑迁移到像 Teradata 这样的最新数据仓库。

【讨论】:

    【解决方案2】:

    基本的事情是,如果结果集太大,PostgreSQL 会将结果集具体化到磁盘。这意味着您的速度会受到影响,但它会为其他操作保留可用内存。

    一般来说,PostgreSQL 很少需要向客户端发送数十万或数百万行。关键是构建您的查询(并根据需要使用适当的 SQL 扩展)以仅返回您的前端需要的数据,在数据库中正确聚合等。我遇到过很多人认为将这种聚合逻辑放在数据库中会减慢它的速度(并且有 CPU 时间成本),但该领域的成本往往会在磁盘 I/O 等待中得到很好的回报时间成本等。

    我要问的基本问题是“为什么需要查看数百万条记录?”你基本上是说你想把它们保存在内存中或存储在磁盘上,然后通过网络传输它们,然后接收它们,然后处理它们。这不是效率的典范。 远远在存储附近处理数百万条记录,然后用一些 CPU 成本换取其他的。

    如果您需要能够在混合或 DW 环境中实现更复杂的查询内并行性的功能,请使用 Postgres-XC 而不是原始 PostgreSQL。这会带来巨大的复杂性成本,但在大型环境中可以解决原本无法解决的问题。

    【讨论】:

      猜你喜欢
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      相关资源
      最近更新 更多