Oracle OCM考试结束后会告诉你考试成绩,并不会告诉你哪道题做错了,最近我在OCM的授课中发现了一道题目,99%的人都做错了,这道题目在12c和19c中都出现了,大致题目如下:When inserting data into a table, there are frequent occurrences of "buffer busy wait". This is because a sequence is used to generate values for the ID column of the table. To reduce the number of buffer busy waits, you can modify either the sequence or the index, or both.
这个题目是说要想办法减少索引叶节点上面的“buffer busy wait”, 在12c中的正确做法是重新创建全局分区索引,让热点分散到多个分区中,创建索引的命令如下:
SQL> create index in_1 on tt1(id) global partition by hash(id) partitions 32 parallel 32;
Index created.
02
—
19c中解决“buffer busy wait”
这样做在12c中是对的,但如果想当然的在19c OCM考试中还这样就不对了,因为Oracle推出了一个新特性scalable sequence,参见《Database Administrator's Guide》的24.2.4.3 Making a Sequence Scalable。Scalable sequence在生成无序的主键或唯一键,用于具有高并发级别的数据插入时特别有效,它显著减少了序列和索引块争用,并提供更好的数据加载可扩展性。它的实现原理是根据实例号和会话号在序列值前面加上6位的数字前缀,这样不同的会话生成的序列值的前缀不同,不同实例和不同的会话会把记录插入到不同的数据块中,减少甚至消除了“buffer busy wait”,下面是一个scalable sequence的例子
SQL> create sequence scal_seq1 maxvalue 9999999999 scale;
Sequence created.
SQL> select scal_seq1.nextval from dual;
NEXTVAL
1012350001
我们看到scalable sequence的关键字是“scale”,生成的序列值加上了“101235”的6位数字前缀,我们换一个会话:
SQL> select scal_seq1.nextval from dual;
NEXTVAL
1013820002
这时序列值的前缀变成了“101382”,在这里:
-
序列值= 6位数字前缀+普通序列值
-
6位数字前缀 = 3位实例偏移数 + 3位会话偏移数。
-
3位实例偏移数= [
(实例 ID % 100) + 100
]。 -
3位会话偏移数= [
会话 ID % 1000
]。
对于已经存在的sequence,也可以修改成scalable sequence,例如:
SQL> create sequence scal_seq2;
Sequence created.
SQL> alter sequence scal_seq2 scale;
Sequence altered.
你看懂了吗?需要Oracle/MySQL OCP/OCM培训欢迎找我🤝。