环境: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我会贴上来
但你的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慢的原因是否因为内存分配造成的?