Teradata 数据库技术概略之三 —— 数据分布机制 哈希算法

Teradata 数据库技术概略之三 —— 数据分布机制 哈希算法

 

我们知道,哈希(Hash)是一个数据映射的过程,该过程将任意长度的的二进制值映射为某一固定长度的二进制值,后面的这个生成的固定长度的二进制值被称为哈希值(Hash Value),而哈希过程中为了映射而使用的具体方法被称为哈希函数(Hash Function),也就是通常所说的哈希算法。根据哈希算法和冲突处理办法,可以把哈希生成的哈希值分布到一个有限的线性地址空间上,不同的哈希值可能会被分布到相同的地址空间,这样就构成了一个表,这个表就是哈希表(Hash Table),或者被称为散列(因此哈希函数有时也被称为散列函数)。在哈希表中,每一个哈希值都唯一地对应于表中的某一个存储位置,这个位置被称为哈希地址(Hash Address)。哈希表中,对应于前面有限的线性地址空间中的某一个空间地址的一系列哈希地址在整体上被称为哈希桶(Hash Bucket),对于一个已经存在的哈希表,其哈希桶的数量是固定的。下面两个表格所表示分别是使用“N Mod 6”和“N Mod 8”两种算法(取模是最简陋但最具有代表性的哈希算法)生成的哈希表,表中绿色背景的部分代表了哈希桶,在两个表中,我们可以分别称它们为1号哈希桶和4号哈希桶。同时我们可以看到,两个哈希表的哈希桶的数量分别为6个和8个。

 

#1

#2

#3

#4

#5

#6

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

 

 

 

 

#1

#2

#3

#4

#5

#6

#7

#8

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

 

 

 

 

 

 

 

Teradata提供了几种不同的哈希算法供用户选择,用于处理其数据分布,这些哈希算法相互之间没有本质上的不同,主要的区别就是为了处理不同的字符集。对于一个Teradata系统,只能使用一种哈希算法,并且,该哈希算法在运行时不可修改。Teradata的哈希算法最终生成的是一个32位长度的哈希值。

 

从上一篇的讨论中我们知道,Teradata根据要存储的每条记录的Primary Index(以后简称PI)值生成一个行哈希值,而这个行哈希值决定了这条记录具体会被分布到哪个AMP上。Teradata把行哈希值切分成两个部分,前一部分叫做哈希桶数(Hash Bucket Number),后一部分是保留值(Remainder),其中哈希桶数部分的值决定了该行哈希值所对应的记录会被分配到哪个哈希桶中(也就决定了该行哈希值所对应的记录会被分布到哪个AMP上),而哈希桶数部分的长度则决定了系统中最多可以有多少个哈希桶。在切分时又包括两种切分方式,一种是切分成“16+16”的形式,另一种是切分成“20+12”的形式。这样,在“16+16”方式中,系统中共包括216即65536个哈希桶,在“20+12”方式中,系统中共包括220即1048576个哈希桶。

 

Teradata的行哈希值的长度为32位,其最多有大约42亿(232)个可能的值,因此,为了在整个系统中唯一标识某一条数据记录,Teradata在每个行哈希值后面又增加了一个32位的唯一值(Uniqueness Value),并与行哈希值连接在一起,称为RowID。具体组成可以参考下图。RowID通常是被表的Secondary Index(SI,将在后文“索引”部分详细说明)所使用,用于在Teradata数据库中快速定位数据记录。


RowID组成


小结:

  • 数据记录的PI经过哈希计算得出的行哈希值包括两个部分,其中的前一个部分为16位或20位长度,代表了当前数据记录所在的哈希桶的编号;
  • 为了保证每个数据记录在整个系统中唯一性,Teradata由AMP生成一个32位长度的唯一值(UV),附加在行哈希值后面,这个唯一值的取值范围是1~232,其作用范围是每个确定的行哈希值;
  • 由行哈希值和UV一起组成的RowID在整个Teradata系统中唯一标识某一个数据记录,RowID是一个全局唯一值,其作用范围是整个Teradata系统。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值