环境:PostgreSQL 8.4。
下面这段SQL原来用union all,效率很低,跑一次用了90秒,后来改为union 居然只用了300+毫秒。
select ...
from ( result1
union all resul2
union all resul3) set_a
,( result1
union all
resul2
union all resul3) set_b
,(...) set_c
where set_a.id <> set_b.id
and set_a.party = set_b.party
and set_a.id = set_c.c1
and set_b.id = set_c.c2 set_a , set_b 是一样的数据集,
把union all 换成union 后,set_a 里的数据由 300条 减少到 280条 ,
结果整个SQL的执行时间由 90000 ms 减少到 300ms有点让人费解,希望有经验的人回答下。
如果需要更详细的SQL我会贴上来
下面这段SQL原来用union all,效率很低,跑一次用了90秒,后来改为union 居然只用了300+毫秒。
select ...
from ( result1
union all resul2
union all resul3) set_a
,( result1
union all
resul2
union all resul3) set_b
,(...) set_c
where set_a.id <> set_b.id
and set_a.party = set_b.party
and set_a.id = set_c.c1
and set_b.id = set_c.c2 set_a , set_b 是一样的数据集,
把union all 换成union 后,set_a 里的数据由 300条 减少到 280条 ,
结果整个SQL的执行时间由 90000 ms 减少到 300ms有点让人费解,希望有经验的人回答下。
如果需要更详细的SQL我会贴上来
解决方案 »
- 关于索引的一些疑问求解答。
- mysql挂到分区运行一段时间后,create/symlink failed, no inodes
- mysql插入数据显示成功,但是找不到插入的数据
- 求MySQL删除语句
- 数据库设计一问--探讨如何操作最高效
- insert 语句中values(not_sque.nextVal)是什么意思?
- 求一个数据表中两条记录合并成一条的思路
- Select * from table where col='%keyword%',结果中总出现col里面不带keyword的,如何解决这个问题?
- 如果对utf编码直接进行查询?
- 关于数据库设计-菜鸟求问
- NOT EXISTS
- 一个很复杂的调查问卷数据库设计
但你的SQL语句并不是简单的UNION语句, 涉及到where及索引利用的问题建议将两者语句explain一下。
结合#6楼的意见,我又重新跑了几次,都是重启的服务,应该可以清除缓存吧。
本地:用UNION -> 重启服务运行3次,时间1200-1300ms
本地:用UNION ALL -> 重启服务,第一次:3000ms,第二次:198000ms
再次重启服务,执行222000ms
第三次重启,执行215000ms
表象看: UNION ALL 还是 要比UNION花的时间更长。
(本地性能要差一些,运行时间比昨天贴的要长)
之所以速度快慢的最主要原因,是一条利用了索引,另一条用不到索引
这个因素永大于union all比union快的因素。现在的问题是:为什么union可以利用了索引,而union all利用不了索引。
如果想知道里面的细节,你自己explain一下你的SQL语句就知道了。
union all的速度比union慢的原因是否因为内存分配造成的?