2012-12-11 144 views
1

我很难找出什么是最好的,或者如果有差异, 但是我还没有找到任何材料来帮助我理解这个,所以我会问这个问题,如果不是我的话,那么对于其他可能以相同情况结束的人来说。SQL - 加入后加入聚合查询或聚合/总和?

聚合子查询之前或之后加入,在我的具体情况,子查询是相当缓慢的,由于分散的数据和坏的正常化过程,

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

什么wi会产生最大的影响?

  • 综上所述子查询之前的连接,然后用聚集的版本加入
  • 为了保持数据原,然后与主查询的其余部分一起求和值

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

+0

我发现这两种方法太慢,所以我不能测试,看看什么是最好的,感谢您的答案,我现在试图从不同的方法 – bonitzenator

回答

2

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

虽然这不是一个确定的答案。如果要加入内联视图的行源具有少量匹配行,则可能会发现早期加入会减少聚合工作量。

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

1

我认为在这样一个普遍的方式中,没有正确或错误的方法来做到这一点。从像你描述的一个查询的性能取决于许多不同的因素:

  • 什么样的加入是你真正做(什么算法在后台使用)
  • 是要连接的数据足够小以适应加入它的机器的内存?
  • 何种查询优化是你使用,即什么DBMS(甲骨文,MSSQL,MySQL和...)
  • ...

对于你的情况,我只是建议标杆。我很抱歉,如果这看起来不是一个满意的答案,但它是在很多性能问题中走的路...

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

+0

这个答案也是正确的,但我倾向于同意colemar on聚合简化部分, – bonitzenator