Teradata 简明教程

Teradata - Partitioned Primary Index

分区主索引 (PPI) 是一种索引机制,可用于提高某些查询的性能。当行插入表中时,它们会存储在 AMP 中,并按其行哈希顺序排列。当使用 PPI 定义表时,行会按其分区号排序。在每个分区内,它们会按行哈希排列。行会根据定义的分区表达式分配给分区。

Advantages

  1. 避免对某些查询进行全表扫描。

  2. 避免使用需要其它物理结构和其它 I/O 维护的二级索引。

  3. 快速访问大表的子集。

  4. 快速删除旧数据并添加新数据。

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 列分区。每一天将会有一个单独的分区。