KingbaseES 提供了对于分区表 global index 的支持。global index 不仅提供了对于唯一索引功能的改进(无需包含分区键),而且在性能上相比非global index (local index)有很大的提升(无法提供分区条件情况下)。以下举例说明二者在性能方面的差异。

1、准备数据

create table t1(id1 integer,id2 integer,name text) partition by hash(id1) partitions 200;

insert into t1 select generate_series(1,10000000),generate_series(1,10000000),repeat('a',500);

2、本地索引的性能

没有提供分区条件时

create index ind_t1_id2 on t1(id2);

test=# \di+ ind_t1_id2
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+------------+-------------------+--------+-------+---------+-------------
public | ind_t1_id2 | partitioned index | system | t1 | 0 bytes |
(1 row) test=# explain analyze select * from t1 where id2=10004;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Append (cost=0.29..1662.50 rows=200 width=512) (actual time=1.324..3.249 rows=1 loops=1)
-> Index Scan using t1_p0_id2_idx on t1_p0 (cost=0.29..8.31 rows=1 width=512) (actual time=0.054..0.055 rows=0 loops=1)
Index Cond: (id2 = 10004)
-> Index Scan using t1_p1_id2_idx on t1_p1 (cost=0.29..8.31 rows=1 width=512) (actual time=0.065..0.065 rows=0 loops=1)
Index Cond: (id2 = 10004)
......
-> Index Scan using t1_p198_id2_idx on t1_p198 (cost=0.29..8.31 rows=1 width=512) (actual time=0.031..0.031 rows=0 loops=1)
Index Cond: (id2 = 10004)
-> Index Scan using t1_p199_id2_idx on t1_p199 (cost=0.29..8.31 rows=1 width=512) (actual time=0.025..0.025 rows=0 loops=1)
Index Cond: (id2 = 10004)
Planning Time: 39.262 ms
Execution Time: 5.673 ms
(403 rows)

使用非全局索引,并且没有提供分区条件情况下,优化器需要读取所有索引分区及表分区的统计数据,才能确定最优的执行计划。对于数据访问,同样需要访问所有分区的索引(即使该分区没有所需要的数据)。

提供分区条件时

test=# explain analyze select * from t1 where id2=10004 and id1=10004;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
Index Scan using t1_p71_id2_idx on t1_p71 (cost=0.29..8.31 rows=1 width=512) (actual time=0.045..0.046 rows=1 loops=1)
Index Cond: (id2 = 10004)
Filter: (id1 = 10004)
Planning Time: 0.346 ms
Execution Time: 0.064 ms
(5 rows)

在提供分区条件情况下,只需要访问单个索引分区及表分区的统计数据,因此,所需的语句的解析时间更少。

3、全局索引的性能

create unique index ind_t1_id2 on t1(id2) global;

test=# \di+ ind_t1_id2
List of relations
Schema | Name | Type | Owner | Table | Size | Description
--------+------------+--------------+--------+-------+--------+-------------
public | ind_t1_id2 | global index | system | t1 | 215 MB |
(1 row) test=# explain analyze select * from t1 where id2=10004;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Global Index Scan using ind_t1_id2 on t1 (cost=0.38..8.39 rows=200 width=512) (actual time=0.136..0.137 rows=1 loops=1)
Index Cond: (id2 = 10004)
Planning Time: 9.896 ms
Execution Time: 0.264 ms
(4 rows)

  

可以SQL 解析与执行时间都比本地索引的情景快很多。

