select distinct ...from table where ....
默认在oracle中explain的话,显示表均为full scan,有看到有资料写着“一般distiict 语句不使用索引。。”。但条件中有可以用到的索引,加了索引select /*+index(...)*/ distinct ...在oracle中explain索引也能使用,但cost反而更大。由于只是测试环境,不敢肯定数据量叫大的情况下又会怎么样。
请教select distinct语句应该加上索引吗,加了效果会不如不加吗?

解决方案 »

  1.   

    另外我想知道索引的工作机制,比如index(a,b,c,d)假如条件有b和c,索引会使用到吗,又或者有a和c,a和c会比单单一个a效率好吗?
      

  2.   

    试一下这个应该效率会高点
    select * from (select x,row_number() over(partion by x order by x) rn from table where ...) where rn=1
      

  3.   

    如果访问的数据块占表数据的小于5%时,使用索引会提高性能,如果所选的值分布在多个
      快中,那么全表扫描会比索引性能好,索引通常会提高SELECT,UPDATE以及DELETE语句的性能,但会
    降低INSERT语句的性能.
      

  4.   

    1 distinct和索引关系不大,distinct一般会带来额外的排序,用不用索引,关键在于你的where里的条件,能过滤掉多少记录2 索引如想能两分查找,必须排在前面的列在条件里,这时是index range scan,
    如果index(a,b,c,d)假如条件有b和c,也有可能被用到,这是因为索引比表小的多,从索引找会快一些,但这时是index skip scan,也就是对a相当于还是全扫描,对b、c是索引扫描
      

  5.   

    distinct与index没有太大关系, 关键是where用index会快很多.
      

  6.   

    "如果index(a,b,c,d)假如条件有b和c,也有可能被用到"
    请问oracle会有“最左前缀”的要求吗?即a没有用到,则不采用改索引?