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中,基于它们的行哈希排序。
RowHash | 订单号 | 订购日期 |
---|---|---|
1 | 7505 | 2015-10-03 |
2 | 7504 | 2015-10-03 |
3 | 7501 | 2015-10-01 |
4 | 7508 | 2015-10-05 |
RowHash | 订单号 | 订购日期 |
---|---|---|
1 | 7507 | 2015-10-05 |
2 | 7502 | 2015-10-02 |
3 | 7506 | 2015-10-04 |
4 | 7503 | 2015-10-02 |
如果运行查询以提取特定日期的订单,则优化程序可以选择使用全表扫描,然后可以访问AMP中的所有记录。 为了避免这种情况,您可以将订单日期定义为分区主索引。 将行插入到订单表中时,它们按订单日期进行分区。 在每个分区中,它们将按其行哈希排序。
以下数据显示如果记录按订单日期分区,则记录将如何存储在AMP中。 如果运行查询以按订单日期访问记录,则只会访问包含该特定订单的记录的分区。
划分 | RowHash | 订单号 | 订购日期 |
---|---|---|---|
0 | 3 | 7501 | 2015-10-01 |
1 | 1 | 7505 | 2015-10-03 |
1 | 2 | 7504 | 2015-10-03 |
2 | 4 | 7508 | 2015-10-05 |
划分 | RowHash | 订单号 | 订购日期 |
---|---|---|---|
0 | 2 | 7502 | 2015-10-02 |
0 | 4 | 7503 | 2015-10-02 |
1 | 3 | 7506 | 2015-10-04 |
2 | 1 | 7507 | 2015-10-05 |
以下是创建具有分区primary Index的表的示例。 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列分区。 每天将有一个单独的分区。