3

我很难弄清楚什么是最好的,或者是否有区别,但是我没有找到任何材料来帮助我理解这一点,所以我会问这个问题,如果不是针对我,那么针对可能的其他人最终陷入同样的​​境地。

在 join 之前或之后聚合子查询,在我的具体情况下,由于碎片数据和糟糕的规范化过程,子查询相当慢,

我有一个非常复杂的主查询和一个由 3 个使用联合组合的小查询构建的子查询(将删除重复记录)我只需要这个子查询中的一个值(对于每一行),所以在某些时候,我最终会对该值求和,(连同将必要的控制数据与它一起分组,以便我可以加入)

什么会产生最大的影响?

  • 在加入前对子查询求和,然后与聚合版本加入
  • 保留原始数据,然后将值与主查询的其余部分相加

请记住,每一行都会汇总数千条记录,并且数据不是本地的而是构建的,因此可能驻留在内存中(这只是从查询优化器的角度来看的猜测)

4

2 回答 2

3

通常我将分组保留在子查询中(在 Oracle 术语中称为“内联视图”)。这样查询就更加简单明了。另外我相信执行计划更有效,因为要聚合的数据集更小,生成的连接键集也更小。

虽然这不是一个确定的答案。如果您要加入内联视图的行源几乎没有匹配的行,您可能会发现提前加入会减少聚合工作。

正确的答案是:对特定数据集的查询进行基准测试。

于 2012-12-11T09:04:39.553 回答
1

我认为以这样的一般方式,没有正确或错误的方式来做到这一点。像您描述的那样的查询的性能取决于许多不同的因素:

  • 你实际上在做什么类型的连接(以及在后台使用什么算法)
  • 要加入的数据是否足够小以适合加入它的机器的内存?
  • 您使用什么查询优化,即什么 DBMS(Oracle、MsSQL、MySQL、...)
  • ...

对于您的情况,我只是建议进行基准测试。如果这看起来不是一个令人满意的答案,我很抱歉,但这是解决许多性能问题的方法......

因此,使用您的方法和一些测试数据设置一个简单的测试,然后选择更快的方法。

于 2012-12-11T09:04:27.413 回答