select * from 组织 join 部门 on 组织.编号 = 部门.组织编号组织表中的编号是主键 和部门表的组织编号没有约束关系 该查询语句没有问题然后部门表的组织编号加了索引  查询速度大大降低但是如果改变sql语句为:select * from 部门 inner join 组织 on 部门.组织编号 = 组织.编号   速度就快了  不知道是什么原因

解决方案 »

  1.   

    要看执行计划的。这种没有过滤条件的查询语句,理论上的最快速度应该是两个全表扫描使用hash join关联。你在某个表上建立了一个索引,将会导致一个全表扫描加上一个索引查询,使用nested loop,由于索引使用 access by rowid,会执行db file sequential read,导致io次数成几何基数增加。慢点是很正常的。
      

  2.   

    这里加的索引是用在别的查询上面 所以必须要加 过滤条件也写了 这里没写上去 至于为什么改变了两张表内连的位置速度就快了 听你的解释基本上知道是因为减少了IO次数但是为什么一般来说索引执行db file sequential read还会比一般查询要快呢
      

  3.   

    select * from 组织 join 部门 on 组织.编号 = 部门.组织编号
    可以改成这样 性能应该也是会得到提升的select * from 组织 where exists (select 组织.组织编号 from 组织 where 组织.编号 = 部门.组织编号
    )可以试试哈 共同学习嘛
      

  4.   


    按照之前的说法和我试下来的结果是加索引的放后面啊  这样就减少IO次数了
    orcale和索引都不怎么用 打个不恰当的比方 大家看看对不对
    1w条的数据全表查询要1w次  索引查询需要100次IO  如果索引在前面就会执行1w次IO  放在后面就只执行100次?