oracle中union和union all区别与性能分析

[ 概要 ]

经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并,

那么二者有什么区别呢? 下面我们就简单的分析下.

[ 比较 ]

union: 对两个结果集进行并集操作, 不包括重复行,相当于distinct, 同时进行默认规则的排序;

union all: 对两个结果集进行并集操作, 包括重复行, 即所有的结果全部显示, 不管是不是重复;

下面我们举一个简单的例子来证明上面的结论:

1. 准备数据:

drop table student;

create table student
(
     id int primary key,
     name nvarchar2(50) not null,
     score number not null
);

insert into student values(1,‘Aaron‘,78);
insert into student values(2,‘Bill‘,76);
insert into student values(3,‘Cindy‘,89);
insert into student values(4,‘Damon‘,90);
insert into student values(5,‘Ella‘,73);
insert into student values(6,‘Frado‘,61);
insert into student values(7,‘Gill‘,99);
insert into student values(8,‘Hellen‘,56);
insert into student values(9,‘Ivan‘,93);
insert into student values(10,‘Jay‘,90);

commit;

2. 比较不同点

查询比较①

-- union all
select * from student where id < 4
union all
select * from student where id > 2 and id < 6

-- union
select * from student where id < 4
union
select * from student where id > 2 and id < 6

union all 查询结果:

union 查询结果:

通过比较不难看出, union all不会去掉重复记录, 而union去掉了重复的记录.

查询比较②

-- union all
select * from student where id > 2 and id < 6
union all
select * from student where id < 4

-- union
select * from student where id > 2 and id < 6
union
select * from student where id < 4

union all 查询结果:

union 查询结果:

通过比较不难看出, union all会按照关联的次序组织数据, 而union会依据一定的规则进行排序.

那么这个规则是什么呢? 我们通过下面的查询得出规律:

-- union
select score,id,name from student where id > 2 and id < 6
union
select score,id,name from student where id < 4

结论: 按照字段出现的顺序进行排序, 之前的查询相当于order by id, name, score, 刚刚的查询相当于order by score, id, name.

[ 总结 ]

1.  因为union all仅仅是简单的合并查询结果, 并不会做去重操作, 也不会排序, 所以union all效率要比union高.

所以在能够确定没有重复记录的情况下, 尽量使用union all.

2. 通常如果表有多个索引列时, 用union替换where子句中的or会起到较好的效果, 索引列使用or会造成全表扫描.

注意: 以上规则只针对多个索引列有效, 假如有column没有被索引, 那还是用or吧.

例如: 还是使用上面的例子, 假定name和score上建有索引.

-- 高效
select id, name, score from student where name like ‘%y%‘
union
select id, name, score from student where score between 80 and 90

-- 低效
select id, name, score from student where name like ‘%y%‘ or score between 80 and 90

oracle中union和union all区别与性能分析

时间: 2024-10-12 21:31:25

oracle中union和union all区别与性能分析的相关文章

oracle中函数和存储过程的区别和联系【转载竹沥半夏】

oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as

oracle中函数和存储过程的区别和联系

oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别. 一.存储过程 1.定义 存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procedure. 2.创建存储过程 create [or replace] procedure 存储过程名 [(参数1 类型,参数2 out 类型……)] as 变量名 类型:

Oracle 中UNDO与REDO的区别详解

    学习设计模式已经有段时间了,初接触设计模式,尽管例子简单.生动,但还是感觉很是抽象.今天又学习了设计模式中的装饰模式,也就是装饰模式让自己对模式略有所懂,装饰模式最大的特点就是把所有需要的功能都按正确的顺序串联起来进行控制.这里需要强调的是"顺序",也就是说这种装饰是建立在一定的顺序之上的,而且这种顺序是由人为控制的:不同于建造者模式,它的顺序是固定不变的. **概念     动态地给一个对象添加一些额外的职责,就增加的功能来说,装饰模式比生成子类更为灵活. **结构图    

Oracle中function和procedure的区别

Oracle中function和procedure的区别: 1). 可以理解函数是存储过程的一种 2). 函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值 3). 函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程 4). 在sql数据操纵语句中只能调用函数而不能调用存储过程 原文地址:https://www.cnblogs.com/Xbingbing/p/8870575.html

ORACLE中CLOB与Clob有区别

在ORACLE中CLOB与Clob是有区别的类型. (oracle.jdbc.internal.OracleCallableStatement)OracleCallableStatement能接收CLOB的数据类型, (java.sql.CallableStatement)CallableStatement能接收Clob的数据类型. CODE示例 PACKAGE CREATE OR REPLACE PACKAGE BODY cux_supp_approval_report_pkg IS PROC

Oracle中rownum和row_number()的区别

Oracle中 rownum,为符合where条件的输出结果集中现在有多少条记录. where条件中的rownum可以这样理解 select中的rownum可以理解为,将这条记录放到输出结果集中,就在这条记录中加上这个是第几行(输出一行生成一个) row_number() OVER (ORDER BY id),为结果记录集生成后,按给定字段排序后的行号 注意这两者都是在order by条件之前执行的.

oracle中row_number和rownum的区别和联系(翻译)

http://www.tuicool.com/articles/bI3IBv 附问题:有以下一个SQL语句: SELECT * FROM ( SELECT t.*, row_number() OVER (ORDER BY ID) rn FROM mytable t ) WHERE rn BETWEEN :start and :end sql中的order by语句大大降低了处理的速度,如果把order by去掉,相应的执行计划会大大地提高.如果换成下面的sql: SELECT t.*, row_

ORACLE中SID和SERVICE_NAME的区别

先来讲一个小故事,2015年6月份,有个客户迁移了数据库,由单实例数据库变成了RAC.JAVA应用程序出现了无法连接数据库的情况,但是PL/SQL能连接上数据库.由于项目比较庞大,虽然在半夜切换的,但是也不能接受长时间的业务停顿.当时,我对ORACLE技术也只是略知皮毛.在咨询过公司研发后,他们给我的建议是:参考PL/SQL的连接参数,将spring中jdbc连接的url由jdbc:oracle:thin:@10.2.0.2:1521:orcl改为jdbc:oracle:thin:@(DESCR

Oracle中exists与in的区别

有两个简单例子,以说明 "exists"和"in"的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高. 2) select * from T1 where T1.a in (select T2.a from T2) ; T1数据量非常大而T2数据量小时,T1>>T2 时,2)