Global和Local分区索引介绍
关键字:
Global分区索引,Local分区索引、人大金仓、KingbaseES
概述
索引可以分为分区索引和非分区索引,而分区索引中常见的有本地(local)分区索引和全局(global)分区索引。
- Local分区索引:是指在每个表分区上单独创建的索引,是一种局部索引,也是一种分区索引。一个表分区只能对应一个索引分区,这个是目前KingbaseES V9支持的类型,后续提到的本地索引都是指该类型索引。
Local分区索引可以分为前缀索引和非前缀索引,前缀索引时包含了分区键值,并将其作为引导列的索引。无前缀本地分区索引就是没有将分区键的列作为索引的前导列的索引。
- Global分区索引:全局索引按照索引键分区,一个索引分区可以索引到一个或多个表分区。
2 Global和Local分区索引创建
2.1语法
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON [ ONLY ]
table_name [ USING method ]
( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC |
DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ INCLUDE ( column_name [, ...] ) ] [GLOBAL | LOCAL]
[ WITH ( storage_parameter = value [, ... ] ) ]
[ TABLESPACE tablespace_name ]
[ UNUSABLE | USABLE ]
[ COMMENT 'String' ]
[ WHERE predicate ]
2.2 说明
GLOBAL:当指定GLOBAL时创建全局索引,同时指定ONLY和GLOBAL时后者生效。
LOCAL:当指定LOCAL时创建本地索引。对于分区表而言,当不指定GLOBAL或者LOCAL时默认创建本地索引。对于非分区表而言,指定GLOBAL/LOCAL行为没有差别。
LOCAL INDEX说明:
- 本地(local)索引一定是分区索引,分区键和表的分区键相同,分区数量也是一致的。即本地索引的分区机制和表分区机制一样。
- 在本地(local)索引中,以分区键作为索引列,则成为前缀局部索引。而不是以分区键作为索引列,则成为无前缀本地索引。
- 在KES V9的语法树中,表空间位于GLOBAL/LOCAL分区索引关键字后。
本地(local)索引只支持单个分区,每个分区索引指向一个表分区。而全局索引是一个分区索引可以指向多个表分区,一个表分区也可以指向n个全局索引分区。
GLOBAL INDEX说明:
- 全局索引的分区键和分区数量与表都可能不相同,表和全局索引的分区机制不同。
- 全局索引包含分区全局索引和非分区全局索引,当前仅支持非分区全局索引。
- 全局分区索引必须是前缀索引。
3举例
3.1 LOCAL分区索引
1.创建local分区索引:
CREATE TABLE orders(
order_id NUMBER,
customer_id NUMBER,
order_date DATE,
product_id NUMBER,
quantity NUMBER
)
PARTITION BY RANGE (order_date)(
PARTITION partition_jan VALUES LESS THAN (TO_DATE('2023-02-01','YYYY-MM-DD')),
PARTITION partition_feb VALUES LESS THAN (TO_DATE('2023-03-01','YYYY-MM-DD'))
);
--order_date是分区键,所以下面语句创建的是有前缀的本地索引
CREATE INDEX idx_order_date on orders(order_date) LOCAL;
--order_id不是分区键,创建的是无前缀本地索引
CREATE INDEX idx_order_id on orders(order_id) LOCAL;
上述示例中,创建了一个表名为orders的表,该表包含了订单信息。并按照order_date进行了分区,使用范围分区的方式,将订单按照日期范围进行分区。初始化创建了两个分区,分别为1月和2月的订单信息分区。然后利用CREATE INDEX语法创建了名为idx_order_date和idx_order_id的本地分区索引。
2. local分区索引在查询中的使用:
--在订单表中插入数据
INSERT INTO orders(order_id, customer_id, order_date, product_id, quantity)
VALUES(1, 1, TO_DATE('2022-01-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'),1,6);
INSERT INTO orders(order_id, customer_id, order_date, product_id, quantity)
VALUES(2, 3, TO_DATE('2023-02-28:12:14:25', 'YYYY-MM-DD hh24:mi:ss'),6,10);
INSERT INTO orders(order_id, customer_id, order_date, product_id, quantity)
VALUES(3, 2, TO_DATE('2023-02-11:12:14:25', 'YYYY-MM-DD hh24:mi:ss'),5,4);
INSERT INTO orders(order_id, customer_id, order_date, product_id, quantity)
VALUES(4, 1, TO_DATE('2023-02-01:12:14:25', 'YYYY-MM-DD hh24:mi:ss'),1,1);
INSERT INTO orders(order_id, customer_id, order_date, product_id, quantity)
VALUES(5, 4, TO_DATE('2023-02-15:12:15:25', 'YYYY-MM-DD hh24:mi:ss'),4,3);
INSERT INTO orders(order_id, customer_id, order_date, product_id, quantity)
VALUES(6, 5, TO_DATE('2023-1-21:12:14:25', 'YYYY-MM-DD hh24:mi:ss'),2,5);
set autotrace on;
--使用本地索引
select order_id, order_date, quantity from orders where order_id = 5;
查询过程中使用本地索引:
在对应表空间中创建local分区索引
create tablespace hisdb_space location '/home/zqxiao/KES_server/data';
CREATE TABLE test
(
city_id INT not null,
LOGDATE DATE NOT NULL,
PEAKTEMP INT,
UNITSALES INT
)
PARTITION BY RANGE (city_id)
(
PARTITION test_abc1 VALUES LESS THAN (10),
PARTITION test_abc2 VALUES LESS THAN (20)
)tablespace hisdb_space;
CREATE INDEX TEST_ABC_idx2 ON TEST(city_id) LOCAL TABLESPACE hisdb_space ;
GLOBAL分区索引
1.全局非分区索引创建
CREATE TABLE orders(
order_id number,
part_id varchar(20),
order_date DATE
)
PARTITION BY RANGE(order_date)
(
PARTITION Q1 VALUES LESS THAN (TO_DATE('2023-01-01','YYYY-MM-DD')),
PARTITION Q2 VALUES LESS THAN (TO_DATE('2023-02-01','YYYY-MM-DD')),
PARTITION Q3 VALUES LESS THAN (TO_DATE('2023-03-01','YYYY-MM-DD')),
PARTITION Q4 VALUES LESS THAN (TO_DATE('2023-04-01','YYYY-MM-DD')),
PARTITION Q5 VALUES LESS THAN (TO_DATE('2023-05-01','YYYY-MM-DD'))
);
CREATE INDEX order_idx1 on orders(order_date) GLOBAL;
上述索引和非分区的普通索引类似。




