【本文正在参与炫“库”行动—人大金仓有奖征文】
人大金仓有奖征文 (csdn.net)https://bss.csdn.net/m/topic/kingbase
在金仓分析型数据库系统KingbaseAnalyticsDB创建表时,DISTRIBUTED BY语句用于定义表的分布策略。不同的分布策略决定了表中的数据如何切分到不同的KingbaseAnalyticsDB实例上。金仓分析型数据库系统KingbaseAnalyticsDB提供了 3 种分布策略:HASH 分布、随机分布、复制分布。
一、分布策略
1.1、HASH 分布
创建表时,指定一个或多个列用于hash分布(称为分布键)。通过分布键计算出每个记录的hash值再分布到对应的KingbaseAnalyticsDB实例上。相同hash值的记录会分布到相同的KingbaseAnalyticsDB实例。选择重复值较少的字段作为分布键,可以确保KingbaseAnalyticsDB各个实例数据分布均匀。一般这个分布列可能在其它表中具有主键特征(不建议创建主键,很影响加载性能),例如身份证号码。另外,在选择分布键时,也需要考虑大表与大表之间的关联,避免关联查询时数据重新分布或分发。
CREATE TABLE COMPANY(
ID INT NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
) DISTRIBUTED BY (ID);
--插入100000条数据
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) SELECT A, 'Paul', 32, 'California', A FROM GENERATE_SERIES(1,100000) A;
CREATE TABLE DEPARTMENT(
ID INT NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
) DISTRIBUTED BY (EMP_ID);
--插入100000条数据
INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID) SELECT A, 'IT Billing', A FROM GENERATE_SERIES(1,100000) A;
使用ID字段关联COMPANY表、DEPARTMENT表记录。当分布键与关联字段不相同时,通过执行计划可以看出,DEPARTMENT表广播(Broadcast:各个实例将自己的数据分发给其它实例)数据到各个实例,影响了查询性能。
postgres=# EXPLAIN ANALYZE SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT ON COMPANY.ID = DEPARTMENT.ID;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------
Gather Motion 6:1 (slice2; segments: 6) (cost=2534.00..14092.00 rows=100001 width=60) (actual time=189.948..1654.684 rows=100000 loops=1)
-> Hash Join (cost=2534.00..14092.00 rows=16667 width=60) (actual time=220.309..1597.873