11.转储相关参数
minor_freeze_times
n 控制两次合并之间的转储次数,达到此次数则自动触发合并(Major Freeze)
n 设置为 0表示关闭转储,即每次租户MemStore使用率达到冻结阈值(freeze_trigger_percentage)都直接触发集群合并 minor_merge_concurrency
n 并发做转储的分区个数;单个分区暂时不支持拆分转储,分区表可加快速度
n 并发转储的分区过少,会影响转储的性能和效果(比如MemStore内存释放不够快)
并发转储的分区过多,同样会消耗过多资源,影响在线交易的性能
12.写IO,读IO
宏块
OceanBase 数据库将磁盘切分为大小为 2MB 的定长数据块,称之为宏块(Macro Block),宏块是数据文件写 IO 的基本单位,每个 SSTable 就由若干个宏块构成, 宏块2M 固定大小的长度不可更改, 后续转储合并重用宏块以及复制迁移等任务都会以宏块为最基本粒度。
微块
在宏块内部数据被组织为多个大小为 16KB 左右的变长数据块,称之为微块(Micro Block),微块中包含若干数据行(Row),微块是数据文件读 IO 的最小单位。每个数据微块在构建时都会根据用户指定的压缩算法进行压缩,因此宏块上存储的实际是压缩后的数据微块,当数据微块从磁盘读取时,会在后台进行解压并将解压后的数据放入数据块缓存中。 每个数据微块的大小在用户创建表时可以指定,默认 16KB,用户可以通过语句指定微块长度,但是不能超过宏块大小。
13.outline
所有客户端 连接数据库都必须使用 -c , 错误:
explain select /+index(h2 idx_h2_c1),use_nl(h2,h1),leading(h2) / h1.c1, h2.c2 from h1 ,h2 where h1.c1=h2.c1;在dbeaver也是可以生效的n /+ leading(table_name_list)/
l 指定表的连接顺序
l 如果发现hint指定的table_name不存在,leading hint失效;
l 如果发现hint中存在重复table,leading hint失效
14.全局时间戳服务(Global Timestamp Service,简称 GTS), 事务提交时 OceanBase 数据库内部为每个租户启动一个全局时间戳服务,事务提交时通过本租户的时间戳服务获取事务版本号,保证全局的事务顺序。
15.对于用户租户而言,OceanBase 数据库使用租户级别内部表 __all_dummy 表的 Leader 作为 GTS 服务提供者,时间来源于该 Leader 的本地时钟。GTS 默认是三副本的,其高可用能力跟普通表的能力一样,保证单节点故障场景下 RTO < 30s。
16.全局索引
全局索引的创建规则是在索引属性中指定 GLOBAL 关键字。与局部索引相比,全局索引最大的特点是全局索引的分区规则跟表分区是相互独立的,全局索引允许指定自己的分区规则和分区个数,不一定需要跟表分区规则保持一致。
17.读写流程
Get/MultiGet/Exist 的查询流程是类似的,如下图所示。
先读 boolmfilter 判断数据行在不在,不在就直接返回。
如果存在,接下来读 row cache,
如果未命中,接下来读block index cache.
如果命中 ,然后读 block cache ,
未命中,读IO
对于不存在行的"空查",我们会构建布隆过滤器,并对布隆过滤器进行缓存
Scan/MultiScan 的查询流程是类似的,如下图所示。
- boolfileter 命中,直接返回。
- 未命中,block index cache,
- 命中了 block index cache,读block cache
- 如果未命中,读IO
18.合并
合并特征完整多个计算密集任务:
数据压缩
数据校验
统计信息收集
Schema 变更 对于加列、减列等 Schema 变更,OceanBase 数据库可以在合并中一起完成数据变更操作,DDL 操作对业务来说更加平滑。
轮转合并
为了减少合并对业务的影响,各个 Zone 按照指定的顺序依次合并,正在合并的 Zone 不对外提供服务。
19.全局索引
分区表的DDL操作可能导致索引失效
索引建立的原因:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
20 轮转合并 (注意:以zone为单位)
一般情况下,OceanBase会有3份(或更多)数据副本;可以轮流为每份副本单独做合并
当一个副本在合并时,这个副本上的业务流量可以暂时切到其它没有合并的副本上
某个副本合并完成后,将流量切回这个副本,然后以类似的方式为下一个副本做合并,直至所有副本完成合并
通过参数enable_merge_by_turn开启或者关闭轮转合并
以ZONE为单位轮转合并,只有一个ZONE合并完成后才开始下一个ZONE的合并;合并整体时间变长
某一个ZONE的合并开始之前,会将这个ZONE上的Leader服务切换到其它ZONE;切换动作对长事务有影响。