我想问一个问题,我在2000里面,执行一个语句:select *from v_kjsxx_jsdd where d_id in (select d_id from v_zcxx),几乎是死机状态,但在2005里面,执行一样的语句,只需要2秒钟,数据量一样,表结构一样,但为什么会这样的呢?我运行select *from v_kjsxx_jsdd,那是很快的,运行select d_id from v_zcxx ,也是很快的,但在一起了就这么慢,真是奇怪了,记得那时候,将2000换2005,就是这么个原因才换的,大概看了一下,select *from v_kjsxx_jsdd,里面的排序,并不是按d_id来排序的.另外,我的视图,v_zcxx,里面有where,只是说,把where取消掉之后,整个一个执行时间会短很多,为什么?请知情人员告知,谢谢

解决方案 »

  1.   

    加个索引试试??
    要不然用EXISTS试试?
      

  2.   

    建议为表v_kjsxx_jsdd的d_id加上索引。并使用以下语句替换你原来的语句:
    select * from v_kjsxx_jsdd a where exists(select 1 from v_zcxx where d_id=a.d_id)  
      

  3.   

    不好意思,没有说清楚,v_kjsxx_jsdd与v_zcxx,都是视图
      

  4.   

    --尽量不要用in,效率很差的,用exists试试。
    select *from v_kjsxx_jsdd a where exists(select 1 from v_zcxx where d_id=a.d_id
      

  5.   

    select a.* from v_kjsxx_jsdd a  
    inner join v_zcxx b on b.d_id=a.d_id
      

  6.   

    如果表结构一样,数据一样,不可能出现这么大的差距的。楼主应该对视图进行下优化。建议在d_id对应的表加上D_ID索引。然后楼主再测试下,估计会好很多。
    如果还是不行。楼主要去看看两个之间到底是那些地方不同
      

  7.   

    select *from v_kjsxx_jsdd,里面的排序,并不是按d_id来排序的
    说明并不是按照d_id,应该建立d_id的聚集索引,以提高性能.
    如果不显示建立索引,sql会默认按照主键顺序存储数据,但也有例外的情况,所以不应该依赖
    sql隐式的索引,应该显示的指定索引.
    因此,sql2000下可能不知什么原因没有按照d_id物理存储数据,而sql2005下面恰好按照物理顺序存储了数据.
    造成了速度不一致.
    由于是视图,就去给视图的基本表建立索引.
      

  8.   

    兄弟,以前这个库就是2005的,然后我把它搞到2000上面来了,其他都没有问题,就这个视图差别会有这么大,D_id上,已经建立了索引了,但还是很慢,优化视图的话,我想再怎么样,也不可能差这么多的呀
      

  9.   

    兄弟,这样应该可以呀。
    select a.* from v_kjsxx_jsdd a  
    inner join v_zcxx b on b.d_id=a.d_id
      

  10.   

    你这样是做关联了,我其实还有很多查询语句在v_zcxx上面的,这样肯定是不行的,你那样,记录会增加的
      

  11.   


    select a.* from v_kjsxx_jsdd a  
    inner join (select distinct id from v_zcxx) b on b.d_id=a.d_id
      

  12.   

    执行下这个查看下消息
    set statistics io on 
      select *from v_kjsxx_jsdd where d_id in (select d_id from v_zcxx) 
      select *from v_kjsxx_jsdd where d_id exists(select 1 from v_zcxx where d_id=a.d_id) 
    set statistics io off 
    我测试了一下  很明显 exists效率要高
    set statistics io on 
    select * from sysobjects where exists (select 1 from syscolumns where id=syscolumns.id) 
    select * from sysobjects where id in (select id from syscolumns ) 
    set statistics io off 
    (所影响的行数为 383 行)表 'syscolumns'。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
    表 'sysobjects'。扫描计数 1,逻辑读 8 次,物理读 0 次,预读 0 次。(所影响的行数为 154 行)表 'sysobjects'。扫描计数 154,逻辑读 308 次,物理读 0 次,预读 0 次。
    表 'syscolumns'。扫描计数 1,逻辑读 15 次,物理读 0 次,预读 0 次。
      

  13.   

    sql在执行sql语句时,会事先将sql语句转化为语法树,然后在进行优化,2000与2005的执行速度不同,可能是他们内部的优化机制不同。