SQL - 加入后加入聚合查询或聚合/求和?

时间:2012-12-11 08:53:19

标签: sql optimization aggregate-functions

我很难搞清楚什么是最好的,或者是否有差异, 但是我没有找到任何材料来帮助我理解这一点, 所以我会问这个问题,如果不适合我,那么对于那些可能最终处于同样情况的人来说。

在联接之前或之后聚合子查询,在我的特定情况下,由于数据碎片和规范化程序错误,子查询相当慢,

我得到了一个高度复杂的主查询和一个子查询,该查询是使用union组合的3个小查询构建的(将删除重复记录) 我只需要来自这个子查询的单个值(对于每一行),所以在某些时候我将最终总结这个值,(同时将必要的控制数据分组,以便我可以加入)

会产生什么影响?

  • 在加入前汇总子查询,然后加入汇总版本
  • 保留数据原始值,然后将该值与主查询的其余部分相加

记住每条线都会有数千条记录相加, 并且数据不是本机的,而是构建的,因此可能驻留在内存中, (这只是从查询优化器的角度猜测)

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

  • 您实际在做什么样的联接(以及后台使用的算法)
  • 是要连接的数据小到足以装入加入它的机器的内存中吗?
  • 您正在使用哪些查询优化,即DBMS(Oracle,MsSQL,MySQL,...)
  • ...

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

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