📅  最后修改于: 2021-01-11 11:35:29             🧑  作者: Mango
分区主索引(PPI)是Teradata的强大功能之一,它允许用户访问表的一部分而不是全部表的访问。 PPI是一种索引机制,可用于提高特定查询的性能。 PPI与数据分配的主索引相同,但是PPI根据表中指定的范围或大小写创建分区。
分区主索引(PPI)允许将行分配给AMP上的用户定义的数据分区,从而为基于主索引值的范围查询提供增强的性能。
当将行插入表中时,它们将存储在AMP中,并按其行哈希顺序排列。当使用PPI定义表时,行将按其分区号排序。
在每个分区内,它们按行哈希进行排列。根据定义的分区表达式将行分配给分区。以下是PPI的以下重要方面,例如:
通常将查询的行存储在分区中,这样我们就可以将数据检索限制为包含SQL语句所需的行的那些分区。不读取未提供请求的行的其他分区。
顺便提一句,其他数据库系统(例如Netezza)通过存储有关未存储请求的行的数据块的信息来进行相反的处理。 Netezza将此方法称为“数据跳过”。
分区将无助于避免表扫描,但会减少每个AMP必须移动到其本地内存(FSG缓存)的数据块数量,因为仅需要访问相关的分区。
这是分区主索引的一些特征,例如:
以下是分区主索引的优点:
分区主索引还具有以下缺点,例如:
分区主索引有四种类型:
考虑下面的订单表,其中主序号在OrderNo上。
StoreNo | OrderNo | OrderDate | OrderTotal |
---|---|---|---|
2001 | 75 | 2017-11-02 | 900 |
2001 | 99 | 2017-12-10 | 1,200 |
2002 | 77 | 2017-06-09 | 3,000 |
2002 | 18 | 2017-09-05 | 2,454 |
2001 | 71 | 2017-11-03 | 1201 |
2003 | 70 | 2017-18-04 | 2,454 |
2001 | 80 | 2017-10-08 | 1201 |
2001 | 65 | 2017-15-05 | 1201 |
假定记录在AMP之间分配,如下表所示。记录的内容存储在AMP中,并根据其行哈希进行排序。
放大器1
RowHash | OrderNo | OrderDate |
---|---|---|
1 | 71 | 2017-11-03 |
2 | 18 | 2017-09-05 |
3 | 75 | 2017-11-02 |
4 | 65 | 2017-15-05 |
放大器2
RowHash | OrderNo | OrderDate |
---|---|---|
1 | 80 | 2017-10-08 |
2 | 99 | 2017-12-10 |
3 | 70 | 2017-18-04 |
4 | 77 | 2017-06-09 |
如果我们运行查询以提取特定日期的订单,那么优化器可以选择使用“全表扫描”,然后可以访问AMP中的所有记录。我们将订单日期定义为“分区主索引”以避免全表扫描。当将行插入订单表时,它们将按订单日期进行分区。在每个分区内,它们将按其行哈希进行排序。
以下数据显示如果按订单日期对记录进行分区,记录将如何存储在AMP中。如果运行查询以按“订购日期”访问记录,则只会获取包含该特定订单的记录的分区。
放大器1
Partition | RowHash | OrderNo | OrderDate |
---|---|---|---|
0 | 3 | 75 | 2017-11-02 |
1 | 1 | 71 | 2017-11-03 |
1 | 2 | 18 | 2017-09-05 |
2 | 4 | 65 | 2017-15-05 |
放大器2
Partition | RowHash | OrderNo | OrderDate |
---|---|---|---|
0 | 2 | 99 | 2017-12-10 |
0 | 4 | 77 | 2017-06-09 |
1 | 3 | 70 | 2017-18-04 |
2 | 1 | 80 | 2017-10-08 |
以下是使用分区主索引创建表的示例。 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 '2015-01-01' AND '2020-12-31' EACH INTERVAL '1' DAY
);
在上面的示例中,该表按OrderDate列进行分区。每天会有一个单独的分区。