关于SQL union操作的效率问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于SQL union操作的效率问题相关的知识,希望对你有一定的参考价值。

比如我又三个表 T1,T2,T3 其中T1有aname 字段 T2有bname字段 T3 有cname字段 我 我想把T1里面aname不在T2.bname ,T3.cname里的记录找出来。
我下面两种写法效率哪个好?
1.
SELECT T1.aname FROM T1 WHERE NOT EXISTS(SELECT 1 FROM T2 WHERE T1.aname = T2.bname)
union
SELECT T1.aname FROM T1 WHERE NOT EXISTS(SELECT 1 FROM T3 WHERE T1.aname = T3.bname)

2.
SELECT T1.aname FROM T1 WHERE NOT EXISTS(SELECT * FROM (SELECT T2.bname FROM T2 union SELECT T3.cname FROM T3 ) T2 WHERE T1.aname = T2.bname)
大概就是这个意思,就是说先分别找需要数据再union快,还是先union数据再找需要数据快?
此外,一般那些东西会影响union操作的性能?

你的1和2两个语句结果是不同的……
第一个要写成select XX from T1 where not exists(XX) and not exists(XX)才是和第二方法一样的结果
而上面的写法比第二种方法快
一般来说如果select 字段大于1个,用union all比用union速度快,因为union 会将多个结果中重复的数据合并,这个要多耗一点时间,union all则是直接合并
至于说说先分别找需要数据再union快,还是先union数据再找需要数据快,这个相差不大,更重要的是你很少会遇到什么业务是两者结果相同的(比如你给的例子就不是个适合的例子)……
参考技术A 你的第一个 明显比第二个快,第二个太多子查询了

对于union,不用追究太多,它只是最终将结果组合在一起而已。效率在于你union前后的语句体现上。本回答被提问者采纳
参考技术B 正常先UNION 在数据更快一些。一般影响UNION 性能只能看你的表大小和WHERE 后面跟到条件,其次还有根据FROM 后面对象表的大小来决定你的查询次序

参考资料:em_pass

参考技术C 你试下用minus函数,试试速度怎么样?
select aname from T1
minus
select bname from T2
minus
select cname from T3
你还可以尝试下连接
select T1.aname
from T1,T2,T3
where T1.aname=T2.bname(+)
and T1.aname=T3.cname(+)
and T2.bname is null
and T3.cname is null

以上是关于关于SQL union操作的效率问题的主要内容,如果未能解决你的问题,请参考以下文章

union all 效率问题

sql中,只使用union和先union all再distinct,两种方式哪个效率高?

oracle sql语句的union效率问题【急】【急】【急】

Union all和Union差别

SQL查询效率——UNION ALL的影响

sql语句or与union all的执行效率哪个更高