1、union和union all
UNION对两个结果集进行并集操作,不包括重复行,相当于使用distinct关键字。而UNION ALL则对两个结果集进行并集操作,包括重复行,即所有结果全部显示,不管是否重复。
UNION操作会去除重复的记录,只返回唯一的记录。而UNION ALL操作则不会去除重复记录,会直接连接所有的值。
UNION操作会按照字段的顺序进行排序,而UNION ALL操作则不会对结果进行排序。因此我们在项目中能用union all的就使用union all,避免union排序去重增加性能。
2、 问题语句
selectcount(*)from(select t1.* from test t1,(select distinct c1 from test1)t2 where t1.c2=t2.c1 union select t1.* from test t1 where t1.c2 is null)tt;计划:
这个语句实际上并不需要用到union,因为t1.c2=t2.c1这一个条件排除了t1.c2 为空值的情况,而t2中先对c1去重(distinct)也避免了产生重复值,最后求的是t1.*包含了表的主键,主键具有唯一性,因此原本逻辑上不会产生重复值,这样就不用使用union 对结果集去重了。因此可以改写成union all
3、改写
selectcount(*)from(select t1.* from test t1,(select distinct c1 from test1)t2 where t1.c2=t2.c1 union all select t1.* from test t1 where t1.c2 is null)tt计划:
语句从原来的1.073s提升至0.348s。
4、小结
union有对结果集去重的效果,如果结果集的查询项中列长较长,那么所用的时间也会增加,因此,慎用union。