有一个表A,主键是受诊年月和诊单号 ,其中根据受诊年月建立了partition.这个表中有一个字段,诊疗编号,有一个非聚集索引。现在我跑下面SQL文时,执行计划只有Partition List 没有用诊疗编号的索引,难道有Partition 就会忽略索引?
Select 受诊年月,诊单号 FROM A where 受诊年月 between ... And ...
and 诊疗编号=....
对了,诊疗编号是数值型,等号右边也是数值,所以不会禁用索引

解决方案 »

  1.   

    很奇怪,我写了hint句强制使用索引也不行
      

  2.   

    表的数据量是不是非常大,没做表统计?
    受诊年月 between ... And ...会导致全表扫描!
      

  3.   

    按诊疗编号建立一个局部分区索引
    SQL> create index idx_l_no on 表A(诊疗编号) local;
    建立完成后,搜集统计信息
    SQL> exec dbms_stats.gather_index_stats('用户名','idx_l_no');
      

  4.   

    谢谢各位了,找到原因了。原来是要查询的诊疗编号在整个表中了纪录大于8%。所以导致Oracle抛弃了索引。
    不过很疑惑为什么我写了hint句还是被Oracle抛弃
      

  5.   

    原来这样。把你hint语句也发上来看看啊
      

  6.   

    百分之多少并没有一确切的数据,具体还是要收集统计数据,查看执行计划确定
    并不是说选择性>8%或>10%就一定不用索引,ORACLE基于成本的优化一切以
    统计数据来计算COST!
    另外,可以贴上HINT来看一下,是否写法有问题
      

  7.   

    你这个CASE,我估计是走partition full scan, 不是table full scan。 效率不一样的