【问题标题】:retrieve results using union all with oracle使用 union all 和 oracle 检索结果
【发布时间】:2018-07-08 08:41:46
【问题描述】:

我有 3 个结构完全相同的表

table1 包含今天的数据,table2 包含本周的数据,table3 包含过去的其余数据,并且行按 id 排序

我想根据某些“位置”条件从这些表中检索最后 500 行。

对于性能问题,如果 table1 有 500 行满足这些条件,则无需查找其他表。如果我们在 table1 和 table2 上找到 500 也是一样的:不需要在 BIG 表 table3 上查找。

我的目标是尽可能不碰大桌子 table3(和 table2)

我的问题是,如果我执行 UnionAll,并且如果表 1 已经包含我需要的 500 行,那么 Oracle 是否会在表 3 和表 2 上搜索并浪费一些时间(行是按顺序排列的)?或者通过UnionAll Oracle concat所有表然后检查满足条件的内容然后取前500行,还是有另一种选择?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    好的,所以我对此进行了一些测试,结果让我感到惊讶。

    select 'test' from all_objects
    union all 
    select 'TEST' from all_objects
    fetch first 500 rows only;
    

    在这种情况下,所有 500 个结果都显示 test。它只是从第一个查询中提取的。这似乎表明您的想法可行。 (注意:我在这里使用 12c 语法,fetch first X rows only,但它应该与 rownum 相同。)

    但是,如果您有一个与 UNION ALL 处于同一级别的 ORDER 子句,它就达不到目的,因为 Oracle 必须收集完整的数据集以便对其进行排序 - 它可以' t 只获取前 500 行。

    select 'test' from all_objects
    union all 
    select 'TEST' from all_objects
    order by 1 asc
    fetch first 500 rows only;
    

    所有结果都是TEST,查询慢。所以,是的,不要这样做。如果您需要为显示目的进行排序,我会将其嵌套在此 UNION 查询的内部或外部。

    外面:

    select * from
      (select 'test' from all_objects
      union all 
      select 'TEST' from all_objects
      fetch first 500 rows only)
    order by 1 asc;
    

    内部:

    select * from (select 'test' from all_objects order by 1 asc)
    union all 
    select * from (select 'TEST' from all_objects order by 1 asc)
    fetch first 500 rows only;
    

    取决于你想要什么样的排序。

    【讨论】:

    • 对不起,我没听明白,你只从一个表中选择'all_objects'?
    • 哦,我明白了,不要打扰我的问题
    • 是的,很抱歉这不是很清楚 - 这是一个内置视图,我只是将它用作包含很多行的示例表。 :)
    • 好的,但是订购所有桌子需要时间吗?如果你有很多列的表格,在这种情况下订单成本太高?
    • 是的,订购大量数据总是很慢。在您订购的列上建立索引会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多