问题是这样的有一个有7张表参与的查询,大体结构如下:select a.*,b.X,c.X
       from (select distinct yyy from ...) a
       cross join
            (select distinct xxx from ....) b
       crosss join
            (select .... from ....) c子查询a单独查询出14行
子查询b单独查询出53行
子查询c单独查询出68行我在用语句整理这几个表之前,查询用时1秒,查询出5万多行整理后用时10秒,同样是5w多行数据,但整理后的执行计划却变了变化在于整理前b子查询位于最后一步,行计数显示700多行,占8%整理后b子查询还是位于最后一步,但行计数显示却是666400行,占到23%,下一步的distinct操作占到60%这让我非常郁闷,不知从何下手,貌似整理前三个子查询是查完后才cross join的
整理后好像是先cross join,着效率肯定高不了,求各为老师指点!!

解决方案 »

  1.   

    感觉b不应该是最后一步,
    select distinct yyy  into #a from ...
    select distinct xxx into #b from
    select ....         into #c from
    select a.*,b.X,c.X from #a a cross join #b b cross join #c c 
    drop table #a,#b,#c
    试一下。找出哪个环节慢
      

  2.   

    回楼上,单个查询a,b,c都很快1秒内我很不明白为什么重建索引会导致执行计划改变,百思不得其解
      

  3.   

    查看一下运行计划;
    exec showPlan_all on
      

  4.   

    回楼上,那就是按照三楼的hrb2008() 那样应该可以,
    因为整理前执行计划显示,用到了两张临时表操作,
    所以快整理后没用临时表操作所以慢但我最想不通,为什么整理索引会导致执行计划的改变
      

  5.   

    偶发了一贴优化数据库
    http://community.csdn.net/Expert/topic/5428/5428951.xml?temp=.6007959