分区表索引

分区表通常有巨大的数据量。为了加快查询速度,通常会使用索引功能。本文介绍了分区表的索引功能。

分区表索引类型

PolarDB PostgreSQL版(兼容Oracle)支持分区上的两种索引类型:

本地索引

在分区表本地索引(Local Index)中,本地索引与分区表的分区一一对应,具有与其表相同的分区数和相同的分区范围。每个索引分区都与基础表的一个分区相关联,因此索引分区中的所有键仅引用单个表分区中存储的行。 因此数据库会自动将索引分区与其关联的表分区同步,从而使每个表索引相互独立。

本地索引通过指定LOCAL属性创建。 在与基础表相同的列上对索引进行分区,创建相同数量的分区或子分区,并为它们提供与基础表的相应分区相同的分区范围。

当基础表中的分区被添加、删除、合并或拆分时,或者当散列分区或子分区被添加或合并时, PolarDB PostgreSQL版(兼容Oracle)会自动维护索引分区。

如果分区列构成索引列的子集,则可以创建UNIQUE本地索引,从而保证具有相同索引键的行始终映射到同一分区。

全局索引

全局索引(Global Index)是一种B树索引,它也可以被分区,其分区独立于创建它的基础表。

不同于本地索引中索引分区和表分区一一对应的关系,全局索引分区可以指向所有表分区。全局索引也可以被分区,它的分区键必须是索引键的前缀。

说明

全局索引是分区表所特有的,具体请参见全局索引

语法说明

创建本地索引

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]
    ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
    [ INCLUDE ( column_name [, ...] ) ]
    [ WITH ( storage_parameter [= value] [, ... ] ) ]
    [ TABLESPACE tablespace_name ]
    [ WHERE predicate ]

创建全局索引

CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name
    ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] ) GLOBAL 
    [ WITH ( storage_parameter [= value] [, ... ] ) ]
    [ TABLESPACE tablespace_name ]

示例

创建本地索引

在表films的title列上创建本地索引title_idx:

CREATE UNIQUE INDEX title_idx ON films (title);

创建全局索引

在表films的title列上创建全局索引title_idx:

CREATE UNIQUE INDEX title_idx ON films (title) global;