传统的关系型数据库都是按照行记录进行存储数据,但是在有些场景,这个行存储方式并不能满足性能要求,尤其是OLAP库中,要按照某个字段纬度进行统计,例如查询男性用户的总数,在这个纬度查询中,是用户只需要某个列的数据,其它列的数据完全不需要,而传统的行存储数据库会将整行记录都读出来,这样会浪费很多IO,进而影响查询速度。
为解决上述问题,数据库厂商退出列式存储数据库,列存储最大的特点是数据是按列存储的,比较适合OLAP应用中获取一部分列的场景。下图是列存储和行存储的区别
从上图可以看出,列存储是将原来行存储表,按照列拆分成多个小表进行存储,经过这种拆分,就将一张大表拆分成若干小表,进而提升查询速度
db2 v10.5版本推出BLU特性,数据库支持列式存储表和行存储表共存,并且可以将行存储表转换成列式存储表,为提升查询速度,采用高度压缩技术,将用户进行压缩,大大减少存储空间,并且在用户查询数据时,不需要解压数据库,这样大大减少IO,进而提升查询速度。
下面看看db2 v10.5怎么使用行存储特性,首先需要设置以下实例参数,开启BLU特性
db2set DB2_WORKLOAD=ANALYTICS
重启实例之后生效
在使用BLU特性之后,需要按照实际需求,调整排序区大小SORTHEAP,SHEAPTHRES_SHR,如果设置过小,则会报以下错误
SQL0955C Sort memory cannot be allocated to process the statement. Reason
code = "3". SQLSTATE=57011
同时调整实例的并行参数,并行度可以参照机器的cpu核数
db2 update dbm cfg using INTRA_PARALLEL on
db2 update dbm cfg using MAX_QUERYDEGREE 2
下面是一个简单的创建列式存储模式的表sql
CREATE TABLE TEST (
"ID" VARCHAR(10 OCTETS) NOT NULL WITH DEFAULT '' ,
"NAME" VARCHAR(10 OCTETS) )
IN "IBMDB2SAMPLEREL"
ORGANIZE BY COLUMN;
ALTER TABLE TEST
ADD PRIMARY KEY
("ID");
在使用列式存储表时,也有一些限制
-
不能创建索引
-
不能使用分区
-
不能使用optimizer hints
-
不能使用静态视图
db2提供工具,可以将行存储模式表,变成列式存储,方式如下所示
db2convert -d sample -z test -t test2
下面是我的公众号二维码,欢迎添加