teradata PI-,
(–本文是个人学习和使用过程中的总结,如有错误欢迎指正)
teradata Primary Index简称PI
teradata 建表时强烈建议明确指定PI列(尽管不指定PI teradata会根据DBScontrol配置自动选定PI),可以是一列或者多列,最多64列
PI主要有三个作用:
PI可以分为两类:(UPI or NUPI)
UPI(Unique Primary Index):不可以包含相同的值,对于装载数据总是将table的数据均匀的分布到AMP上,对于检索数据总是one-AMP operation类型。
语法:
CREATE TABLE sample_1
(col_a INT
,col_b INT
,col_c INT)
UNIQUE PRIMARY INDEX (col_b);
UPI分布:
NUPI(Non-Unique Primary Index ):可以存在相同的值,对于装载数据相同的值会被分布到同一个AMP上
语法:
CREATE TABLE sample_2
(col_x INT
,col_y INT
,col_z INT)
PRIMARY INDEX (col_x);
NUPI分布:
PI为多列的语法:
CREATE TABLE sample_2
(col_x INT
,col_y INT
,col_z INT)
PRIMARY INDEX (col_x,col_y, ..);
PI = (A, B)=
Hash (A) * Hash (B) + Hash (A) + Hash (B) =
Hash (B) * Hash (A) + Hash (B) + Hash (A)
本文简单介绍有关PI在数据分布这一方面的作用,其他两个单独介绍。
teradata 对于数据的切分对用户来说是透明的,我们只需要指定好PI,数据分布的工作由teradata来完成。
那么teradata是如何来分布数据的呢? teradata数据库分布数据依赖于hash算法,针对我们PI列中的值做hash。
如下图可以看出来PE负责对PI做hash,BYNET负责分布数据
Hash算法大致处理流程:
PI列的值经过hash算法返回32 bit的row hash,其中前16位为Destination Selection Word (DSW),该值代表了hash map的入口,也就决定了哪一个AMP接受数据,然后由AMP使用row hash将数据存放到磁盘中。
有关teradata hash function以及如何在数据装载前探查数据分布请参考
使用teradata hash function探查数据分布