表结构
create table t1
(code varchar2(50),
mon  integer,
..
...);
partition by range mon  
(
  partition P200910 values less than (200911)
    ,
  partition P200911 values less than (200912)
    ,
.......;
create index idx1 on t1(code,mon);
每个子分区有几百万条的数据
 table t2的表结构和table t1表结构一样,只是多的几个字段,
且两表经常要关联,关联条件是t1.code=t2.code and t1.mon=t2.mon 
                                            and t1.mon=(某月的数字形式如:200911)现在问题是:我发现这样做关联的话,执行计划里没用到索引,所以导致很慢。
且“select * from t1 where code='ddd' and mon=200911”这句sql 也是没用到索引,而且是哪个子分区进行扫描。我要更快的做关联,
怎么办??

解决方案 »

  1.   

    你的索引时分区索引还是全局索引?
    如果你建立的索引是全局索引的话,上述查询会优先考虑分区字段,也就是mon='200911',而不会考虑使用code上的索引,因为该索引中符合条件的记录散布在所有的分区中
      

  2.   

    对子分区扫描表明分区条件mon='200911'已起了作用。
    是否利用上索上,关键要看你查询的数据有多少和你是建立的本地索引和全局索引。
    ORACLE会综合考虑成本,(如满足条件的数据量、读取索引的块数等)(现在数据一般都是基于COST优化规则的),是否选择索引。
      

  3.   

    楼主考虑把code,mon的复合索引建成local的看看。
      

  4.   

    create index idx1 on t1(code,mon); 

    create index idx1 on t1(code,mon) local; 
    两者有啥区别?
    有种说法 说local索引必须包含分区列??
      

  5.   

    create index idx1 on t1(code,mon); 
    create index idx1 on t1(code,mon) local
    两者有啥区别?
    各位高手看看小弟的问题吧  ,谢啦 .
      

  6.   

    1、索引改为create index idx1 on t1(code) local。这样的话select * from t1 where code='ddd' and mon=200911语句执行起来会很快。
    2、t1和t2表关联,关联条件是t1.code=t2.code and t1.mon=t2.mon and t1.mon=(某月的数字形式如:200911) 的话,oracle是不会使用任何索引的。
      

  7.   

    1.
    分区表会自动分区排除,所以
    select * from t1 where code='ddd' and mon=200911
    这个语句会只扫描 P200910 这个分区所以create index idx1 on t1(code) local这个索引创建的比较好2. 关联条件是t1.code=t2.code and t1.mon=t2.mon and t1.mon=200911t1, t2上建索引 create index idx2 on t1(mon, code) local , 搜集统计信息,如果这个索引用不上,那说明你一次查询的数据占表总数的百分比很大,不用索引会更快一些
      

  8.   

    如果你建立的索引是全局索引的话,上述查询会优先考虑分区字段,也就是mon='200911',而不会考虑使用code上的索引,因为该索引中符合条件的记录散布在所有的分区中
      

  9.   

    不会使用任何索引的??建loacal索引的话,也不会用上吗?
      

  10.   

    我还是想跟您讨论一下,
    关联条件是t1.code=t2.code and t1.mon=t2.mon  and t1.mon=200911
     我觉得在进行表的连接时还是会用到索引的,要不然,索引在表的连接方面就没作用了,