当前位置: 首页 > 科技观察

一篇学习OpenGauss分区表索引的文章

时间:2023-03-16 16:20:22 科技观察

本文转载自微信公众号《数据与云》,作者高云龙。转载本文请联系数据和云公众号。1、概述openGauss分区表支持两种类型的索引:全局(global)索引和本地(local)索引。为分区表创建索引不支持并发语法。默认索引是全局索引,创建本地索引需要指定local。创建主键约束和唯一约束必须包含分区字段,创建局部唯一索引也必须包含分区字段,但是创建全局唯一索引没有这个限制。postgres=#createindexconcurrentlyonpart_index_test(col2,col1,col3);ERROR:cannotcreateconcurrentpartitionedindexes本文主要讲解增删分区对索引的影响。数据库版本:openGauss1.1.0二、测试1、建表语句范围分区中的区间语法可以自动添加分区表。这里以区间分区表为例:createtablepart_index_test(partidvarchar(32)notnull,col1varchar(2)notnull,col2datenotnull,col3varchar(8)notnull)partitionbyrange(col2)interval('1day')(partitionpart1valueslessthan('20210331'),partitionpart2valueslessthan('20210401'));全局索引:createindexonpart_index_test(col2,col1,col3);局部索引:createindexonpart_index_test(col2,col1,col3)local;2、测试数据区间分区是以1天为单位,所以添加一天的数据会自动添加一个以sys_p开头的自增分区:insertintopart_index_testselectgenerate_series(1,1000),'1','20210401',generate_series(1,1000);insertintopart_index_testselectgenerate_series(1,1000),'1','20210402',generate_series(1,1000);insertintopart_index_testselectgenerate_series(1,1000),'1','20210402',generate03'(1,1000);insertintopart_index_testselectgenerate_series(1,1000),'1','20210404',generate_series(1,1000);insertintopart_index_testselectgenerate_series(1,1000),'1','20210405',generate_series(1,1000);insertintopart_index_testselectgenerate_系列(1,1000),'1','20210406',generate_series(1,1000);3。删除分区语法首先通过pg_partition系统表查询分区selectrelname,parttype,parentid,boundariesfrompg_partition;默认删除分区:altertablepart_index_testDROPPARTITIONpartition_name;更新全局索引删除分区的方法:altertablepart_index_testDROPPARTITIONpartition_nameupdateglobalindex;4.使用索引explainselect*frompart_index_testwherecol2=$1andpartid=$2;5.测试结果-添加分区删除分区备注全局索引生效默认语法无效/更新全局索引语法生效索引失效后需要重新索引本地索引有效总结:1.添加/删除分区不影响使用本地索引2、增加分区不影响全局索引的使用。默认情况下,分区被删除,全局索引失效,需要重建全局索引;updateglobalindex方法删除分区,不影响全局索引的使用。3、实例1、分区表准备创建分区表createtablepart_range_lessthan_int(idserialprimarykey,col1varchar(16))partitionbyrange(id)(partitionp1valueslessthan(1000),partitionp2valueslessthan(2000),partitionp3valueslessthan(3000),partitionp4valueslessthan(maxvalue));创建全局索引createuniqueintrange_indexonpart_(col1);初始数据insertintopart_range_lessthan_intselectgenerate_series(1,5000),'tuple'||generate_series(1,5000);默认删除分区SQLselectnow();altertablepart_range_lessthan_intdroppartitionp1;更新全局索引删除分区SQLselectnow();altertablepart_range_lessthan_intdroppartitionp1updateglobalindex;查询SQLanalyze;selectnow();explainselect*frompart_range_lessthan_intwherecol1='tuple2500';2.默认删除分区语法3.updateglobalindexdeletepartition作者简介高云龙,云和恩墨服务总监,长期从事PG运维,目前支持openGauss生态发展。