参加过Oracle 19c OCM考试的学员都知道,OCM考试结束后会告诉考生考试成绩是多少分,但并不会告诉考生哪道题做错了,就考试问题,姚远老师会总结一些文章出来,欢迎关注。
最近姚远老师在OCM的授课中发现了一道题目,这道题目在12c OCM和19c OCM中都会出现,99%的人都会做错,OCM报名费比较高,在此总结一下,希望帮助到大家顺利通过考试。
号主:姚远(v:dataace)
- Oracle ACE(Oracle和MySQL数据库方向)。
- Oracle 高可用大师。
- 华为云最有价值专家。
- 《MySQL 8.0运维与优化》的作者。
- 拥有 Oracle 10g、12c和19c OCM等20+数据库认证。
- 曾任IBM公司数据库部门经理。
- 服务2万+客户。
- 精通C和JAVA,发明两项计算机专利
12c中解决“buffer busy wait”
大致题目如下:
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.
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培训欢迎找姚远老师咨询🤝。