- Teradata数据分布和访问
- 索引
通常,Teradata数据库使用索引来:
•分布数据行。
•定位数据行。
•提高性能。
索引访问通常比搜索表的所有行更有效。
•确保索引值的唯一性。
表中只有一行可以在一列或多列中具有定义为唯一索引的特定值。
Teradata数据库支持以下类型的索引:
•主键索引
•分区主索引
•二级
•join
•哈希
•参考完整性的特殊索引
- 主键索引
索引类型 | |
Unique Primary Index | PI是一列或多列,没有重复值 |
Non-Unique Primary Index | PI是可能具有重复值的一列或多列 |
No Primary Index | 没有PI列,并且不基于任何列值对行进行哈希 |
唯一主索引(UPI)确保表行的均匀分布。
非唯一主索引(NUPI)可能导致数据分布不均匀。虽然唯一性不能保证数据行的统一分布,但索引的唯一性程度将决定行的分配,因为具有相同PI值的所有行都分布到相同的AMP,频繁重复的不同值的数量不能成为良好的PI候选。
获取表中数据的最有效的访问方法是通过PI。因此,选择PI应考虑以下设计目标:选择能够提供良好数据分布的跨AMP的PI,同时要考虑表的最频繁的访问方式
如果在创建表时未显式指定主索引,Teradata数据库将使用第一个列作为默认的非唯一主索引。也可以在没有主索引的情况下显式创建用户表。这些NoPI表用于特殊目的。NoPI表通常用作临时表,以允许更快的数据加载。
主键
主键(PK),一个来自数据建模的术语,定义了一个或多个列标识表中的行。因为用于标识,所以PK不能为空。一定有什么特殊数据能够唯一标识它的一列或多列。此外,不应更改PK值。历史的如果PK被更改或重新使用,信息以及与其他表的关系可能会丢失。
PK是一个逻辑关系数据库概念。它可能是或可能不是最佳的列表的PI。
外键
外键(FK)标识表关系。它们对跨表的数据值之间的关系进行建模。关系数据库,如Teradata数据库,允许数据值跨多个表关联。因此,表可能具有的每个FK必须作为PK存在于某个位置。也就是说,FK和PK之间必须具有引用完整性。
- 二级索引
辅助索引(SI)允许通过备用路径访问表中的信息,并可以改进通过避免全表扫描来提高性能。尽管SI增加了表开销,但在磁盘空间和维护方面,可以根据需要删除并重新创建SI。
二级索引:
•不影响跨AMP的行分布。
•可以是唯一的或非唯一的。
•可为复杂数据类型(如地理空间数据)创建。
•当索引可以提高查询性能时,Optimizer使用。
•可用于NoPI表格。
- Join index
联接索引(JI)是包含一个或多个基表中的列的索引结构。
当所有引用的列都存储在索引中时,可以通过只检查JI来满足某些查询。据说联合执行涵盖了这些问题。其他查询可以使用JI限定几行,然后引用基表以获得未存储在JI中的请求列。这种查询据说被索引部分覆盖。
因为Teradata数据库支持多任务、部分覆盖JI,所以除了聚合JI之外,所有类型的JI都可以连接到其基表,以检索查询引用但未存储在JI中的列。可以为常用的聚合查询定义聚合JI。
与SI非常类似,JI对插入和删除操作以及更新操作施加额外的处理,这些操作会更改JI中存储的列的值。性能权衡考虑因素与SI类似。
单表join index
联接索引与基表相似,因为它们支持主键索引,可以用于直接访问一行或几行。
单个表JI是一种索引结构,它只包含单个表中的行。Teradata数据库用户发现这种类型的结构非常有用,因为它提供了一种直接访问数据的替代方法(主索引)。
多表join index
当查询频繁请求特定联接时,使用多任务JI预先定义联接可能是有益的。优化器可以使用预定义的联接,而不是重复执行相同的联接。
聚集join index
聚合操作从表的几行中的单个列值计算单个值。从列值集合求和和、平均值是聚合操作的示例。如果经常对同一列执行相同的聚合操作,聚合JI可以提供更好的查询性能,因为Teradata数据库可以使用聚合索引来满足查询,而不是为每个查询重复聚合计算。可以在一个或多个表上定义聚合JI。
稀疏join index
索引包括一个或多个表的列的子集。通常,索引包括表中所有行的列值。稀疏联接索引进一步限制索引仅包含表的子集行,以及表列的子集。稀疏JI可以包括一个或多个表,也可以是聚合JI。
如果查询经常限于表的行的子集,例如,一列中具有特定值的行,则仅包含这些行的稀疏JI可以通过提供更有限的待查询数据集来提高性能。
- 分区表
分区将相关数据组存储在物理位置附近,以提高可能需要该数据的查询的性能。为了满足查询,Teradata数据库可以使用一种称为“分区消除”的优化,将数据搜索限制为仅包含与查询相关的数据的分区。
行分区表根据用户定义的分区表达式将行分配给AMP中的特定分区,该表达式定义了应如何对行进行分组以进行存储(水平分区)。分区表达式是在创建或更改表时定义的。
基于分区表达式的值,将行分区表的行分配给适当的分区。
没有主索引的表也可以按列进行分区(垂直分区)。行分区允许基于分区表达式将行集合存储在单独的分区中,而列分区允许将列集合(仅包括单个列)存储在单独分区中。与行分区一样,列分区可以通过允许分区消除来提高某些类型查询的性能,从而在处理该查询期间仅搜索与特定查询相关的列数据。
- 多级分区表
通过使用多级分区,表或联接索引可以是列分区的、行分区的或两者兼有。多级分区允许对每个分区进行子分区。每个级别必须定义至少两个分区。
- 哈希
Teradata数据库使用哈希将带有PI的表的数据分发到磁盘存储,并使用索引访问数据。
由于Teradata数据库的体系结构是大规模并行的,因此需要一种高效的数据分发和检索方法。这种有效的方法是散列。几乎所有Teradata数据库索引基于(或部分基于)行哈希值而不是表列值。
对于PI,Teradata数据库通过散列PI列的值来获得行散列。行哈希和序列号(分配用于区分表中具有相同行哈希的行)统称为行标识符,并唯一标识表中的每一行。在分区表的情况下,分区标识符也是行标识符的一部分。
对于SI,Teradata数据库使用SI列值的哈希值计算哈希值。当在SQL中指定SI值时,此值用于访问。SI子表记录SI的哈希值、索引列的实际值(用于同义词解析)以及被索引表的主索引行标识符列表。
- 标识列
标识列是表中每一行都具有唯一值的列。因为这些值赋予每一行唯一性,所以系统可以使用这些值来标识表中的每一行。当列定义为标识列时,Teradata数据库会自动为添加到表中的每一行中的列生成唯一的数值。
标识列可用于为UPI、USI和主键列生成唯一值。然而,从经常查询的列的组合中创建UPI比将标识列添加到表中以实现此功能更好。
- 规范化
规范化是将复杂的数据库模式简化为简单、稳定的模式的过程。通常,此过程涉及从概念数据模型中删除冗余属性、键和关系。
- 参考完整性
传统的引用完整性是表之间关系的概念,基于主键和外键的定义。该概念指出,如果引用列中不存在相等的值,则引用列的值(非空)表中不能存在行。
使用引用完整性,可以指定引用表中的列,这些列是其他引用表中列的外键。必须将引用列定义为主键列或唯一列。
引用完整性是一种可靠的机制,可防止在执行插入、合并、更新和删除时发生意外的数据库不一致。