对两个表中的no字段建立索引,同时改语句:
select * from student01 
where not exists 
(select 1 from student02 where student02.no=student01.no)to:bigysw(大花脸) 
  你看到的是非技术区,点技术区可以看到有分数的问题。

解决方案 »

  1.   

    不对!!!!!!!!!!!!!!!!
    你select * 这是最大的败笔!!
    对c/s数据库,返回的结果集是最大的瓶颈,一定要返回的结果集最小
    你的设计有问题,你绝对不会同时用到2万纪录的所有字段 select * 做甚?
    用什么,查什么
      

  2.   

    我试过了,Haiwer的方法很好。但是我还想请教,为什么我的方法和用exists会有如此悬殊的速度?
      

  3.   

    这里关系到in和exists语句的区别,还有索引利用问题。
    in和not in 先执行子查询,返回结果集,再一个一个比较。
    exists和not exists,如果student02的NO有索引,那就进行折半查找。
      

  4.   

    in和not in 没有利用到student02的NO索引
      

  5.   

    一个是需要建立NO索引
    另一个如在SQL SERVER上建立存储过程速度将大大提高
      

  6.   

    1.select *需要换成显示声明,尽量减少输出字段
    2.使用Exists查询(在我的测试中,Exists对于效率的提高会依赖于字段数量,数据库的大小,但总体上会有相当的提高)
    3.加索引
    4.使用Query Analyzer的Index Tuning Wizard进行索引优化碰到性能优化的情况时,可以使用query analyzer里面的性能分析器对查询进行分析,然后再一个环节一个环节的改善。
      

  7.   

    不是in没有利用到student02的索引,而是Exists内的子查询使用了连接查询的优化算法。而in实际上是进行两个表的全连接,效率自然低下。这点可以从查询性能分析图表中看到的。
    _______________________________
    [Haier]
    in和not in 没有利用到student02的NO索引