概述:在分区表上创建的索引可分为全局索引和本地索引。全局索引包括全局非分区索引(Global Nonpartitioned Indexes)和全局分区索引(Global Partitioned Indexes)。

  • 全局分区索引(Global Partitioned Indexes)是指与分区表有不同分区方式的索引,它是在分区表的所有分区数据基础上创建的分区索引,目前KingbaseES 暂不支持。
  • 本地索引(本地分区索引,Local Partitioned Indexes),是指在每个表分区上单独创建的索引,是一种局部索引,也是一种分区索引,某一个索引分区只能索引到一个表分区。
  • 需要启用 enable_globalindexscan = on; 才能使用全局索引。目前只支持select 操作使用全局索引。

1、全局索引例子

create table t1_part(id1 integer,id2 integer,id3 integer)
partition by range(id1)
(
partition part01 values less than(10000),
partition part02 values less than(20000),
partition part03 values less than(30000),
partition part04 values less than(40000),
partition part05 values less than(50000),
partition part06 values less than(60000),
partition part07 values less than(70000),
partition part08 values less than(80000),
partition part09 values less than(90000),
partition part10 values less than(maxvalue)
); create unique index idx1_t1_part on t1_part(id1) global ;
create unique index idx2_t1_part on t1_part(id2) global ;
create index idx3_t1_part on t1_part(id2) global ;

注意:并不是global 就一定是全局索引。当创建全局索引时,首先尝试创建本地索引。当不满足本地索引的条件(唯一索引的索引列不包括全部分区列或者分区条件为表达式)时会创建全局索引。同样,启用分区表上的主键/唯一约束时,先尝试创建本地索引,不满足时则创建全局唯一索引。可以看到,只有第二个索引才是全局索引。

test=# \di+ idx1_t1_part
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+--------------+-------------------+--------+---------+---------+-------------
public | idx1_t1_part | partitioned index | system | t1_part | 0 bytes |
(1 row) test=# \di+ idx2_t1_part
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+--------------+--------------+--------+---------+------------+-------------
public | idx2_t1_part | global index | system | t1_part | 8192 bytes |
(1 row) test=# \di+ idx3_t1_part
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+--------------+-------------------+--------+---------+---------+-------------
public | idx3_t1_part | partitioned index | system | t1_part | 0 bytes |
(1 row)

全局索引支持条件索引,不支持全局分区索引。全局索引不支持排他约束。

2、全局索引存在的限制

DML操作不允许针对子表 使用全局索引。

test=# delete from t1_part_part04 where id2=31111;   --使用全局索引访问子表
ERROR: cannot modify partition t1_part_part04 with global indexes, maintain the partitioned table directly

test=# select * from t1_part_part04 where id2=31111;
id1 | id2 | id3
-----+-----+-----
(0 rows)
test=# delete from t1_part where id2=31111;
DELETE 1

3、分区索引与全局索引的性能比较

继续以上的例子,插入100000 条记录:

insert into t1_part select generate_series(1,100000),generate_series(1,100000),generate_series(1,100000);

来看执行性能的差异:

test=# declare
test-# v_result integer;
test-# begin
test-# for i in 1..100000 loop
test-# select id3 into v_result from t1_part where id1=i;
test-# end loop;
test-# end;
test-# /
ANONYMOUS BLOCK
Time: 1320.094 ms (00:01.320)
test=#
test=# declare
test-# v_result integer;
test-# begin
test-# for i in 1..100000 loop
test-# select id3 into v_result from t1_part where id2=i;
test-# end loop;
test-# end;
test-# /
ANONYMOUS BLOCK
Time: 4281.198 ms (00:04.281)

比较结果分析:

1、local 索引的访问效率是 global 索引3倍左右

2、Oracle 的rowid 直接定位数据文件的数据块,而KingbaseES 的ctid 只是对象文件的第几块,因此,KingbaseES 的全局索引需要先定位该 ctid 属于哪个分区的。

3、KingbaseES 全局索引在索引值包含对象 OID,通过OID找到对应的文件,再通过ctid 访问。这必然有性能的损耗,但这是因为ctid 的结构所导致的。

4、全局索引暂时不支持index_only_scan

