使用 group by 的 Oracle 调优内联视图
Oracle Tuning Inline View with 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.id
everythingElse 仅包含内联包含的 id 的一小部分,但它是一对多关系。因为内联包含一个分组依据,所以优化器必须先对 table 中的每一行求和,然后才能加入。这使得此子查询代表了作业估计成本的 99%。
由于 select 使用内联中的 2 个值,我不认为将子查询更改为嵌套子查询或标量子查询是一种选择。我还考虑过移动组以包含整个查询,但我知道的每个聚合函数都会导致 everythingElse.* 花费的时间比我通过删除内联视图节省的时间还多。我能找到的处理速度最快的是 max(),但如果存在类似 any() 的东西,那可能会解决我的问题。
是否有某种我缺少的明显解决方案,或者我只需要处理 1% 的查询占用 99% 的处理时间这一事实?
只要您使用的是 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
我有一个过于复杂的查询,其中包含一个带分组依据的内联视图,出于性能原因我想尝试将其删除,但我似乎想不出这样做的方法。此查询的过度简化表示为:
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 的一小部分,但它是一对多关系。因为内联包含一个分组依据,所以优化器必须先对 table 中的每一行求和,然后才能加入。这使得此子查询代表了作业估计成本的 99%。
由于 select 使用内联中的 2 个值,我不认为将子查询更改为嵌套子查询或标量子查询是一种选择。我还考虑过移动组以包含整个查询,但我知道的每个聚合函数都会导致 everythingElse.* 花费的时间比我通过删除内联视图节省的时间还多。我能找到的处理速度最快的是 max(),但如果存在类似 any() 的东西,那可能会解决我的问题。
是否有某种我缺少的明显解决方案,或者我只需要处理 1% 的查询占用 99% 的处理时间这一事实?
只要您使用的是 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