您的位置:程序门 -> db2 -> 基础类



sql问题,union all和union 的效率问题,很奇怪,请来关注一下.


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


sql问题,union all和union 的效率问题,很奇怪,请来关注一下.[已结贴,结贴人:lily1314]
发表于:2007-11-13 10:21:38 楼主
现在我需要一个查询,用到6个union,我查资料得知,用union   all比union效率高.
于是把union替换为union   all,奇怪的问题出现了.
在前端页面,调用查询时候,union   all的速度确实快一些.
但是,到数据库中,用select   *   查询的时候,用union   all建的表一查就暴盘,速度相当慢,查不出数据,死到那了.
我很纳闷这个问题.为何用了union   all反而无法查询呢?
发表于:2007-11-13 10:31:231楼 得分:20
union       all返回的纪录数多,你这个可能是返回的纪录数量过多,导致查不出,你先取前几条纪录,看看是否正常。
发表于:2007-11-13 11:02:232楼 得分:0
我查了一下,用union和union   all返回的记录数都一样,都是8000条.记录里没有重复数据.
发表于:2007-11-13 11:05:263楼 得分:0
我是这样查询的
create   view   ads.v_person_info_test_all
(*,*,*.....)
as  
select   ....
  from
  (
select     ...
  union     all    
select   ...
    union     all                
select     ...
  union     all    
select   ...      
)   as   t0,
ads.   degree_dic   as       t1,    
    ads.duty_dic   as   t2,    
    ads.education_dic   as   t3,  
      ads.know_info_dic   as   t4,  
        ads.   member_dic   as   t6,  
          ads.   member_level_dic   as   t7,    
          ads.   subject_dic   as   t9,  
            ads.   tech_post_dic   as   t10,  
            ads.school_type_dic   as   t11
              where       t1.code   =   t0.degree   and         t2.code   =   t0.duty
发表于:2007-11-13 13:08:584楼 得分:0
你看一下执行计划吧,看看那个地方比较占时间
发表于:2007-11-13 14:41:055楼 得分:0
弱弱的问一下,执行计划在那里看啊
发表于:2007-11-13 15:40:356楼 得分:0
http://www.lslnet.com/linux/dosc1/15/linux-173889.htm
按照上面说的做,在命令行编辑器里就可以看执行计划,选不执行sql,只生成计划的那个。
发表于:2007-11-13 16:18:407楼 得分:0
谢谢大胖,我试一下
发表于:2007-11-13 17:03:198楼 得分:0
看了那个网址,试了一下,报错.
放弃了.
现在觉得相当郁闷.
为什么大家都说union   all   效率高,
在前端查询的时候确实速度快.
可为什么就是直接select   *   from   这张表的时候会巨慢无比.
执行计划那个我也不太懂.
有没有遇到过这种情况的.拜托给解释一下
发表于:2007-11-13 17:17:259楼 得分:0
union       all       效率高,   是肯定的了,因为不需要排序。union需要排序,去掉相同的纪录

在你客户端的时候调用,应该是执行返回的纪录数太多(我碰到的就是这种情况),你说的,我不清楚,所以才让你看执行计划。


另外,你前端查询是用什么查询的,在服务器上操作的?   直接执行,是在你自己的机器上?
发表于:2007-11-13 17:30:2010楼 得分:0
前端是一个查询页面,拼出各种查询条件,然后后台调用select   from   where   的sql语句执行查询
速度还可以.
但是就是不能在数据库里直接查询,这样就死机.真是很奇怪.
我试了一下,直接union   all把所有的表连接起来就没事.
我现在是用union   all连接起来后当作一个表a,然后再用这个表a和其他的表联合查询.
发表于:2007-11-14 09:42:3211楼 得分:0
前台和数据库里执行的sql是同一个?应该不是吧

你现在的情况,我觉得是sql的效率问题,执行的太慢,所以和死机一样。
发表于:2007-11-14 18:07:5512楼 得分:0
嗯,是啊,可是为什么用了union   all反而会死机呢,应该快才对啊.
用union就没事.就是因为这个才郁闷啊
发表于:2007-11-14 20:11:3813楼 得分:0
union   all和union返回的纪录数都一样??
发表于:2007-11-15 00:24:5314楼 得分:20
union   all   同   union   的区别是   union   all   各表后,只是将各表的数据加在一起,无对数据进行进一步操作。union   在会对数据进行操作,目的,排除相同的数据,如果有多条相同的记录,只保留一条。所以   union   all   的结果集> =union.   至于时间考虑,union   all   虽然快,但结果集大,处理就成问题。时间也是要估量的。用什么操作,主要还是看需要什么。

建议你用2条sql   语句,一个用union   ,一个用union   all   看看时间,以及数据集,不要用select   *   ,select   count(*),这样查询时间以及记录条数都很清楚。

至于如何看执行计划,你用control   center   ->   sql   说明   (我是中文版),然后写入sql   statement,   确定后,就会看到   执行计划,各部的开销也看到,至于如何减少开销,建议你看sql性能调整。

如果无control   center   就用   db2expln   命令。

小弟新手,个人看法,希望帮到你。
发表于:2007-11-20 15:37:3515楼 得分:0
14楼为正解
发表于:2007-12-13 18:24:1716楼 得分:0
谢谢了


快速检索

最新资讯
热门点击