我是个初学者,看到老白的DBA日记里有这么一段话
“我说如果这样就好办,我们可以对表结构做一个调整,来彻底解决这个问题。我们重新对表进行分区,使之成为一个复合分区表,在这张表上加入一个字段inst_id,也就是实例编号,这个字段作为主分区字段,按照这个分区做范围分区后,再设置msg_id的hash分区。调整后的表结构如下:
CREATE TABLE QSTORE
(
  MSG_ID         VARCHAR2(64 BYTE)                NOT NULL,
  DOCE_ID       VARCHAR2(100 BYTE)               NOT NULL,
  DOC_KEY       VARCHAR2(100 BYTE)               NOT NULL,
  BUS_NAME      VARCHAR2(100 BYTE),
  MODULE_NAME   VARCHAR2(100 BYTE),
  CATEGORY     VARCHAR2(64 BYTE),
  SUB_CATEGORY  VARCHAR2(64 BYTE),
  DOC_SIZE      NUMBER(11)                       DEFAULT 0,
  CREATE_TIME   DATE,
  MODIFY_TIME   DATE,
  EXPIRED_TIME  DATE,
  DOC_FLAG      NUMBER(2),
  Inst_id     number
) initrans 20 pctfree 20 tablespace  TS_DATA_EAI
PARTITION BY RANGE(inst_id)
  SUBPARTITION BY HASH(msg_id) SUBPARTITIONS 8
   (PARTITION p1 VALUES LESS THAN (2),
    PARTITION p2 VALUES LESS THAN (3));
;
Inst_id的值就是插入进程连接到的实例的ID,这样调整后,在1号节点上插入的数据将全部被插入到inst_id=1的分区,插入操作就不会产生大量的global cache request了。这种做法也是在RAC上解决GC BUFFER BUSY的常用方法之一。”其中分区语法都能明白,只是明白inst_id通过程序是怎样限制访问的。
另外,SUBPARTITION BY HASH(msg_id) SUBPARTITIONS 8
         (PARTITION p1 VALUES LESS THAN (2),
         PARTITION p2 VALUES LESS THAN (3));
这段分区是什么意义?是有三个节点吗?如果是两个节点上面这段代码应该怎样写?
谢谢各位!

解决方案 »

  1.   

    先按范围(RANG)分区,然后使用HASH子分区。
    即,3个范围分区,每个范围分区有8个HASH子分区。
      

  2.   

    inst_id是实例号,将不同实例的插入到不同的分区,这样就不会引起BUFFER BUSY争用。
    也就是数据块不同,所以读入到buffer cache中对应到不同的内存块区域。
      

  3.   

    inst_id是实例号,将不同实例的插入到不同的分区,这样就不会引起BUFFER BUSY争用。
    也就是数据块不同,所以读入到buffer cache中对应到不同的内存块区域。