使用oracle与union all检索结果

时间:2018-01-29 15:39:32

标签: oracle

我有3张具有完全相同结构的表

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

我想从这些表中检索最后500行,具体取决于某些'其中'条件。

对于性能问题,如果table1有500个满足这些条件的情况,则无需查看其他表。同样的事情,如果我们在table1和table2上找到500:没有必要查看BIG表table3。

我的目标是不要尽可能地触摸大表table3(和table2)

我的问题是,如果我做了UnionAll,并且如果tables1已经包含了我需要的500行,那么Oracle是否会在table3和table2上搜索并浪费一些时间(行是按顺序排序的)?或者通过UnionAll Oracle汇总所有表,然后检查满足条件的是什么,然后获取前500行,还是有另一个选项?

1 个答案:

答案 0 :(得分:0)

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

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将拥有来收集整个数据集以对其进行排序 - 它可以'只需获取前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;

取决于您想要的分类类型。