Teradata 主索引

17 Mar 2025 | 4 分钟阅读

主索引用于指定数据在 Teradata 中的存储位置。它用于确定哪个 AMP 获取数据行。

在 Teradata 中,每个表都需要定义一个主索引。如果未定义主索引,Teradata 会自动分配主索引。

主索引提供了访问数据的最快方法。一个主索引最多可以有 64 列。主索引在创建表时定义,不能更改或修改。

主索引是以下操作的首选和重要索引:

  • 数据分布
  • 已知的访问路径
  • 提高连接性能

主索引规则

以下是主索引的一些具体规则,例如:

规则 1: 每个表一个主索引。

规则 2: 主索引值可以唯一非唯一

规则 3: 主索引值可以为 NULL。

规则 4: 填充表的 主索引无法修改。

规则 5: 主索引值可以修改。

规则 6: 主索引最多可以有 64 列。

主索引的类型

主索引有两种类型。

  1. 唯一主索引 (UPI)
  2. 非唯一主索引 (NUPI)

1. 唯一主索引 (UPI)

在唯一主索引表中,该列不应有任何重复值。如果插入任何重复值,将被拒绝。唯一主索引强制列的唯一性。

唯一主索引 (UPI) 总是将表的行均匀地分布在 AMP 之间。UPI 访问始终是一个单 AMP 操作。

如何创建唯一主索引?

在以下示例中,我们创建包含 Roll_no、First_name 和 Last_name 列的 Student 表。

Roll_noFirst_nameLast_name
1001迈克Richard
1002Robert威廉姆斯
1003彼得科林
1004Alexa斯图尔特
1005Robert彼得森

我们选择 Roll_no 作为主索引。因为我们将 Roll_no 指定为唯一主索引,所以表中不能有重复的学生学号。

2. 非唯一主索引 (NUPI)

非唯一主索引 (NUPI) 意味着所选列的值可以是非唯一的。

非唯一主索引永远不会均匀地分布表行。如果数据分布不均匀,则全 AMP 操作将花费更长时间。

我们可能会选择 NUPI 而不是 UPI,因为 NUPI 列可能对查询访问和连接更有用。

如何创建非唯一主索引?

在以下示例中,我们创建包含 Employee_Id、Name、Department 和 City 列的 employee 表。

Employee_Id(员工编号)名称部门城市
202001Max销售伦敦
202002Erika融资Washington
202003Nancy管理巴黎
202004Bella人力资源伦敦
202005山姆营销伦敦

在此表中,每个员工都有不同的员工 ID、姓名和部门,但许多员工属于同一个城市。因此,我们选择 City 作为非唯一主索引。

多列主索引

Teradata 允许将多个列指定为主索引。它仍然只是一个主索引,但它只是由组合多个列组成。

Teradata 多列主索引允许最多 64 个组合列组成表所需的一个主索引。

示例

在以下示例中,我们已将 First_Name 和 Last_Name 组合起来构成主索引。

这对于以下两个原因非常有用且有益:

  1. 为了在 AMP 之间获得更好的数据分布。
  2. 对于经常使用多个键一致地进行查询的用户。

使用主索引的数据分布

当用户使用主索引对表提交 SQL 请求时,该请求将变为单 AMP 操作,这是系统查找行的最直接和最有效的方式。 该过程解释如下。

完整过程在下图中说明

Teradata Primary Index

哈希过程

哈希过程在以下步骤中定义,例如

步骤 1: 在第一步中,主索引值进入哈希算法。

步骤 2: 哈希算法的输出是行哈希值。

步骤 3: 哈希映射指向行所在的特定 AMP。

步骤 4: PE 将请求直接发送到已识别的 AMP。

步骤 5: AMP 在其 vdisk 上找到行。

步骤 6: 数据通过 BYNET 发送到 PE,PE 将答案集发送到客户端应用程序。

重复的行哈希值

哈希算法最终可能为两个不同的行生成相同的行哈希值。

我们可以通过两种方式做到这一点,例如

  1. 重复的 NUPI 值: 如果使用非唯一主索引,重复的 NUPI 值将产生相同的行哈希值。
  2. 哈希同义词: 也称为哈希冲突。当哈希算法为两个不同的主索引值计算相同的行哈希值时,就会发生这种情况。

为了区分表中的每一行,将为每一行分配一个唯一的行 ID。 行 ID 是行哈希值和唯一值的组合。

行 ID = 行哈希值 + 唯一性值

唯一性值用于区分主索引值生成相同行哈希值的行。在大多数情况下,只需要行 ID 的行哈希值部分即可找到该行。

Teradata Primary Index

插入每一行时,AMP 会添加行 ID,并将其存储为行的前缀。

使用特定行哈希值插入的第一行分配一个唯一的唯一值,对于使用相同行哈希值插入的任何其他行,该值递增 1。


下一个主题Teradata 连接