我有一个过于复杂的查询,其中包含一个带内联视图的组,出于性能方面的原因,我希望尝试删除该组,但是我似乎想不出一种方法。此查询的过度简化表示为:
Select inline.totalValue, inline.type, everythingElse.*
From everythingElse,
(Select sum(value) totalValue, type, id
from otherTable
group by type, id) inline
Where everythingElse.id = inline.id
everythingElse仅包含内联包含的ID的一小部分,但它是一对多的关系。因为内联包含group by,所以优化器必须对表中的每一行求和,然后才能加入。这样一来,此子查询就代表了作业估算成本的99%。
由于选择使用内联中的2个值,因此我认为不可以将子查询更改为嵌套子查询,也可以不选择标量子查询。我还考虑过移动组以包含整个查询,但是我所知道的每个聚合函数都会导致else。*比删除内联视图节省的时间更多。我能找到的最快的处理程序是max(),但是如果存在类似any()的东西,那可能会解决我的问题。
我是否缺少某种明显的解决方案,还是只需要处理1%的查询获取99%的处理时间这一事实?
答案 0 :(得分:0)
只要您使用的是12c或更高版本,就可以尝试使用cross apply
。我不确定是否会改善您的具体情况,但这值得一试。
Select inline.totalValue, inline.type, everythingElse.*
From everythingElse
cross apply
(Select sum(value) totalValue, type, id
from otherTable
where everythingElse.id = otherTable.id
group by type, id) inline