Teradata 分区主索引

2024 年 8 月 29 日 | 5 分钟阅读

分区主索引 (PPI) 是 Teradata 的一项强大功能,它允许用户访问表的一部分,而不是访问整个表。PPI 是一种索引机制,有助于提高特定查询的性能。PPI 的工作原理与主索引的数据分布相同,但根据表中指定的范围或情况创建分区。

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

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

在每个分区中,它们按其行哈希排列。行根据定义的分区表达式分配到分区。以下是 PPI 的几个重要点,例如

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

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

顺便说一句,其他数据库系统,如 Netezza,则反其道而行之,存储有关未存储请求行的数据块的信息。Netezza 将这种方法称为“数据跳过”。

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

PPI 的特征

以下是分区主索引的一些特征,例如

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

PPI 的优点

以下是分区主索引的优点

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

缺点

分区主索引也有以下缺点,例如

  • 如果分区列不是主索引列的一部分,则分区可能会使单行或主索引访问表的速度变慢。
  • 每行添加额外的 2 个字节,因此会增加 perm 空间。
  • 将 PPI 表与非分区表连接需要很长时间。
  • 访问 PPI 列以外的其他列需要更多时间。

PPI 的类型

有四种类型的分区主索引

  1. Case 分区
  2. 基于范围的分区
  3. 多级分区
  4. 基于字符的分区

示例

考虑以下以 OrderNo 为主索引的 Orders 表。

StoreNoOrderNoOrderDateOrderTotal
2001752017-11-02900
2001992017-12-101,200
2002772017-06-093,000
2002182017-09-052,454
2001712017-11-031201
2003702017-18-042,454
2001802017-10-081201
2001652017-15-051201

假设记录分布在 AMP 之间,如下表所示。记录存储在 AMP 中,并根据其行哈希排序。

AMP 1

RowHashOrderNoOrderDate
1712017-11-03
2182017-09-05
3752017-11-02
4652017-15-05

AMP 2

RowHashOrderNoOrderDate
1802017-10-08
2992017-12-10
3702017-18-04
4772017-06-09

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

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

AMP 1

分区RowHashOrderNoOrderDate
03752017-11-02
11712017-11-03
12182017-09-05
24652017-15-05

AMP 2

分区RowHashOrderNoOrderDate
02992017-12-10
04772017-06-09
13702017-18-04
21802017-10-08

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

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