`
scholers
  • 浏览: 619680 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • DB
阅读更多
用union all来代替union

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 all与order by用法

    UNION ALL 用于合并两个或多个 SELECT 语句的结果集,使用方法是将每个 SELECT 语句用 UNION ALL 连接起来。例如: ```sql SELECT 'china' AS col_1, 'america' AS col_2, 'canada' AS col_3, -1 AS status FROM ...

    使用UNION ALL代替IF语句的合并处理案例

    本文探讨了在特定情况下使用`UNION ALL`代替`IF`语句进行合并处理的案例,强调了不恰当的合并处理可能导致的性能问题。 首先,我们来看两种处理方式: 1. 传统`IF`语句方法: 当需要根据条件选择查询不同表时,...

    SQL Server SQL优化

    - **推荐做法**:使用`UNION ALL`代替`UNION`以提高合并效率,如`SELECT * FROM A WITH (NOLOCK) WHERE Verify = 3 UNION ALL SELECT * FROM A WITH (NOLOCK) WHERE Verify = 1`。 - **不推荐做法**:直接使用`UNION...

    SQLServer数据库优化之50种方法

    使用UNION ALL代替UNION - **概述**:UNION ALL相比于UNION操作更快,因为它不需要去除重复记录。 - **实践建议**: - 如果不需要去除重复记录,则优先使用`UNION ALL`。 - 定期检查查询计划,确保选择了最优的...

    SQL Server查询优化方法.pdf

    - 利用UNION ALL代替UNION,若不需去除重复记录,以提升性能。 - 使用LIKE操作符时,应避免在开头使用通配符,以利用索引。 5. I/O性能优化 数据库的I/O操作通常是最耗时的部分,优化I/O是提高性能的关键: - ...

    SQL查询优化

    在适当的情况下,使用UNION ALL代替UNION,因为UNION ALL不会进行重复值检查,速度更快。 其次,索引是SQL查询优化的关键工具。创建合理的索引可以极大地加快查询速度。索引应建在经常用于查询条件和排序的列上,但...

    sql查询优化

    总的来说,SQL查询优化是一个涉及多方面技巧的过程,包括但不限于正确使用索引、优化查询结构、控制资源消耗以及遵循数据库设计最佳实践。通过这些方法,可以显著提升SQL查询的效率,进而提高整个数据库系统的性能。

    关于SQL语句的优化

    若无重复需求,应使用UNION ALL代替,以避免排序和去重操作。 二、SQL书写的影响 1. 表名和列名的书写方式:不同的命名约定(如带前缀、大小写等)可能影响解析速度。统一命名规范能提高解析效率。 2. WHERE条件...

    SQLServer2008查询性能优化 2/2

    11.6.3 使用UNION ALL代替UNION 304 11.6.4 为聚合和排序操作使用索引 305 11.6.5 避免在批查询中的局部变量 306 11.6.6 小心地命名存储过程 309 11.7 减少网络传输数量 311 11.7.1 同时执行多个查询 311 11.7...

    sql语句的优化

    本文将详细介绍如何通过优化SQL语句来提高查询效率,特别关注那些能让索引等机制更高效地发挥作用的方法。 #### 二、避免全表扫描 全表扫描是指数据库遍历整个表来查找符合特定条件的数据记录,这种方式通常效率...

    高手详解SQL性能优化十条经验

    5. **使用UNION ALL代替UNION**:当不需要消除重复记录时,使用UNION ALL代替UNION,因为UNION ALL通常更快。确保理解查询逻辑,避免不必要的去重操作。 6. **避免计算索引字段**:在WHERE子句中对索引字段进行计算...

    SQL语句的优化及SQL 性能调整原则

    如果必须使用,可以尝试将`OR`拆分为多个查询,然后使用`UNION ALL`组合结果。 3. 当处理多表联接时,考虑使用`JOIN`代替子查询,以减少查询的复杂性,并利于优化器选择更有效的执行计划。 4. 对于复杂的查询,...

    Sql_server2005优化查询速度51法

    - **使用UNION ALL代替UNION**:当不需要去除重复行时,使用UNION ALL替代UNION,以减少不必要的数据处理开销。 - **避免使用NOT IN和NOT EXISTS**:这些操作符可能导致全表扫描,应尽量避免使用,可替换为LEFT JOIN...

    sqlserver优化笔记

    - 使用 `UNION ALL` 替代 `UNION`,除非确实需要去除重复记录。 - 避免在 `WHERE` 子句中使用 `IN`, `NOT IN`, `OR` 或 `HAVING`,可以考虑使用 `EXISTS` 或表连接代替。 **1.4 数据声明与Select语句** - **问题...

    sql大数据量查询的优化技巧

    4. **避免OR连接的条件**:使用UNION ALL替代多个OR条件,可以更有效地利用索引。 5. **谨慎使用IN和NOT IN**:对于连续的数值,优先考虑使用BETWEEN操作符,这通常比IN更高效。 6. **LIKE通配符的使用**:LIKE...

    数据库SQL优化大总结 百万级数据库优化方案

    可以使用UNION ALL运算符来代替OR连接条件。 五、慎用IN和NOT IN操作符 IN和NOT IN操作符也需要慎用,否则会导致全表扫描。可以使用EXISTS代替IN操作符,以提高查询效率。 六、避免使用LIKE操作符 在where子句中...

    Oracle SQL规范与优化注意事项

    12. **UNION替换**:用`FROM子句+UNION ALL+GROUP BY`替换`UNION`,减少不必要的数据去重操作。 13. **外关联替代NOT IN和NOT EXISTS**:在外关联中实现相同的逻辑,通常比使用NOT IN或NOT EXISTS更高效。 14. **...

    论MS SQL Server数据库查询优化技巧.pdf

    对于in查询条件,如果后接条件集合且对应列有索引时,可以考虑将每个条件单独写成一条SQL语句然后用UNION或UNION ALL连接。需要注意的是,UNION会去除重复并排序,会消耗更多的性能,而UNION ALL不会排序,适用于不...

    基于Oracle数据库的几种常见SQL优化策略.pdf

    UNION执行的是表连接并去重复的操作,包含了多表的连接、结果集的排序、重复数据的剔除,而在实际的运用场景下,尤其是已经确定了主键的表,并不会产生重复的数据,应尽可能地使用 UNION ALL 代替 UNION 来进行操作...

    Oracle Sql 优化

    SQL提示可以在查询中指导优化器如何执行,合理使用可以提高查询效率。 ##### 3.39 避免改变索引列的类型 在查询中改变索引列的类型(如将数字转换为字符串)会使得索引无效,应避免此类操作。 ##### 3.40 需要...

Global site tag (gtag.js) - Google Analytics