📜  Teradata哈希算法

📅  最后修改于: 2021-01-11 11:37:21             🧑  作者: Mango

Teradata哈希算法

哈希算法是充当转换表的一段代码。根据主索引值将一行分配给特定的AMP。 Teradata使用哈希算法来确定哪个AMP获取行。

Teradata数据库哈希算法是专有的数学函数,可将任意长度的输入数据值转换为称为Rowhash的32位值,该值用于将行分配给AMP。

无论输入是不同列值的组合,来自可变长度列的大小不同的值,还是由不同数据类型组成,哈希算法的输出始终是固定的大小和格式。

它处理大小统一的行标识符,简化了数据库在存储,汇总,排序和联接行期间的工作。

以下是有关散列算法的高级示意图。

这是上图的说明,如何插入数据:

  • 首先,客户端提交查询。
  • 然后,解析器接收查询并将记录的PI值传递给哈希算法。
  • 哈希算法对主索引值进行哈希处理并返回一个32位的数字,称为行哈希。
  • 行哈希的高阶位(前16位)用于标识哈希图条目。哈希图包含一个AMP#。哈希映射是包含特定AMP#的存储桶的数组。
  • BYNET将数据发送到已识别的AMP。
  • AMP使用32位行散列在磁盘中定位行。
  • 如果有任何记录具有相同的行哈希,它将增加唯一性ID(32位数字)。对于新的行哈希,每当插入具有相同行哈希的记录时,唯一性ID就会分配为1并递增。
  • 行哈希和唯一性ID的组合称为行ID。
  • 行ID为磁盘中的每个记录加上前缀。
  • AMP中的每个表行均按其行ID进行逻辑排序。

散列函数

Teradata SQL提供了一些功能,可用于分析现有索引和候选索引的哈希特性。

这些函数在SQL函数,运算符,表达式和谓词中有完整记录。 Teradata中提供了四种类型的哈希函数。

1. HASHROW:描述表达式的十六进制rowhash值。如果我们一次又一次地运行,查询将给出相同的结果。

HASHROW函数产生32位二进制行哈希,存储为数据行的一部分。它最多返回4,294,967,295个唯一值。

句法

HASHROW( [ < data-column-value > [..., < data-column-value >...] ] )

2. HASHAMP: HASHAMP函数返回任何哈希桶编号的主AMP的标识号。

当没有值通过HASHAMP函数传递时,它返回的数字小于当前系统配置中的AMP数目。

句法

HASHAMP( )

3. HASHBUCKET: HASHBUCKET函数产生16位二进制Hash Bucket,与Hash Map一起使用,以确定存储和检索数据行的AMP。

值的范围从0到1,048,575,未将NULL视为可能的结果。

句法

HASHBUCKET( [ ] )

4. HASHBAKAMP: HASHBAKAMP函数返回任何哈希桶编号的后备AMP的标识号。

句法

HASHBAKAMP ( )

哈希冲突

散列冲突是一种情况,其中不同行的行散列值相同,从而当请求从一组散列同义词中检索一个唯一行时,系统很难在散列同义词之间进行区分。

最小化哈希冲突

为了最大程度地减少哈希冲突问题,Teradata数据库定义了42亿个哈希值。 AMP软件将系统生成的32位唯一性值添加到rowhash值。

以内部分区号为前缀的结果64位值称为rowID。该值唯一地标识系统中的每一行,从而进行扫描以检索具有相同行哈希的若干行中的特定行是一项琐碎的任务。

扫描必须检查每一行,以确定它是否具有搜索值,而不是具有相同rowhash值的另一个值。

哈希图

哈希映射是一种机制,用于确定将行存储在哪个AMP上,或者在使用Open PDE哈希映射的情况下,用于确定解析器子系统发送的消息的目标AMP。

映射数组中的每个单元格都对应一个哈希桶,每个哈希桶都分配给一个AMP。哈希映射条目由BYNET维护。