SQL联合查询优化 用union all来代替union

转载 2011年01月07日 14:25:00

Optimizing UNION
UNION has an interesting optimization that exists across a few different databases. It's obvious when you think about how it works. UNION gives you the rows from two tables that don't exist in the other. So implicitly, you are removing duplicates. To do this the MySQL database must return distinct rows, and thus must sort the data. Sorting, as we know is expensive, especially for large tables.

UNION ALL can very well be a big speedup for you. What if you already know that your data does not contain duplicates in either row, or what if you don't care about duplicates? In either case, UNION ALL is for you. Further, there may be other ways you can avoid the duplicates in your rows using some application logic, so you know that UNION ALL will provide the results you want, without the heavy overhead of sorting the data.

union和union all的差别就在于union会对数据做一个distanct的动作,而这个distanct动作的速度则取决于现有数据的数量,数量越大则时间也越慢。而对于几个数据集,要确保数据集之间的数据互相不重复,基本是O(n)的算法复杂度。

有了理论依据后,便动手更改SQL的结构,在确保数据逻辑上不会有重复情况出现后,将2个union都改成了union all,query的反应速度从1.7秒变成了300毫秒左右,耗费时间只有以前的17%。

UNION还有一个用处,我们在海量数据的查询中,如果使用select * from tableName where id in (2,3,4,)这样的查询语句,会引起全表扫描,可以使用UNION ALL来代替,如:

select * from tableName where id=2

UNION ALL

select * from tableName where id=3

UNION ALL

select * from tableName where id=4

这样查询比使用in查询要快很多,它不会去进行全表扫描。


例2:

or语句(部分节选)

SELECT * FROM tablename where (cdp= 300 and inline=301) or (cdp= 301 and inline=301) or (cdp= 302 and inline=301) or (cdp= 303 and inline=301) or (cdp= 304 and inline=301) or (cdp= 305 and inline=301) or (cdp= 306 and inline=301) or (cdp= 307 and inline=301)

union all语句(部分节选)

SELECT * FROM tablename where (inline= 300 and cdp=300) union all SELECT * FROM tablename where (inline= 301 and cdp=300) union all SELECT * FROM tablename where (inline= 302 and cdp=300) union all SELECT * FROM tablename where (inline= 303 and cdp=300)

返回不规则的900条数据,前者用了60多秒,后者用了8秒左右。

------------------------------
用DB2测试,发现还是用IN的效率高于union all

使用UNION代替OR 提升查询性能

昨天一位铁哥们通过QQ找我帮忙,问下面这个SQL能否优化 SQL> set timing on SQL> set autotrace on SQL> select count(*) rowcou...
  • robinson1988
  • robinson1988
  • 2011年08月24日 10:27
  • 13305

使用union来代替字段嵌套子查询优化

这个关于查询任务目标,任务达成情况和任务完成比例的一个查询sql,因为查询的任务包括了3个方面 销售额   开卡数量和微信加粉数量的一个任务查询 所以关联的表比较多,最后需要做的一个结果展示效果如下:...
  • u014508939
  • u014508939
  • 2017年09月26日 14:08
  • 483

MYSQL索引的使用(使用UNION ALL代替OR)

 一个文章库,里面有两个表:category和article。category里面有10条分类数据。article里面有20万条。article里面有一个"article_category"字段是与c...
  • liyanqing1981
  • liyanqing1981
  • 2008年12月04日 15:49
  • 2871

[sql server] 问题总结7- union-- union all--with as 实例

有三个表,Porducts(产品表),InStorages(入库表)和TheStorages(出库表)Porducts表中数据为id PorductsCode1 1112 2223 333InStor...
  • sgear
  • sgear
  • 2011年03月07日 00:59
  • 5040

sql exists和not exists用法,UNION与EXISTS简单用法

sql exists和not exists用法MySql秘籍2007-12-29 16:49:44阅读258评论0字号:大中小  exists       (sql       返回结果集,为真)  ...
  • ddv_9527
  • ddv_9527
  • 2010年06月24日 07:50
  • 2123

sql语句中多个union all的case when优化

用case when对sql语句中多个union all优化
  • yangfengjueqi
  • yangfengjueqi
  • 2017年12月12日 11:31
  • 165

SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

SQL Union和SQL Union All用法 SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 请注意,UNION 内部的 SELECT 语...
  • haiross
  • haiross
  • 2013年12月27日 10:59
  • 8697

oracle中or查询慢,最好使用union all代替

oracle中or查询慢,最好使用union all代替
  • weepingisgood
  • weepingisgood
  • 2012年08月23日 12:18
  • 905

SQL中UNION和UNION ALL的详细用法

在开发中,有些数据的存储可能涉及到分库分表,查询的时候,可能需要查询所有的分表,这个时候,就需要用到UNION或者UNION ALL,下面介绍一下UNION的用法以及与UNION ALL的区别: UN...
  • zouxucong
  • zouxucong
  • 2017年06月19日 18:06
  • 3395

Postgresql UNION & UNION ALL 用法以及应用场景.md

想必都接触过联合查询 Union 吧,那么 Postgresql里,union 如何使用呢 ?Union又有哪些应用场景呢??废话少说,show me your demo //其实Union可以适应各...
  • sinat_29742125
  • sinat_29742125
  • 2017年07月20日 17:52
  • 1242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL联合查询优化 用union all来代替union
举报原因:
原因补充:

(最多只允许输入30个字)