📅  最后修改于: 2020-11-29 09:07:36             🧑  作者: Mango
分区主索引(PPI)是一种索引机制,可用于提高某些查询的性能。当将行插入表中时,它们将存储在AMP中并按行哈希顺序排列。当使用PPI定义表时,行按其分区号排序。在每个分区内,它们按行哈希进行排列。根据定义的分区表达式将行分配给分区。
避免对某些查询进行全表扫描。
避免使用需要额外物理结构和额外I / O维护的二级索引。
快速访问大表的子集。
快速删除旧数据并添加新数据。
考虑以下订单表,其中主序号位于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中,并根据其行哈希进行排序。
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列进行分区。每天会有一个单独的分区。