Teradata 分区主索引2024 年 8 月 29 日 | 5 分钟阅读 分区主索引 (PPI) 是 Teradata 的一项强大功能,它允许用户访问表的一部分,而不是访问整个表。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 个字节,因此会增加 perm 空间。
- 将 PPI 表与非分区表连接需要很长时间。
- 访问 PPI 列以外的其他列需要更多时间。
PPI 的类型有四种类型的分区主索引 - Case 分区
- 基于范围的分区
- 多级分区
- 基于字符的分区
示例考虑以下以 OrderNo 为主索引的 Orders 表。 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 中,并根据其行哈希排序。 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 |
AMP 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 中。如果运行查询以按订单日期访问记录,则只会获得包含该特定订单记录的分区。 AMP 1 分区 | 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 |
AMP 2 分区 | 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 子句用于定义分区。 在上面的例子中,表按 OrderDate 列进行分区。每天将有一个单独的分区。
|