我有一个过于复杂的查询,其中包含一个带有group by的内联视图,出于性能原因,我希望尝试删除它,但我似乎想不出一种方法来这样做。这个查询的一个过于简化的表示形式是:
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.ideverythingElse只包含内联包含的id的一小部分,但它是一对多关系。因为inline包含group by,所以优化器必须先对表中的每一行求和,然后才能连接。这使得该子查询代表了作业预计成本的99%。
由于select使用的是内联中的2个值,因此我不认为将子查询更改为嵌套子查询或标量子查询是可行的。我还考虑过移动group by以包含整个查询,但我所知道的每个聚合函数都会导致EverthingElse.*花费比删除内联视图节省的时间更多的时间。我能找到的处理速度最快的是max(),但如果存在类似于any()的东西,我的问题可能就解决了。
有没有某种显而易见的解决方案,我没有注意到这一点,或者我只是必须处理1%的查询获得99%的处理时间的事实?
发布于 2018-07-24 21:37:04
只要您使用的是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) inlinehttps://stackoverflow.com/questions/51490235
复制相似问题