用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 用于合并两个或多个 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`语句进行合并处理的案例,强调了不恰当的合并处理可能导致的性能问题。 首先,我们来看两种处理方式: 1. 传统`IF`语句方法: 当需要根据条件选择查询不同表时,...
- **推荐做法**:使用`UNION ALL`代替`UNION`以提高合并效率,如`SELECT * FROM A WITH (NOLOCK) WHERE Verify = 3 UNION ALL SELECT * FROM A WITH (NOLOCK) WHERE Verify = 1`。 - **不推荐做法**:直接使用`UNION...
使用UNION ALL代替UNION - **概述**:UNION ALL相比于UNION操作更快,因为它不需要去除重复记录。 - **实践建议**: - 如果不需要去除重复记录,则优先使用`UNION ALL`。 - 定期检查查询计划,确保选择了最优的...
- 利用UNION ALL代替UNION,若不需去除重复记录,以提升性能。 - 使用LIKE操作符时,应避免在开头使用通配符,以利用索引。 5. I/O性能优化 数据库的I/O操作通常是最耗时的部分,优化I/O是提高性能的关键: - ...
在适当的情况下,使用UNION ALL代替UNION,因为UNION ALL不会进行重复值检查,速度更快。 其次,索引是SQL查询优化的关键工具。创建合理的索引可以极大地加快查询速度。索引应建在经常用于查询条件和排序的列上,但...
总的来说,SQL查询优化是一个涉及多方面技巧的过程,包括但不限于正确使用索引、优化查询结构、控制资源消耗以及遵循数据库设计最佳实践。通过这些方法,可以显著提升SQL查询的效率,进而提高整个数据库系统的性能。
若无重复需求,应使用UNION ALL代替,以避免排序和去重操作。 二、SQL书写的影响 1. 表名和列名的书写方式:不同的命名约定(如带前缀、大小写等)可能影响解析速度。统一命名规范能提高解析效率。 2. WHERE条件...
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语句来提高查询效率,特别关注那些能让索引等机制更高效地发挥作用的方法。 #### 二、避免全表扫描 全表扫描是指数据库遍历整个表来查找符合特定条件的数据记录,这种方式通常效率...
5. **使用UNION ALL代替UNION**:当不需要消除重复记录时,使用UNION ALL代替UNION,因为UNION ALL通常更快。确保理解查询逻辑,避免不必要的去重操作。 6. **避免计算索引字段**:在WHERE子句中对索引字段进行计算...
如果必须使用,可以尝试将`OR`拆分为多个查询,然后使用`UNION ALL`组合结果。 3. 当处理多表联接时,考虑使用`JOIN`代替子查询,以减少查询的复杂性,并利于优化器选择更有效的执行计划。 4. 对于复杂的查询,...
- **使用UNION ALL代替UNION**:当不需要去除重复行时,使用UNION ALL替代UNION,以减少不必要的数据处理开销。 - **避免使用NOT IN和NOT EXISTS**:这些操作符可能导致全表扫描,应尽量避免使用,可替换为LEFT JOIN...
- 使用 `UNION ALL` 替代 `UNION`,除非确实需要去除重复记录。 - 避免在 `WHERE` 子句中使用 `IN`, `NOT IN`, `OR` 或 `HAVING`,可以考虑使用 `EXISTS` 或表连接代替。 **1.4 数据声明与Select语句** - **问题...
4. **避免OR连接的条件**:使用UNION ALL替代多个OR条件,可以更有效地利用索引。 5. **谨慎使用IN和NOT IN**:对于连续的数值,优先考虑使用BETWEEN操作符,这通常比IN更高效。 6. **LIKE通配符的使用**:LIKE...
可以使用UNION ALL运算符来代替OR连接条件。 五、慎用IN和NOT IN操作符 IN和NOT IN操作符也需要慎用,否则会导致全表扫描。可以使用EXISTS代替IN操作符,以提高查询效率。 六、避免使用LIKE操作符 在where子句中...
12. **UNION替换**:用`FROM子句+UNION ALL+GROUP BY`替换`UNION`,减少不必要的数据去重操作。 13. **外关联替代NOT IN和NOT EXISTS**:在外关联中实现相同的逻辑,通常比使用NOT IN或NOT EXISTS更高效。 14. **...
对于in查询条件,如果后接条件集合且对应列有索引时,可以考虑将每个条件单独写成一条SQL语句然后用UNION或UNION ALL连接。需要注意的是,UNION会去除重复并排序,会消耗更多的性能,而UNION ALL不会排序,适用于不...
UNION执行的是表连接并去重复的操作,包含了多表的连接、结果集的排序、重复数据的剔除,而在实际的运用场景下,尤其是已经确定了主键的表,并不会产生重复的数据,应尽可能地使用 UNION ALL 代替 UNION 来进行操作...
SQL提示可以在查询中指导优化器如何执行,合理使用可以提高查询效率。 ##### 3.39 避免改变索引列的类型 在查询中改变索引列的类型(如将数字转换为字符串)会使得索引无效,应避免此类操作。 ##### 3.40 需要...