我是个初学者,看到老白的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));
这段分区是什么意义?是有三个节点吗?如果是两个节点上面这段代码应该怎样写?
谢谢各位!
“我说如果这样就好办,我们可以对表结构做一个调整,来彻底解决这个问题。我们重新对表进行分区,使之成为一个复合分区表,在这张表上加入一个字段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));
这段分区是什么意义?是有三个节点吗?如果是两个节点上面这段代码应该怎样写?
谢谢各位!
即,3个范围分区,每个范围分区有8个HASH子分区。
也就是数据块不同,所以读入到buffer cache中对应到不同的内存块区域。
也就是数据块不同,所以读入到buffer cache中对应到不同的内存块区域。