在数据库技术中,数据存储格式对于查询性能有着至关重要的影响。列存储是一种数据存储方式,它将表中的每一列数据分别存储,而不是传统的行存储方式。这种技术在处理分析型查询时,可以显著提高查询性能和减少I/O操作。
本文将通过实际的内存数据抓取和分析,证明GBase 8s的IWA的确采用了列存储,以优化读取效率和空间利用率,并探讨其对数据库性能的积极影响。本文使用的IWA环境搭建及使用,请参考如下链接:
数据介绍
本文使用的数据包括article、supplier和inventory三个表,通过prepare_data.sh脚本完成建表和数据插入。在脚本prepare_data.sh里,完成了建表,插入数据,截取内容如下:
create table article(
a_artid integer,
a_colorid integer,
a_fitemid integer,
a_designerid integer,
a_labelid integer,
a_package char(25),
a_size integer,
a_stickerprice decimal(15,2),
a_descr char(125)
);
create table supplier(
su_suppid integer,
su_stateid integer,
su_name char(60),
su_street char(40),
su_streetindex char(10),
su_rebate decimal(15,2),
su_acctbal decimal(15,2),
su_indexhits char(140)
);
create table inventory(
i_artid integer,
i_suppid integer,
i_quantity integer,
i_descr char(199)
);
alter table article add constraint primary key (a_artid) constraint p7;
alter table supplier add constraint primary key (su_suppid) constraint p8;
alter table inventory add constraint primary key (i_artid, i_suppid) constraint p11;
alter table inventory add constraint foreign key (i_artid) references article(a_artid) constraint f9;
alter table inventory add constraint foreign key (i_suppid) references supplier(su_suppid) constraint f10;
insert into article values(1,1,1,1,1,"aaaaaaaaaaaaaaaaaaaa01",1,1,"bbbbbbbbbbbbbbbbbbbb0001");
insert into article values(2,2,2,2,2,"aaaaaaaaaaaaaaaaaaaa02",2,2,"bbbbbbbbbbbbbbbbbbbb0002");
insert into article values(3,3,3,3,3,"aaaaaaaaaaaaaaaaaaaa03",3,3,"bbbbbbbbbbbbbbbbbbbb0003");
insert into article values(4,4,4,4,4,"aaaaaaaaaaaaaaaaaaaa04",4,4,"bbbbbbbbbbbbbbbbbbbb0004");
insert into supplier values(1,1,"a","aaaaaaaaaaaaaaaaaaaa01","a",1,1,"bbbbbbbbbbbbbbbbbbbb0001");
insert into supplier values(2,2,"a","aaaaaaaaaaaaaaaaaaaa02","a",2,2,"bbbbbbbbbbbbbbbbbbbb0002");
insert into supplier values(3,3,"a","aaaaaaaaaaaaaaaaaaaa03","a",3,3,"bbbbbbbbbbbbbbbbbbbb0003");
insert into supplier values(4,4,"a","aaaaaaaaaaaaaaaaaaaa04","a",4,4,"bbbbbbbbbbbbbbbbbbbb0004");
insert into inventory values(1,1,1,"aaaaaaaaaaaaaaaaaaaa01");
insert into inventory values(1,2,1,"aaaaaaaaaaaaaaaaaaaa02");
insert into inventory values(1,3,1,"aaaaaaaaaaaaaaaaaaaa03");
insert into inventory values(1,4,1,"aaaaaaaaaaaaaaaaaaaa04");
我们可以看到在article表的a_package列和a_descr列的数据是连续20个a或b开头的字符串。
随后我们将抓取IWA的内存,展示这些数据是如何排布的。
抓取IWA进程的内存数据
1、找到IWA的进程
[root@8s-225 testiwa]# ps aux | grep "DWA_CM"
gbasedbt 4420 0.2 0.6 2860912 112120 ? Sl 14:59 0:02 ./DWA_CM_node0 --no-console
gbasedbt 4448 0.2 0.9 2240356 151380 ? SLl 14:59 0:02 ./DWA_CM_node1 --no-console
root 4982 0.0 0.0 103308 860 pts/1 S+ 15:17 0:00 grep DWA_CM
可以看到有两个IWA进程,进程id分别是4420,4448.
2、抓取这两个进程的内存
gcore 4420
gcore 4448
这两个进程的内存会保存到文件core.4420 和 core.4448 中。
3、在这两个文件中找表的数据
打开文件,并且切换为16进制模式。
vi core.4448
%!xxd
article表的a_package列的内容是紧密排布在一起的,如下:
该列是char(25), 去掉20个’a’和编号外,还剩余3个字节,填充了3个字节的0x20。
2475682 25c6a10: 0101 0000 0000 0000 0000 0000 6161 6161 ............aaaa
2475683 25c6a20: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
2475684 25c6a30: 3031 2020 2061 6161 6161 6161 6161 6161 01 aaaaaaaaaaa
2475685 25c6a40: 6161 6161 6161 6161 6130 3220 2020 6161 aaaaaaaaa02 aa
2475686 25c6a50: 6161 6161 6161 6161 6161 6161 6161 6161 aaaaaaaaaaaaaaaa
2475687 25c6a60: 6161 3033 2020 2061 6161 6161 6161 6161 aa03 aaaaaaaaa
2475688 25c6a70: 6161 6161 6161 6161 6161 6130 3420 2020 aaaaaaaaaaa04
2475689 25c6a80: 0000 0000 0000 0000 0040 0000 0d00 0000 .........@......
2475690 25c6a90: 0000 0038 0000 0000 0100 0200 0200 0000 ...8............
article表的a_descr列的内容也是紧密排布在一起的,如下:
该列是char(125),去掉20个’b’和编号外,还剩余101个字节,填充了101个字节的0x20.
2475191 25c4b60: 0101 0000 0000 0000 0000 0000 6262 6262 ............bbbb
2475192 25c4b70: 6262 6262 6262 6262 6262 6262 6262 6262 bbbbbbbbbbbbbbbb
2475193 25c4b80: 3030 3031 2020 2020 2020 2020 2020 2020 0001
2475194 25c4b90: 2020 2020 2020 2020 2020 2020 2020 2020
2475195 25c4ba0: 2020 2020 2020 2020 2020 2020 2020 2020
2475196 25c4bb0: 2020 2020 2020 2020 2020 2020 2020 2020
2475197 25c4bc0: 2020 2020 2020 2020 2020 2020 2020 2020
2475198 25c4bd0: 2020 2020 2020 2020 2020 2020 2020 2020
2475199 25c4be0: 2020 2020 2020 2020 2062 6262 6262 6262 bbbbbbb
2475200 25c4bf0: 6262 6262 6262 6262 6262 6262 6230 3030 bbbbbbbbbbbbb000
2475201 25c4c00: 3220 2020 2020 2020 2020 2020 2020 2020 2
2475202 25c4c10: 2020 2020 2020 2020 2020 2020 2020 2020
2475203 25c4c20: 2020 2020 2020 2020 2020 2020 2020 2020
2475204 25c4c30: 2020 2020 2020 2020 2020 2020 2020 2020
2475205 25c4c40: 2020 2020 2020 2020 2020 2020 2020 2020
2475206 25c4c50: 2020 2020 2020 2020 2020 2020 2020 2020
2475207 25c4c60: 2020 2020 2020 6262 6262 6262 6262 6262 bbbbbbbbbb
2475208 25c4c70: 6262 6262 6262 6262 6262 3030 3033 2020 bbbbbbbbbb0003
2475209 25c4c80: 2020 2020 2020 2020 2020 2020 2020 2020
2475210 25c4c90: 2020 2020 2020 2020 2020 2020 2020 2020
2475211 25c4ca0: 2020 2020 2020 2020 2020 2020 2020 2020
2475212 25c4cb0: 2020 2020 2020 2020 2020 2020 2020 2020
2475213 25c4cc0: 2020 2020 2020 2020 2020 2020 2020 2020
2475214 25c4cd0: 2020 2020 2020 2020 2020 2020 2020 2020
2475215 25c4ce0: 2020 2062 6262 6262 6262 6262 6262 6262 bbbbbbbbbbbbb
2475216 25c4cf0: 6262 6262 6262 6230 3030 3420 2020 2020 bbbbbbb0004
2475217 25c4d00: 2020 2020 2020 2020 2020 2020 2020 2020
2475218 25c4d10: 2020 2020 2020 2020 2020 2020 2020 2020
2475219 25c4d20: 2020 2020 2020 2020 2020 2020 2020 2020
2475220 25c4d30: 2020 2020 2020 2020 2020 2020 2020 2020
在内存中,列的数据紧密排布在一起,可以证明IWA使用了列存。
通过本文的分析,我们验证了GBase 8s IWA的列存储技术。这种技术的应用不仅提高了数据查询的效率,还优化了存储空间的使用。我们希望本文能够帮助读者更好地理解IWA的内部工作机制,以及列存储技术如何为数据库性能带来积极的影响。