Teradata - 分区主索引



分区主索引 (PPI) 是一种索引机制,可用于提高某些查询的性能。当行插入到表中时,它们存储在 AMP 中,并按其行哈希顺序排列。当表使用 PPI 定义时,行按其分区号排序。在每个分区内,它们按其行哈希排列。行根据定义的分区表达式分配到分区。

优势

  • 避免对某些查询进行全表扫描。

  • 避免使用需要额外物理结构和额外 I/O 维护的二级索引。

  • 快速访问大型表的子集。

  • 快速删除旧数据并添加新数据。

示例

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

门店编号 订单号 订单日期 订单总额
101 7501 2015-10-01 900
101 7502 2015-10-02 1,200
102 7503 2015-10-02 3,000
102 7504 2015-10-03 2,454
101 7505 2015-10-03 1201
103 7506 2015-10-04 2,454
101 7507 2015-10-05 1201
101 7508 2015-10-05 1201

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

AMP 1

行哈希 订单号 订单日期
1 7505 2015-10-03
2 7504 2015-10-03
3 7501 2015-10-01
4 7508 2015-10-05

AMP 2

行哈希 订单号 订单日期
1 7507 2015-10-05
2 7502 2015-10-02
3 7506 2015-10-04
4 7503 2015-10-02

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

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

AMP 1

分区 行哈希 订单号 订单日期
0 3 7501 2015-10-01
1 1 7505 2015-10-03
1 2 7504 2015-10-03
2 4 7508 2015-10-05

AMP 2

分区 行哈希 订单号 订单日期
0 2 7502 2015-10-02
0 4 7503 2015-10-02
1 3 7506 2015-10-04
2 1 7507 2015-10-05

以下是如何创建具有分区主索引的表的示例。使用 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 '2010-01-01' AND '2016-12-31' EACH INTERVAL '1' DAY
);

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

广告