全局索引与分区索引对于SQL性能影响的比较的更多相关文章

  1. oralce索引和分区索引的使用

    oracle分区表和分区索引的本质就是将数据分段存储,包括表和索引(索引从本质上来讲也是表),表分区会将表分成多个段分别存储.由此数据查询过程改变为先根据查询条件定位分区表,然后从该表中查询数据,从而 ...

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

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

  3. SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

    说说复合索引 写索引的博客太多了,一直不想动手写,有一下两个原因:一是觉得有炒剩饭的嫌疑,有兄弟曾说:索引吗,只要在查询条件上建索引就行了,真的可以这么暴力吗?二来觉得,索引是个非常大的话题,很难概括 ...

  4. Oracle 分区表的索引、分区索引

    对于分区表,可以建立不分区索引.也就是说表分区,但是索引不分区.以下着重介绍分区表的分区索引. 索引与表一样,也可以分区.索引分为两类:locally partition index(局部分区索引). ...

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

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

  6. Oracle非分区索引,全局分区索引和本地分区索引。

    1.如果按照索引是否分区作为划分依据,Oracle 的索引类型可以分为非分区索引,全局分区索引和本地分区索引. 2.创建演示实例 --创建非分区表create table test_partition ...

  7. PLSQL_Oracle分区表和相应的分区索引管理和使用(案例)

    2014-08-22 Created By BaoXinjian

  8. 深入学习Oracle分区表及分区索引

    关于分区表和分区索引(About Partitioned Tables and Indexes)对于10gR2而言,基本上可以分成几类: •       Range(范围)分区 •       Has ...

  9. oracle 分区表和分区索引

    很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...

随机推荐

  1. Error: $injector:modulerr Module Error

    Failed to instantiate module app due to://实例化失败 Error: [$injector:modulerr] http://errors.angularjs. ...

  2. List集合五种遍历方式

    一.使用Iterator接口遍历 二.普通for循环遍历 三.增强for循环遍历 四.List集合自带迭代器 五.Lambda(JDK8新增特性) //使用多态方式创建对象 List<Strin ...

  3. Codeforces Round #783 (Div. 2)

    A. Direction Change 题意 从(1,1)点出发到(n,m),每次可以向上下左右四个方向移动,但是不能与上次移动方向相同 最少要移动多少不,如果不能到达输出 -1 思路 假设n< ...

  4. shell脚本处理二进制数据

    正确处理二进制数据 正确处理二进制数据必须保证以下三个环节是二进制安全(Binary Safe)的: 从文件读取至内存: 处理数据过程中: 内存写入至文件. 那么二进制安全是什么?通俗来说就是不会特殊 ...

  5. TMS320F280049 ADC 模块学习

    1. 功能概述 2. 总体框图 block diagram 3.  可配置内容灵活分配到各个模块 或 某次转换中 4.  时钟配置 ADC 模块直接分频于系统最高时钟 5.  SOC 机制 6.  如 ...

  6. 如何在CentOS上找出逐渐耗尽磁盘空间的目录和文件

    起因 随着系统运行,CentOS空间不断减少,对此非常焦虑,到底磁盘空间被哪些新增文件占用了呢? 分析过程,主要使用du命令,逐层找出消耗空间的目录 1.在根目录下检索一下文件的占用情况,执行du命令 ...

  7. 第四天python3 python解析式-生成器-迭代器

    标准库datetime datetime模块  对日期.时间.时间戳的处理 datetime类 类方法: today() 返回本地时区当前时间的datetime对象: now(tz=None) 返回当 ...

  8. python 常用的魔法函数

    简介 在实际项目中,我们其实并不会太多的使用魔法函数,但是一些方法或者函数均是有魔法函数演变而来的,且在一些面试过程中会遇到一些关于常见方法的实现,就会牵扯到相应的魔法函数,此处将介绍一些我认为比较常 ...

  9. 更换可执行文件glibc版本的某一次挣扎

    0x00:前言 在做pwn的堆题时,会遇到不同版本的glibc.为此我们会装不同版本的虚拟机去应对.一般来说会装Ubuntu16和Ubuntu18虚拟机,这两个系统对应的glibc版本差别较大,且较常 ...

  10. Javascript 正则使用笔记

    # 一.如何创建正则表达式对象 # 1.通过RegExp构造函数来创建.i代表忽略大小写,g代表全局搜索(非全局搜索正则只匹配第一次符合的内容,全局搜索可以匹配多次). var reg = new R ...