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 测试一下.
这下有了具体执行方法了.
Posted by zhu1 (木匠) | Feb 2, 2007 3:09 AM
另外, 恭喜你当爸爸了.
我老婆还不愿意生哩.
Posted by zhu1 (木匠) | Feb 2, 2007 3:10 AM
居然要到10g才支持这种用法.
Posted by anysql | Feb 12, 2007 1:34 PM