Teradata数据库调研及迁移KADB建议(三)

  • Teradata数据分布和访问
  1. 索引

通常,Teradata数据库使用索引来:

•分布数据行。

•定位数据行。

•提高性能。

索引访问通常比搜索表的所有行更有效。

•确保索引值的唯一性。

表中只有一行可以在一列或多列中具有定义为唯一索引的特定值。

Teradata数据库支持以下类型的索引:

•主键索引

•分区主索引

•二级

•join

•哈希

•参考完整性的特殊索引

  1. 主键索引

索引类型

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之间必须具有引用完整性。

  1. 二级索引

辅助索引(SI)允许通过备用路径访问表中的信息,并可以改进通过避免全表扫描来提高性能。尽管SI增加了表开销,但在磁盘空间和维护方面,可以根据需要删除并重新创建SI。

二级索引:

•不影响跨AMP的行分布。

•可以是唯一的或非唯一的。

•可为复杂数据类型(如地理空间数据)创建。

•当索引可以提高查询性能时,Optimizer使用。

•可用于NoPI表格。

  1. 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可以通过提供更有限的待查询数据集来提高性能。

  1. 分区表

分区将相关数据组存储在物理位置附近,以提高可能需要该数据的查询的性能。为了满足查询,Teradata数据库可以使用一种称为“分区消除”的优化,将数据搜索限制为仅包含与查询相关的数据的分区。

行分区表根据用户定义的分区表达式将行分配给AMP中的特定分区,该表达式定义了应如何对行进行分组以进行存储(水平分区)。分区表达式是在创建或更改表时定义的。

基于分区表达式的值,将行分区表的行分配给适当的分区。

没有主索引的表也可以按列进行分区(垂直分区)。行分区允许基于分区表达式将行集合存储在单独的分区中,而列分区允许将列集合(仅包括单个列)存储在单独分区中。与行分区一样,列分区可以通过允许分区消除来提高某些类型查询的性能,从而在处理该查询期间仅搜索与特定查询相关的列数据。

  1. 多级分区表

通过使用多级分区,表或联接索引可以是列分区的、行分区的或两者兼有。多级分区允许对每个分区进行子分区。每个级别必须定义至少两个分区。

  1. 哈希

Teradata数据库使用哈希将带有PI的表的数据分发到磁盘存储,并使用索引访问数据。

由于Teradata数据库的体系结构是大规模并行的,因此需要一种高效的数据分发和检索方法。这种有效的方法是散列。几乎所有Teradata数据库索引基于(或部分基于)行哈希值而不是表列值。

对于PI,Teradata数据库通过散列PI列的值来获得行散列。行哈希和序列号(分配用于区分表中具有相同行哈希的行)统称为行标识符,并唯一标识表中的每一行。在分区表的情况下,分区标识符也是行标识符的一部分。

对于SI,Teradata数据库使用SI列值的哈希值计算哈希值。当在SQL中指定SI值时,此值用于访问。SI子表记录SI的哈希值、索引列的实际值(用于同义词解析)以及被索引表的主索引行标识符列表。

  1. 标识列

标识列是表中每一行都具有唯一值的列。因为这些值赋予每一行唯一性,所以系统可以使用这些值来标识表中的每一行。当列定义为标识列时,Teradata数据库会自动为添加到表中的每一行中的列生成唯一的数值。

标识列可用于为UPI、USI和主键列生成唯一值。然而,从经常查询的列的组合中创建UPI比将标识列添加到表中以实现此功能更好。

  1. 规范化

规范化是将复杂的数据库模式简化为简单、稳定的模式的过程。通常,此过程涉及从概念数据模型中删除冗余属性、键和关系。

  1. 参考完整性

传统的引用完整性是表之间关系的概念,基于主键和外键的定义。该概念指出,如果引用列中不存在相等的值,则引用列的值(非空)表中不能存在行。

使用引用完整性,可以指定引用表中的列,这些列是其他引用表中列的外键。必须将引用列定义为主键列或唯一列。

引用完整性是一种可靠的机制,可防止在执行插入、合并、更新和删除时发生意外的数据库不一致。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值