Teradata 分区主索引
分区主索引 (PPI) 是一种索引机制,可用于提高某些查询的性能。当行插入到表中时,它们存储在 AMP 中并按行散列顺序排列。使用 PPI 定义表时,行按其分区号排序。在每个分区内,它们按行哈希排列。根据定义的分区表达式将行分配给分区。
优势
避免对某些查询进行全表扫描。
避免使用需要额外物理结构和额外 I/O 维护的二级索引。
快速访问大表的子集。
快速删除旧数据并添加新数据。
示例
考虑以下 Orders 表,其中 OrderNo 上有主索引。
StoreNo |
OrderNo |
OrderDate |
OrderTotal |
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
RowHash |
OrderNo |
OrderDate |
1 |
7505 |
2015-10-03 |
2 |
7504 |
2015-10-03 |
3 |
7501 |
2015-10-01 |
4 |
7508 |
2015-10-05 |
AMP 2
RowHash |
OrderNo |
OrderDate |
1 |
7507 |
2015-10-05 |
2 |
7502 |
2015-10-02 |
3 |
7506 |
2015-10-04 |
4 |
7503 |
2015-10-02 |
如果您运行查询来提取特定日期的订单,那么优化器可能会选择使用全表扫描,然后可以访问 AMP 中的所有记录。为避免这种情况,您可以将订单日期定义为分区主索引。当行插入到订单表中时,它们按订单日期进行分区。在每个分区内,它们将按行哈希排序。
以下数据显示记录将如何存储在 AMP 中(如果它们按订单日期进行分区)。如果运行查询以按订单日期访问记录,则只会访问包含该特定订单记录的分区。
AMP 1
分区 |
RowHash |
OrderNo |
订单日期 |
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
分区 |
RowHash |
OrderNo |
OrderDate |
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 列分区的。每天会有一个单独的分区。