关于号主,姚远:
Oracle ACE(Oracle和MySQL数据库方向)
华为云最有价值专家
《MySQL 8.0运维与优化》的作者
拥有 Oracle 10g、12c和19c OCM等数十项数据库认证
曾任IBM公司数据库部门经理
20+年DBA经验,服务2万+客户
精通C和Java,发明两项计算机专利
01
—
12c中解决“buffer busy wait”
这个题目是说要想办法减少索引叶节点上面的“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”
Scalable sequence在生成无序的主键或唯一键,用于具有高并发级别的数据插入时特别有效,它显著减少了序列和索引块争用,并提供更好的数据加载可扩展性。它的实现原理是根据实例号和会话号在序列值前面加上6位的数字前缀,这样不同的会话生成的序列值的前缀不同,不同实例和不同的会话会把记录插入到不同的数据块中,减少甚至消除了“buffer busy wait”,下面是一个scalable sequence的例子
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,例如:
create sequence scal_seq2;
Sequence created.
SQL> alter sequence scal_seq2 scale;
Sequence altered.
你看懂了吗?需要Oracle/MySQL OCP/OCM培训欢迎找我。
上一条 : 应邀参加墨天轮数据库沙龙Oracle 23ai专题活动
下一条 : 最近又考了两个Oracle认证