当查询获得非常大的结果时会发生什么

时间:2013-06-19 16:27:25

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

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

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

如果相同的查询返回数千或数十万条记录的结果,会发生什么?我敢说百万条记录吗?

它取决于什么? Rails或硬件(如果有的话)强制限制了什么?

最重要的是,有没有办法在Rails中处理如此大的数据集(不会崩溃一切?)

2 个答案:

答案 0 :(得分:3)

基本的是,如果结果集太大,PostgreSQL会将结果集实现为磁盘。这意味着您可以获得速度,但它可以为其他操作保留内存。

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

我要问的基本问题是"为什么你需要看到数百万条记录?"您基本上是说要将这些内容保存在内存中或将它们存储在磁盘上,然后通过网络传输它们,然后接收它们,然后处理它们。这不是效率的典范。处理数百万条靠​​近存储的记录更好,因此为其他记录交换一些CPU成本。

如果你需要在混合或DW环境中具有更复杂的内部查询并行性的东西,那么请使用Postgres-XC而不是vanilla PostgreSQL。这具有显着的复杂性成本,但是在大型环境中使得其他无法解决的问题可以解决。

答案 1 :(得分:2)

好的,让我们开始:

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

这就是说:

  1. 第一个依赖项是您的数据库大小。
  2. 选择数百万行需要大小(数百万*行的大小),因此需要许多假脱机空间。如果Spool进一步加入,对空间的需求会大大增加。
  3. 如果数据库不能识别并且没有智能优化器,那么这些行会影响性能并使查询更慢。
  4. 无论如何,我认为如果你要处理数百万/数万亿的数据,你应该考虑转移到像Teradata这样的日期仓库。