正文
人大金仓学习之三-表空间与跨磁盘存储和分区表
背景
最近在用人大金仓的数据库.
前期学习了 kwr和ksh等工具.
今天想验证一下性能相关的情况.
因为机器正好有多个磁盘的分区. 想着能够将所有的硬盘都用上.
提高性能, 感觉总体还不错, 所以想总结一下.
注意这里只考虑 OLTP 比较古老的数据库, 暂时不分析新时达的分布式数据库.
分布式数据库通过水平无线扩展可以更好的解决这个问题.
计划明天周五如果下班比较早回继续总结一下kmonitor.
关于数据目录
人大金仓默认安装时会将数据文件放到 /opt/Kingbase 某个子目录的 data下面去.
一般情况下, 数据库的安装文件和数据文件要拆开存放, 这样可以保证安全和稳定.
进行数据迁移的方法要非常简单.
将 data 目录放到特定的目录. 将目录给与kingbase用户的属主
然后修改 data_directory的路径到指定路径就可以了.
启动脚本也很简单
/kingbase/ES/V8/Server/bin/sys_ctl -D /nvme01/kingbase/data restart
就可以执行重启操作.
关于跨磁盘存储
一般分区的磁盘空间时有限的.
不可能无限制的扩容,
尤其是在nvme 存储都时直连 CPU的PCI-E的时代
制作成 raid 反而浪费了存储的性能.
此时比较好的方式是分盘挂载,然后通过不同目录放不同数据库, 或者是数据表
实现存储性能的最大化.
说到跨磁盘的存储.
Oracle实现的方式 时可以通过创建表空间对应的数据文件的方式进行.
可以给一个表空间同时添加多个不同硬件挂载目录的datafile的方式实现IO的分布.
Oracle会比较智能的实现数据文件的平均写入.
但是人大金仓这一块与Oracle不太一样.
他其实包含了多个概念. 数据库实例 下面有 数据库, 数据库下面有表空间和架构.
表空间的创建更多的是对应一下物理路径,架构更多的是一个管理的概念.
一个数据库可以有多个表空间. 理论上一个表空间也可以属于多个数据库(不建议)
一个目录应该只能属于一个表空间.
所以跨磁盘存储就可以创建多个 表空间, 然后建表时 通过tablespace 的方式进行分布.
不同磁盘存放不同表的最佳实践
create tablespace zz0001 owner zz0001 location '/kingbasedata/zz';
create tablespace zz0001_01 owner zz0001 location '/kingbasedata/zz01';
create tablespace zz0001_02 owner zz0001 location '/kingbasedata/zz02';
然后建表时
create table table1 (name varchar(32)) tablespace zz0001 ;
create table table2 (name varchar(32)) tablespace zz0001_01 ;
create table table3 (name varchar(32)) tablespace zz0001_02 ;
这种方式就可以实现将三个表存到三个不同的目录
这样可以最佳化磁盘存储性能, 也避免所有表在一起互相影响.
关于分区表
分表存储场景可能比较有限, 并且也可能存在一些风险. 比如一个表大到一个分区放不下.
当然这样的场景一般时需要年度/水平分表来实现.
但是这种会哟一些业务侵入性
还有一个方式是数据库分区表
人大金仓与PG数据库一样, 其实支持三种分区表 list 分区. range 分区 以及 hash分区
因为最近比较忙乱, 所以想着仅学习和使用 hash分区
因为hash分区的结果最为平均. 但是实际上还是需要使用 list 或者是rage 这样更加有利于查询场景的性能调优
需要注意 hash分区表里面 MODULUS 表示取余的模数, REMAINDER 表示剩余数. 拆三个表 就是 按照3 取余最好
五个表就是按照五取余数. 这个比较简单.
drop table if exists tablehash ;
CREATE TABLE tablehash ( id varchar(36),name varchar(200)) PARTITION BY HASH(id) ;
create index index_tablehash_master on tablehash USING btree (id) ;
create table tablehash_p1 PARTITION OF tablehash FOR VALUES with (MODULUS 3, REMAINDER 0) tablespace zz0001_01;
create index index_tablehash_master_p1 on tablehash_p1 USING btree (id) ;
create table tablehash_p2 PARTITION OF tablehash FOR VALUES with (MODULUS 3, REMAINDER 1) tablespace zz0001_02;
create index index_tablehash_master_p1 on tablehash_p2 USING btree (id) ;
create table tablehash_p3 PARTITION OF tablehash FOR VALUES with (MODULUS 3, REMAINDER 2) tablespace zz0001_03;
create index index_tablehash_master_p1 on tablehash_p3 USING btree (id) ;