KingbaseES 全局索引的更多相关文章

  1. KingbaseES 全局索引是否因为DDL操作而变为Unusable ?

    前言 Oracle 在对分区做DDL操作时,会使分区全局索引失效,需要加上关键字update global indexes.KingbaseES 同样支持全局索引.那么,如果对分区表进行DDL操作,那 ...

  2. 全局索引与分区索引对于SQL性能影响的比较

    KingbaseES 提供了对于分区表 global index 的支持.global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (l ...

  3. KingbaseES 全局临时表

    Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享.KingbaseES 除了支持PG原生的临时表机制外,还支 ...

  4. ORACLE 全局索引和本地索引

    Oracle数据库中,有两种类型的分区索引,全局索引和本地索引,其中本地索引又可以分为本地前缀索引和本地非前缀索引.下面就分别看看每种类型的索引各自的特点. 全局索引以整个表的数据为对象建立索引,索引 ...

  5. Oracle 12C 新特性之表分区带 异步全局索引异步维护(一次add、truncate、drop、spilt、merge多个分区)

    实验准备:-- 创建实验表CREATE TABLE p_andy(ID number(10), NAME varchar2(40))PARTITION BY RANGE (id)(PARTITION ...

  6. [z]分区truncate操作的介绍及对全局索引和空间释放影响的案例解析

    [z]https://www.2cto.com/database/201301/181226.html 环境: [sql] [oracle@localhost ~]$ uname -r 2.6.18- ...

  7. Oracle12c中性能优化&功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

    Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效. 1.   设置 下面的例子演示带全局索引的表创建和加载数据的过程. -- ...

  8. Atitit.分区对索引的影响 分区索引和全局索引 attilax总结

    Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, ...

  9. Oracle Spatial分区应用研究之七:同等分区粒度下全局索引优于分区索引的原因分析

    1.实验结论 同等分区粒度下,使用分区空间索引进行空间查询,比使用全局空间索引进行查询,对数据字典表的访问次数更多.假设分区数为X,则大概多3X次访问.具体说明见6实验结论. 2.实验目的 在之前的测 ...

随机推荐

  1. 粗谈对ajax的理解

    ajax:Asynchronous JavaScript and XML异步JavaScript和XML技术Asynchronous:JavaScript:XMLHttpRequestXML:实现数据 ...

  2. 华为AppLinking中统一链接的创建和使用

    ​ 运营的同学近期在准备海外做一波线下投放,涉及到海外的Google Play,iOS设备的App Store,以及华为渠道的AppGallery. 其中运营希望我们能够将三个平台的下载整合到一个链接 ...

  3. Redis docker 主从模式与哨兵sentinel

    更多技术记录,请参考软件开发 | 编程 | RustFisher 为实现redis的高可用,我们采用主从模式加哨兵的方法. 一主二从三哨兵,共启动6个redis容器.本文示例在同一个服务器上进行操作. ...

  4. 8.4 苹果macOS电脑如何安装Java开发环境(JDK)

    和Windows电脑安装差不多. 下载 来到JDK官方下载界面,点击Java SE 8(简称JDK 8)后面的JDK下载,来到该界面,先同意协议,然后下载对应平台的JDK,我们这里下载Mac OS X ...

  5. 记一次 .NET 某新能源系统 线程疯涨 分析

    一:背景 1. 讲故事 前段时间收到一个朋友的求助,说他的程序线程数疯涨,寻求如何解决. 等我分析完之后,我觉得这个问题很有代表性,所以拿出来和大家分享下,还是上老工具 WinDbg. 二: WinD ...

  6. Thread类的常用方法_获取线程名称的方法和设置线程名称的方法

    Thread类的常用方法 获取线程的名称: 1.使用Thread类中的方法getName() String getName() 返回该线程的名称 2.可以先获取到当前正在执行的线程,使用线程中的方法g ...

  7. 记录自己NVIDIA GeForce MX250迷之安装cuda+pytorch成功了

    电脑是ubuntu20.4 Pop!_OS 20.04 LTS MX250显卡并没有列在CUDA支持的GPU里 希望文中链接的别人的博客不会消失掉. 安装了英伟达的驱动 参考了这一篇:Ubuntu 安 ...

  8. SSH 多密钥配置

    目录 前言 一.SSH 是什么 二.密钥生成工具 三.密钥类型 四.本地配置 1.单密钥配置 2.多密钥配置 五.远端配置 1.GitHub/Gitee 2.服务器 前言 当我们从 GitHub 克隆 ...

  9. centos7 ./configure --prefix error checking for C compiler

    解决方法: 输入以下命令 yum -y install gcc gcc-c++ autoconf automake make

  10. SQLZOO练习二--SELECT from Nobel Tutorial

    We continue practicing simple SQL queries on a single table. This tutorial is concerned with a table ...