📅  最后修改于: 2021-01-11 11:36:26             🧑  作者: Mango
Teradata数据库表从不需要二级索引,但是二级索引通常可以提高系统性能。
次要索引(SI)是备用数据访问路径。它允许访问数据而无需执行全表扫描。
可以使用CREATE TABLE和CREATE INDEX语句显式创建二级索引。 Teradata数据库可以隐式创建唯一的二级索引。
例如,当我们使用指定主索引的CREATE TABLE语句时,Teradata数据库在我们使用PRIMARY KEY或UNIQUE约束指定的列集上隐式创建唯一的二级索引。
次要索引存储在单独的子表中,这些子表需要额外的磁盘空间和维护,系统会自动对其进行处理。这些表是所有AMP内置的。
这些子表包含索引行,因此我们需要添加另一组需要每次更新的行。
每当使用FALLBACK定义表时,辅助索引子表也会被复制。次要索引不参与数据分发。
二级索引子表的目的是通过行ID返回基表中的实际行。
以下是二级索引的一些基本规则:
规则1:二级索引是可选的。
规则2:次要索引值可以是唯一的或不唯一的。
规则3:次要索引值可以为NULL。
规则4:二级索引值可以修改。
规则5:二级索引可以更改。
规则6:二级索引的上限为64列。
Teradata中有两种类型的二级索引:
唯一二级索引允许为定义为USI的列提供唯一值。
唯一二级索引(USI)有两个目的。
创建USI后,Teradata将立即在每个AMP上构建二级索引子表。
然后,每个AMP将散列基表中每个行的二级索引值。
句法
以下是创建唯一二级索引的语法:
CREATE UNIQUE INDEX (Column/Columns) ON;
例
首先使用以下记录创建一个Employee表,例如:
Emp_Id | First_Name | Last_Name | Department_No |
---|---|---|---|
202001 | Mike | Richard | 1 |
202002 | Robert | Williams | 2 |
202003 | Peter | Collin | 2 |
202004 | Alexa | Stuart | 1 |
202005 | Robert | Peterson | 1 |
以下示例在employee表的Emp_Id列上创建USI。
CREATE UNIQUE INDEX(Emp_Id) on Employee;
Emp_Id哈希的输出将使用哈希映射来指向特定的AMP,并且该AMP将保留二级索引值的二级索引子表行。
这意味着子表行将保存基表行ID,然后Teradata将立即找到基表行。
非唯一二级索引(NUSI)允许为定义为NUSI的列提供重复值。
通常指定非唯一二级索引以防止进行全表扫描,在该扫描中将读取表的每一行。
USI始终是双安培操作,因此它几乎与主索引一样快,但是NUSI是全安培操作,而不是全表扫描。
创建NUSI后,Teradata将立即在每个AMP上构建二级索引子表。
每个AMP将仅在基表中保留其行的辅助索引值。一个表上最多可以有32个二级索引。
句法
以下是创建非唯一二级索引的通用语法:
CREATE INDEX (Column/Columns) ON;
例
以下示例在employee表的First_Name列上创建NUSI。
CREATE INDEX(First_Name) on Employee;
在上面的示例中,每个AMP都在其AMP的基本表(AMP本地)中保存了所有雇员行的名称列。
每个AMP本地名称都将具有基本表行ID(指针),因此AMP可以根据需要快速检索它。
如果AMP包含重复的名字,则仅使用多个基本行ID来构建该名字的一个子表行。