你用过Oracle的Global Partition Index吗?

    Oracle的分区表也不是十分好用, 当分区的数目比较多时, 很可能让一些不能进行Partition Prune的SQL拥有很高的逻辑读(Consistent Gets), 解决的办法是将一些索引建成全局索引. 现在我们来看一下相反的例子, Oracle中的表是不分区的, 而且访问量最多的SQL是根据一个选择性很好的索引去走的, 每次执行的逻辑读也就只有4-6个了, 因为访问量很高, 如果能降底一个逻辑读的话, 也可能降底整个系统5%-10%的逻辑读, 我们应当从哪儿来考虑呢? 索引的层次(Level)绝对是一个值得研究的角度. 事实上如果我们能让索引的层次(Level)高度降一级, 就可以降低一个逻辑读了, 通过常有以下的方法可用:

1, Rebuild索引.
2, 删除一部份数据后重建索引.
3, 将索引建到一个较大Block Size的表空间中.
4, 建成Global Partitioned索引.

    什么是Global Partitioned索引? 指的是在非分区表上建的分区索引, 或者是分区表上但分区方法和表不相同的索引. 通过分区技术, 我们可以将一个大的索引划分为小片, 从而降底索引的层次(Level). 下面来看一下如何在非分区表上建分区索引:

create table t_objects as select * from all_objects;
create index t_objects_id_idx on t_objects (object_id)
   global partition by hash(object_id) partitions 4;

    虽然表是非分区表, 但有了这样一个分区的索引后, 所有这个表的SQL都将采用CBO, 这是需要考虑的地方, 取决你的SQL现在运行的方式.

留言 (3)

有价值,记下了.

原来只知道降低Level会有帮助, 没想到Partiton Index 有这个好处. 马上Benchmark RunStats + SQL Auto Trace 测试一下.

这下有了具体执行方法了.

另外, 恭喜你当爸爸了.

我老婆还不愿意生哩.

居然要到10g才支持这种用法.

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • That's just what I was looking for.
  • 那正是我所期待的.
  • It might be, I suppose.
  • 我想可能是这样.
  • Good try, but not quite right.
  • 是个很好的尝试, 但并不完全正确.
  • That's rather disappointing.
  • 真是让人失望.
  • In my opinion, your new coat is not worth so much money.
  • 我认为你的外套不值得这么多钱.