表结构
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 也是没用到索引,而且是哪个子分区进行扫描。我要更快的做关联,
怎么办??
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 也是没用到索引,而且是哪个子分区进行扫描。我要更快的做关联,
怎么办??
如果你建立的索引是全局索引的话,上述查询会优先考虑分区字段,也就是mon='200911',而不会考虑使用code上的索引,因为该索引中符合条件的记录散布在所有的分区中
是否利用上索上,关键要看你查询的数据有多少和你是建立的本地索引和全局索引。
ORACLE会综合考虑成本,(如满足条件的数据量、读取索引的块数等)(现在数据一般都是基于COST优化规则的),是否选择索引。
和
create index idx1 on t1(code,mon) local;
两者有啥区别?
有种说法 说local索引必须包含分区列??
和create index idx1 on t1(code,mon) local;
两者有啥区别?
各位高手看看小弟的问题吧 ,谢啦 .
2、t1和t2表关联,关联条件是t1.code=t2.code and t1.mon=t2.mon and t1.mon=(某月的数字形式如:200911) 的话,oracle是不会使用任何索引的。
分区表会自动分区排除,所以
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 , 搜集统计信息,如果这个索引用不上,那说明你一次查询的数据占表总数的百分比很大,不用索引会更快一些
关联条件是t1.code=t2.code and t1.mon=t2.mon and t1.mon=200911
我觉得在进行表的连接时还是会用到索引的,要不然,索引在表的连接方面就没作用了,