Teradata 简明教程
Teradata - Partitioned Primary Index
分区主索引 (PPI) 是一种索引机制,可用于提高某些查询的性能。当行插入表中时,它们会存储在 AMP 中,并按其行哈希顺序排列。当使用 PPI 定义表时,行会按其分区号排序。在每个分区内,它们会按行哈希排列。行会根据定义的分区表达式分配给分区。
Example
考虑具有订单号为主索引的如下订单表。
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 中,根据其行哈希进行排序。
**
RowHash |
OrderNo |
OrderDate |
1 |
7505 |
2015-10-03 |
2 |
7504 |
2015-10-03 |
3 |
7501 |
2015-10-01 |
4 |
7508 |
2015-10-05 |
**
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 中。如果运行一个查询以按订单日期访问记录,则只会访问包含特定订单记录的分区。
**
Partition |
RowHash |
OrderNo |
OrderDate |
0 |
3 |
7501 |
2015-10-01 |
1 |
1 |
7505 |
2015-10-03 |
1 |
2 |
7504 |
2015-10-03 |
2 |
4 |
7508 |
2015-10-05 |
**
Partition |
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 列分区。每一天将会有一个单独的分区。