📅  最后修改于: 2021-01-11 11:25:38             🧑  作者: Mango
主索引用于指定数据在Teradata中的位置。它用于确定哪个AMP获取数据行。
在Teradata中,每个表都必须定义一个主索引。如果未定义主索引,则Teradata会自动分配主索引。
主索引提供了访问数据的最快方法。一个主数据库最多可以有64列。主索引是在创建表时定义的,不能更改或修改。
主索引是以下方面的最优选和必要的索引:
以下是主索引的一些特定规则,例如:
规则1:每个表一个主索引。
规则2:主索引值可以是唯一或不唯一的。
规则3:主索引值可以为NULL。
规则4:不能修改已填充表的主索引。
规则5:主索引值可以修改。
规则6:主索引限制为64列。
主索引有两种类型。
在“唯一主索引”表中,该列不应有任何重复的值。如果插入任何重复的值,它们将被拒绝。 Unique Primary索引强制列的唯一性。
唯一主索引(UPI)始终会在AMP之间平均分配表的行。 UPI访问始终是单安培操作。
如何创建唯一主索引?
在下面的示例中,我们使用Roll_no,First_name和Last_name列创建Student表。
Roll_no | First_name | Last_name |
---|---|---|
1001 | Mike | Richard |
1002 | Robert | Williams |
1003 | Peter | Collin |
1004 | Alexa | Stuart |
1005 | Robert | Peterson |
我们选择了Roll_no作为我们的主要索引。由于我们已将Roll_no指定为唯一的主要索引,因此表中不会有重复的学生编号。
CREATE SET TABLE Student
(
Roll_no int,
First_name varchar2(10),
Last_name varchar2(10),
)
UNIQUE PRIMARY INDEX(Roll_no);
非唯一主索引(NUPI)表示所选列的值可以是非唯一的。
非唯一主索引永远不会均匀分布表行。如果数据分布不均,则All-AMP操作将花费更长的时间。
我们可能会选择UPI而不是UPI,因为NUPI列对于查询访问和联接可能更有用。
如何创建非唯一主索引?
在下面的示例中,我们创建带有雇员名,名称,部门和城市列的雇员表。
Employee_Id | Name | Department | City |
---|---|---|---|
202001 | Max | Sales | London |
202002 | Erika | Finance | Washington |
202003 | Nancy | Management | Paris |
202004 | Bella | Human Recourse | London |
202005 | Sam | Marketing | London |
每个员工都有不同的员工ID,姓名和部门,但是此表中有许多员工属于同一城市。因此,我们选择了城市作为我们的非唯一主要指数。
CREATE SET TABLE Employee
(
Employee_Id int,
Name varchar2 (10),
Department varchar2 (10),
)
PRIMARY INDEX(City);
Teradata允许将多个列指定为主索引。它仍然只是一个主索引,但仅由多个列的组合组成。
Teradata多列主索引最多允许64个组合列构成一个表所需的一个主索引。
例
在下面的示例中,我们指定了First_Name和Last_Name进行组合以组成主索引。
这是非常有用和有益的,有两个原因:
当用户使用主索引向表提交SQL请求时,该请求将成为单AMP操作,这是系统查找行的最直接,最有效的方法。下面说明该过程。
下图说明了完整的过程:
哈希的过程在以下步骤中定义,例如:
步骤1:第一步,主要索引值进入哈希算法。
步骤2:哈希算法的输出是行哈希值。
步骤3:哈希映射指向该行所在的特定AMP。
步骤4: PE将请求直接发送到已识别的AMP。
步骤5: AMP在其虚拟磁盘上找到该行。
步骤6:数据通过BYNET发送到PE,PE将答案集发送到客户端应用程序。
对于两个不同的行,哈希算法可以以相同的行哈希值结束。
我们可以通过两种方式做到这一点,例如:
为了区分表中的每一行,为每一行分配了唯一的行ID。行ID是行哈希值和唯一值的组合。
唯一性值用于区分主索引值生成相同行哈希值的行。在大多数情况下,仅需要使用行ID的行哈希值部分来定位行。
插入每行时,AMP会添加行ID,并存储为行的前缀。
为插入了特定行哈希值的第一行分配一个唯一值,对于任何插入有相同行哈希值的其他行,该唯一值将增加1。