- 最后登录
- 2015-1-5
- 在线时间
- 463 小时
- 威望
- 6
- 金钱
- 960
- 注册时间
- 2012-6-27
- 阅读权限
- 10
- 帖子
- 80
- 精华
- 0
- 积分
- 6
- UID
- 538
|
1#
发表于 2013-3-28 16:21:57
|
查看: 6056 |
回复: 12
本帖最后由 dla001 于 2013-3-28 16:21 编辑
OS:OEL5.7 X64
DB: 11.2.0.3 X64
PSU为: 11.2.0.3.5 (14727310)
分区表按时间RANGE分区,子分区为hash分区。
代码如下:- create table zwh_prh1 (c1 number not null,c2 date not null,c3 varchar2(20) not
- null,c4 varchar2(120) not null)
- partition by range(c2)
- subpartition by hash(c1)
- subpartitions 5
- (
- partition p1 values less than (to_date('2012-01-01','yyyy-mm-dd'))
- ,
- partition p2 values less than (to_date('2012-02-01','yyyy-mm-dd'))
- ,
- partition p3 values less than (to_date('2012-03-01','yyyy-mm-dd'))
- ,
- partition p4 values less than (to_date('2012-04-01','yyyy-mm-dd'))
- );
- create sequence zwhse1 cache 2000;
- insert into zwh_prh1 select se1.nextval,to_date('2012-04-01','yyyy-mm-dd')- se1.nextval/1440/2,lpad('A',18,'A'),lpad('B',100,'B') from dual connect by level <= 300000;
- commit;
- create index idx_p_03 on zwh_prh1(c2) local;
- exec dbms_stats.gather_table_stats(user,'ZWH_PRH1',granularity=>'ALL',cascade=>true);
- alter session set events '10046 trace name context forever, level 12';
- select *
- from
- (select /*+index_desc(t IDX_P_03)*/ * from ZWH_PRH1 t where
- c2<to_date('2012-04-01','yyyy-mm-dd') order by c2 desc) where rownum<10;
- select *
- from
- (select * from ZWH_PRH1 t where
- c2<to_date('2012-04-01','yyyy-mm-dd') order by c2 desc) where rownum<10;
- alter session set events '10046 trace name context off';
复制代码 通过10046可以看到:
使用hints的查询,走的index_desc。Rows (max) 45
不使用hints的查询,走的是全表扫描。 Rows (max) 300000
使用hints的查询效率明显比全表扫描的好。
问题是:
对于这种情况的分区表。优化器选择了不是很好的执行计划。这是优化器的问题,还是有什么地方我做错了?
除了人为干预,如果能让优化器选择正确的执行计划?
由于一些原因:不能用普通B-tree索引,不能用全局B-tree索引。
|
|