【问题标题】:Tune oracle query with groupby clause使用 group by 子句调整 oracle 查询
【发布时间】:2023-04-04 14:47:01
【问题描述】:

我有一个表,每个键都有很多成本列 表A

SK1 SK2 Col1 Col2 Col3..... Col50 Flg(Y/N)


1    2    10    20   30 ...... 500  Y
1    2    10    20   30 ...... 500  N
2    2    10    20   30 ...... 500  N

我需要汇总(总和)所有值,然后检查是否有任何带有 Y 的值,然后将它们添加到新表 B。 这里 table 应该返回 (sk1,sk2) 的记录组合 (1,2)。

我写的查询是选择所有列的 lisr 并添加为 group by。 我们有很多数据,所以这个查询运行时间太长。任何机会重新审视这一点并这样做,它可以变得更快。

选择 SK1, SK2, nvl(总和(col3),0), nvl(sum(col4))0, ...... nvl(总和(col50)) 从表 A 按 Sk1 分组, sk2

我将其用作大型查询的一部分,在此基础上执行许多其他计算。

【问题讨论】:

  • 你的问题是?
  • 我已经编辑了我的问题。如果您需要更多详细信息,请告诉我。

标签: oracle performance group-by hints


【解决方案1】:

确定任何一组记录是否包含“Y”就像...一样简单

select   ...
from     ...
group by ...
having   max(flg) = 'Y'

【讨论】:

  • 这只会给我那些有 Y 的值,我必须计算所有的总和,然后只显示或占用那些 Y
  • have 子句在应用聚合后对查询结果应用过滤器,而不是对输入行。因此它将返回源行的 flg 最大值为“Y”的所有聚合行。
【解决方案2】:

现在我已经创建了一个临时表并将所有数据加载到其中。

【讨论】:

    【解决方案3】:

    如果您将其用作大型查询的一部分,您是否尝试过 WITH 选项?

    可能是这样的

    WITH SUM_DATA AS (select col1, col2, nvl(sum(col3),0), nvl(sum(col4))0, ..... nvl(sum(col50)) from table A group by col1, col2)
    
    SELECT xyz 
    FROM abc, sum_data
    WHERE abc.join_col = sum_data.join_col
    

    更多help here

    【讨论】:

    • 如果 WITH 子句只被引用一次,为什么会有帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2012-04-20
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多