📜  Teradata二级索引

📅  最后修改于: 2021-01-11 11:36:26             🧑  作者: Mango

Teradata二级索引

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)
  • 非唯一二级指数(NUSI)

唯一二级索引(USI)

唯一二级索引允许为定义为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)允许为定义为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来构建该名字的一个子表行。