在数据库技术中,数据存储格式对于查询性能有着至关重要的影响。列存储是一种数据存储方式,它将表中的每一列数据分别存储,而不是传统的行存储方式。这种技术在处理分析型查询时,可以显著提高查询性能和减少I/O操作。

本文将通过实际的内存数据抓取和分析,证明GBase 8s的IWA的确采用了列存储,以优化读取效率和空间利用率,并探讨其对数据库性能的积极影响。本文使用的IWA环境搭建及使用,请参考如下链接:

南大通用GBase 8s中的IWA安装及使用详解 - 01

南大通用GBase 8s中的IWA安装及使用详解 - 02

数据介绍

本文使用的数据包括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的内部工作机制,以及列存储技术如何为数据库性能带来积极的影响。