📜  Teradata分区主索引

📅  最后修改于: 2021-01-11 11:35:29             🧑  作者: Mango

Teradata分区主索引

分区主索引(PPI)是Teradata的强大功能之一,它允许用户访问表的一部分而不是全部表的访问。 PPI是一种索引机制,可用于提高特定查询的性能。 PPI与数据分配的主索引相同,但是PPI根据表中指定的范围或大小写创建分区。

分区主索引(PPI)允许将行分配给AMP上的用户定义的数据分区,从而为基于主索引值的范围查询提供增强的性能。

当将行插入表中时,它们将存储在AMP中,并按其行哈希顺序排列。当使用PPI定义表时,行将按其分区号排序。

在每个分区内,它们按行哈希进行排列。根据定义的分区表达式将行分配给分区。以下是PPI的以下重要方面,例如:

  • 当我们提交指定范围约束的查询时,PPI用于提高大型表的性能。
  • PPI允许通过使用分区消除来减少要处理的行数。
  • 当使用具有范围约束的大型表时,PPI将提高增量数据加载,删除和数据访问的性能

通常将查询的行存储在分区中,这样我们就可以将数据检索限制为包含SQL语句所需的行的那些分区。不读取未提供请求的行的其他分区。

顺便提一句,其他数据库系统(例如Netezza)通过存储有关未存储请求的行的数据块的信息来进行相反的处理。 Netezza将此方法称为“数据跳过”。

分区将无助于避免表扫描,但会减少每个AMP必须移动到其本地内存(FSG缓存)的数据块数量,因为仅需要访问相关的分区。

PPI的特征

这是分区主索引的一些特征,例如:

  • 可以在易失性,全局临时和永久表上进行分区。
  • 分区列不必是非唯一主索引的一部分。
  • 分区列必须是唯一主索引的一部分。
  • 分区列将不会决定应去往哪个AMP数据,而取决于主索引。
  • AMP中的行将按分区列而不是按行ID排序。
  • PPI可以在多个级别上定义。
  • Teradata使用分区消除策略来避免对分区表进行全表扫描(FTS)。
  • 分区表可以通过减少要处理的行数来减少范围查询的输入。
  • 可以从dbc.PartitioningConstraintsV视图中检索有关分区,约束和条件的详细信息。

PPI的优势

以下是分区主索引的优点:

  • 这样可以避免对特定查询进行全表扫描。
  • PPI不使用需要额外物理结构和其他输入维护的二级索引。
  • 它可以快速访问大表的子集。
  • PPI快速删除旧数据并添加新数据。
  • 可以在全局临时表,易失表和非压缩联接索引上创建它。
  • 对于基于范围的查询,我们可以删除SI并使用PPI,这将减少开销SI子表的空间。

缺点

分区主索引还具有以下缺点,例如:

  • 如果分区列不属于主索引列,则分区可能会使对表的单行或主索引访问变慢。
  • 每行增加2个字节,因此增加了烫发空间。
  • 将PPI表与未分区表连接时需要很长时间。
  • 除了PPI列之外的访问需要更多时间。

PPI的类型

分区主索引有四种类型:

  • 案例划分
  • 基于范围的分区
  • 多级分区
  • 基于字符的分区

考虑下面的订单表,其中主序号在OrderNo上。

StoreNo OrderNo OrderDate OrderTotal
2001 75 2017-11-02 900
2001 99 2017-12-10 1,200
2002 77 2017-06-09 3,000
2002 18 2017-09-05 2,454
2001 71 2017-11-03 1201
2003 70 2017-18-04 2,454
2001 80 2017-10-08 1201
2001 65 2017-15-05 1201

假定记录在AMP之间分配,如下表所示。记录的内容存储在AMP中,并根据其行哈希进行排序。

放大器1

RowHash OrderNo OrderDate
1 71 2017-11-03
2 18 2017-09-05
3 75 2017-11-02
4 65 2017-15-05

放大器2

RowHash OrderNo OrderDate
1 80 2017-10-08
2 99 2017-12-10
3 70 2017-18-04
4 77 2017-06-09

如果我们运行查询以提取特定日期的订单,那么优化器可以选择使用“全表扫描”,然后可以访问AMP中的所有记录。我们将订单日期定义为“分区主索引”以避免全表扫描。当将行插入订单表时,它们将按订单日期进行分区。在每个分区内,它们将按其行哈希进行排序。

以下数据显示如果按订单日期对记录进行分区,记录将如何存储在AMP中。如果运行查询以按“订购日期”访问记录,则只会获取包含该特定订单的记录的分区。

放大器1

Partition RowHash OrderNo OrderDate
0 3 75 2017-11-02
1 1 71 2017-11-03
1 2 18 2017-09-05
2 4 65 2017-15-05

放大器2

Partition RowHash OrderNo OrderDate
0 2 99 2017-12-10
0 4 77 2017-06-09
1 3 70 2017-18-04
2 1 80 2017-10-08

以下是使用分区主索引创建表的示例。 PARTITION BY子句用于定义分区。

CREATE SET TABLE Orders 
(
   StoreNo SMALLINT, 
   OrderNo INTEGER, 
   OrderDate DATE FORMAT 'YYYY-MM-DD', 
   OrderTotal INTEGER 
) 
PRIMARY INDEX(OrderNo) 
PARTITION BY RANGE_N  
(
   OrderDate BETWEEN DATE '2015-01-01' AND '2020-12-31' EACH INTERVAL '1' DAY
);

在上面的示例中,该表按OrderDate列进行分区。每天会有一个单独的分区。