索引调优主要利用这两个属性, SORT-COLUMNS 和 SORT-SCOPE。
SORT-COLUMNS 就是把使用最常用的过滤列放入里面,比如 C1 和 C2,假设 C1、C2 是最常用的,因索引有顺序,在业务设计的时候需要将最常用的过滤条件识别出来,按照顺序放入 COLUMNS 选项里面。这对常用的过滤条件有着较高效率。第二个是 SORT-SCOPE,我建议大家在默认情况下使用 LOCAL-SORT,LOCAL-SORT 可以保证入库速度较快。如果大家不介意入库速度快慢可以用 GLOBAL-SORT,GLOBAL-SORT 可以做全局的排序,查询更快,但是入库会更慢一些。
CarbonData使用全局字典编码来加速计算过程,它可以先使用编码压缩过的数据进行计算/查询,然后再将结果集解码呈现给用户,这样做可以大量减少磁盘I/O。
CarbonData基于全局多维键(Global Multi Dimension Keys)给所有非度量字段创建B+树索引,同时配合最小/最大值索引可以快速命中包含符合筛选条件的数据的数据块。sort CarbonData在数据块层级建立全字段反向索引,从而可以快速查询该数据块中符合筛选条件的数据行。
10000到100亿行数据和100到300列的表。
表列说明:
Column Name | Data Type | 基数 | 属性 |
---|---|---|---|
msisdn | String | 30 million | 维度 |
BEGIN_TIME | BigInt | 10 Thousand | 维度 |
HOST | String | 1 million | 维度 |
Dime_1 | String | 1 Thousand | 维度 |
counter_1 | Numeric(20,0) | NA | 度量 |
… | … | NA | 度量 |
counter_100 | Numeric(20,0) | NA | 度量 |
把频繁使用的过滤列放在开头:
例如,在大多数的查询中都用到了列MSISDN作为过滤条件,那么我们必须将MSISDN放在第一列中,create table语句可以按照以下建议修改:
create table carbondata_table(
msisdn String,
...
)STORED BY 'org.apache.carbondata.format'
TBLPROPERTIES ( 'DICTIONARY_EXCLUDE'='MSISDN,..',
'DICTIONARY_INCLUDE'='...');
把频繁使用的列按照基数从低到高的顺序排列:
如果查询中有多个经常用来过滤的列,建议按照基数从低到高的顺序排列。这样排序会提高经常使用的列的压缩比,以提高在这些列上使用筛选器的查询性能。
例如,如果MSISDN,HOST和Dime_1是经常使用的列,则表1的列顺序建议为Dime_1> HOST> MSISDN,因为Dime_1具有最低的基数。 create table命令可以按照以下建议进行修改:
create table carbondata_table(
Dime_1 String,
HOST String,
MSISDN String,
...
)STORED BY 'org.apache.carbondata.format'
TBLPROPERTIES ( 'DICTIONARY_EXCLUDE'='MSISDN,HOST..',
'DICTIONARY_INCLUDE'='Dime_1..');
将维度类型列按照从低到高的顺序排列
如果用于过滤的列不经常使用,则建议按照基数从低到高的次序排列所有维度列。 create table命令可以修改如下:
create table carbondata_table(
Dime_1 String,
BEGIN_TIME bigint,
END_TIME bigint,
HOST String,
MSISDN String
...
)STORED BY 'org.apache.carbondata.format'
TBLPROPERTIES ( 'DICTIONARY_EXCLUDE'='MSISDN,HOST...',
'DICTIONARY_INCLUDE'='Dime_1,END_TIME,BEGIN_TIME...');
对于精度不高的度量类型列,请使用Double数据类型替换Numeric(20,0)数据类型
对于度量类型的列,不要求高准确性,建议用Double来取代数字数据类型以提高查询性能。 create table命令可以修改如下:
create table carbondata_table(
Dime_1 String,
BEGIN_TIME bigint,
END_TIME bigint,
HOST String,
MSISDN String,
counter_1 double,
counter_2 double,
...
counter_100 double
)STORED BY 'org.apache.carbondata.format'
TBLPROPERTIES ( 'DICTIONARY_EXCLUDE'='MSISDN,HOST...',
'DICTIONARY_INCLUDE'='Dime_1,END_TIME,BEGIN_TIME...');
增量字符的列应该在维度的末尾重新排列
考虑以下每天加载数据的情况,并且每个加载的begin_time都是递增的,建议将begin_time放在维度的末尾。
增量值在使用最小/最大索引时是有效的。 create table命令可以修改如下:
create table carbondata_table(
Dime_1 String,
HOST String,
MSISDN String,
counter_1 double,
counter_2 double,
BEGIN_TIME bigint,
END_TIME bigint,
...
counter_100 double
)STORED BY 'org.apache.carbondata.format'
TBLPROPERTIES ( 'DICTIONARY_EXCLUDE'='MSISDN,HOST...',
'DICTIONARY_INCLUDE'='Dime_1,END_TIME,BEGIN_TIME....');
避免将高基数列添加到字典中
如果系统内存配置较低,则建议从字典中排除高基数列以提高load性能。 在load时为高基数列创建字典会由于内存过度使用而降低负载性能。
默认情况下,CarbonData确定第一次加载数据时的基数,只有在基数小于100万时才允许字典创建。