Postgresql 10 HASH分区实现

PostgreSQL.10.2 Hash分区实现 基于Postgresql 10.2 版本, 实现简单的Hash分区          Postgresql 10 之前的版本,不支持 内建的直接分区,但是可以以继承表加触发器或者规则的方式实现简单分区的功能.随着Postgresql 10 版本的发行,源代码中实现了range和list 分区功能.在参考别人实现方法的同时,试着在新版本实现Hash分区.(持续更新中)思路先创建主表,再创建分区表,语... 阅读详情

Postgresql 10 HASH分区实现

前面简单介绍了postgres10分区相关情况,里面谈到基于postgres10这套分区实现hash分区比较麻烦,但仔细考虑后发现其实也是可以实现的,下面介绍在原有range/list基础上比较粗糙的hash分区的实现 。

注意:本文中思路及后附代码是研究学习用,由于本人水平限制,难免会有遗漏及错误的地方,不保证正确性,并且是个人见解,希望能抛砖引玉,发现问题欢迎留言指正。

 

整体思路简介:

1.      建主表时要确定好分区个数,每个子表上标号是第几个分区。

2.      语法尽可能的和range、list风格相近,相关的系统表也用之前的,pg_partitionen_table系统表增加一个字段存分区表个数。

3.      insert时通过分区键直接找到要插入的子表.

4.      select时约束排除沿用原来的接口进行扩展过滤.

 

语法篇:

先看看range和list,既然都是分区就尽量的和之前的保持一致:

RANGE分区表:

create table tr(a int,b int) partition by range(a);

create table tr_1 partition of tr for values from (1) to (10);

create table tr_2 partition of tr for values from (10) to (100);

LIST分区表:

create table tl(a int,b int) partition by list(a);

CREATETABLE tl_1 PARTITION OF tl FOR VALUES IN (2);

CREATETABLE tl_2 PARTITION OF tl FOR VALUES IN (3); 

对于LIST与RANGE分区,建主表二者语法一样,只有类型区别,建子表则差异较大,list是多个点的集合,range是一个区间,分别描述字表分区键值的范围。那么对hash分区来说,语法怎么设置比较合理呢?首先分区类型肯定要保持一致写法,如下把LIST、RANGE换成hash:

 create table th(a int,b int) partition by  hash(a);

 那么对于子分区表呢?hash子表分区键的范围既不是list那样的多个点的集合,也不是一个范围区间,只要hash值等于某个分区的位置即可认为是该值应该在这个分区中,因此子表不需要额外说明,建议语法如下:

  create table th_1 partition of th;

  create table th_2 partition of th;

  create table th_3 partition of th;

但对于hash分区来说,分区个数决定着每行记录归属的子表,因此分区数需要先决定,不允许增加或删除子表(可以实现子表增删,但需要对部分或全部数据移动调整,本文不讨论,有兴趣者可看看oracle hash分区),所以创建主表时需要加上分区数量,完整语法如下:

  create table th(a int,b int) partition by  hash(a)  partitions 4;

  create table th_1 partition of th;

  create table th_2 partition of th;

  create table th_3 partition of th;

  create table th_4 partition of th;

创建的第一个表为第一个子表,第二个表是第二个子表,以此类推,第n个建的表为第n个子表。

必须保证满足如下几条:

1. 主表指定的分区数量必须和后面建的子表数量一致,否则报错。

2. 不允许alter table attach/detach 修改hash分区表

3. 不允许单独drop hash分区子表

 

当create hash分区时,与list或range比主要是要多存一个信息:hash 分区数。如

create table th(a int,b int) partition by hash(a) partitions  4;

把4存入pg_partitionen_table系统表中,增加一个字段专门存hash分区数。在 StorePartitionKey 函数增加了一个整型参数,另外对分区类型判定调整到了parser模块中,前一篇已经介绍过相关疑问,在这修改了原来逻辑,不再在transformPartitionSpec中进行字符串比较后再判断是list/range/hash分区,transformPartitionSpec 函数去掉了分区类型的参数,内部删掉分区类型的检测判断逻辑。

语法、建表相关代码详见后附的差异文件gram.y、tablecmds.c、heap.c等文件。

 

数据插入篇:

前文详细介绍过,pg10的分区插入不再使用规则或触发器方式,直接在insert时根据value计算出目标子表,大幅提高insert性能,那么insert分区表性能的极致是什么呢?如果insert分区表和insert一个普通表的时间一样,那么这就是我认为的insert 性能极致。比方说,一千个分区的分区表,在第一千个子表插入100W记录的时间和非分区的单表插入100W记录的时间是一样的,那么我便认为insert性能已经到了极致。为什么要谈这个?因为这是我的小目标。

言归正传,前文介绍了,ExecInsert函数中ExecFindPartition函数确定子分区,里面又是 get_partition_for_tuple函数找到,再往下通过partition_bound_bsearch进行查找,最终是根据不同类型,调用不能的比较函数,进行二分查询,要把所有的子表上的分区范围信息比较找一次。对于HASH分区,我们无需对所有子表分区范围信息进行比较来确定是哪个分区,只要有分区数和要插入的分区键的value值就能计算出目标子表。在get_partition_for_tuple函数增加HASH分区求子分区位置逻辑:

 

    if (key->strategy ==PARTITION_STRATEGY_HASH)

        {

            ….

           returnget_index_by_hash(value, col_type,nparts);

    }

 

如果是hash分区,增加函数get_index_by_hash来求目标子表位置,传入三个参数:分区值的键值,分区键的类型,总的分区个数。

在get_index_by_hash中则根据类型分别调用该类型的hash函数计算hash值,最终的位置计算式如下:

Result = (hash(value) % nparts + nparts) % nparts;

hash(value): 调用相关hash函数通过传入的value计算出的hash值

nparts:总的分区个数

 

insert 插入逻辑增加的关键代码不多,简单才能高效,具体细节请看partition.c文件。最终插入性能比较理想,对于一千个hash子表的hash分区表,在第一千个子表插入100W行数据和单表插同样的数据100W行,时间几乎没什么区别。

实测结果如下图:

首先建1000个hash分区表,时间约1.5秒:


对比range分区,1000个子表约要40秒,如下图:


随机插入100W行记录:时间约6.5秒,并看每个分区的记录数是否均匀,100W分区到1000个区,那么理论上每个区1000条左右,见下图:

       

然后进行最关心的插入性能测试,固定插第1000个子表和插非分区表100W行记录对比时间,testt为分区表,tt为普通表。红线为分区表的,蓝线为普通表,两个都插了三次,时间有高有低,并不稳定,但总体上可以两者认为是差不多的,最后统计了下第1000个分区的记录数是正确的,说明的确是插进去了。


由于固定插入某个表的时间变化大,于是我又测了下在1000个范围内随机插入100W行记录,发现在1000个子表中随机插入时间其实和插一个子表应该也是差不多,并没慢多少


最终结论:时间不稳定和我的测试平台为普通机器、数据库本身、及测试方法有关系,如果都取最优值话,可以粗略的认为1000个子表的hash分区插入100W行时间与插入一个普通表基本持平,达到我的小目标。

 

数据查询篇:

前文介绍过,postgres10分区剪枝是把分区范围信息经过转换处理成和约束相同的结构,

relation_excluded_by_constraints函数中的predicate_refuted_by排除函数就可以当成约束直接处理,将不需要扫描的表过滤掉。同样,hash分区排除逻辑也类似,但是不能造一个约束让predicate_refuted_by去过滤,因为postgres 默认逻辑不能处理hash分区的情况,我们需要抽值出来组成新的结构,执行后再做比较判断,因此在这简单实现了一套函数。

relation_excluded_by_constraints中原来排除逻辑走完后,对hash分区,再做一次检查:

bool
relation_excluded_by_constraints(PlannerInfo *root,
								 RelOptInfo *rel, RangeTblEntry *rte)
{
	List       *safe_restrictions;
	List       *constraint_pred;

	...

	if (predicate_refuted_by(safe_constraints, rel->baserestrictinfo))
		return true;

	if (NIL != root->append_rel_list)
	{
		...
		//hash分区则进行判断
		if (simple_equality_predicate_refuted((Node*)safe_constraints, Node*)rel->baserestrictinfo))
			return true;

	}
	return false;
}



simple_equality_predicate_refuted逻辑简介:

还是以语句为例,在上面截图中的1000个分区的分区表testtt,执行如下语句:

select * from testt where id =20000000;


这里能否剪枝的关键显然是where 条件 id =20000000 控制, 在此必须需要和insert时保持一致的算法才能找到正确的子表,也就是说一样要满足:

Result = (hash(value) % nparts + nparts) % nparts;

这里面nparts是知道的,value是传进来的,也是知道的,hash函数需要根据类型去找出来,也是知道的,那么理论上计算出result是没问题的。但在这里有一个问题要解决,我们在构造约束或者说计划时,value是变量,不是常量,比方说对于第1个子表,约束是:

(hash(value) % nparts + nparts) % nparts =1

这里nparts换成1000就是

(hash(value) % 1000 + 1000) % 1000 ==1

这里的value只是个列,表testt的id列,而我们的值 id=2000000的这个20000000在另外的表达式中,所以我们要找到它,并且放入hash函数中,变成如下的式子:

(hash(20000000) % 1000 + 1000) % 1000 ==1

这样的式子拿到后,再计算它的值,true要需要扫描,false不需要。显然,对于id = 20000000的1000个子表的hash分区只有一个表是要扫描的,其它全应该过滤。

 

这就是simple_equality_predicate_refuted干的主要工作,拿到相关结构替换构造一个新的表达式,再调用执行器计算这个结果,详细代码请看plancat.c文件,需要提一下的是,由于时间原因,目前只支持hash分区表中单个条件的过滤,以后有空再研究多个条件过滤。

 

在上面,构造 hash(value)函数是在postgres的get_qual_from_partbound中,增加了hash分区的处理函数get_qual_for_hash,细节逻辑不详细介绍了,就是构造了一个 (hash(value) % nparts + nparts) % nparts 的表达式,有兴趣的可以看看相关代码,逻辑比较简单。

另外,在实现过程中,hash过滤我也考虑过像insert一样,直接定位子表,不再遍历子表的list, 提高性能,但分析后发现在现有约束排除机制上实现太过麻烦,可能要重新实现一套独立的分区剪枝函数,难度估计超过个人能力了,业余时间没这么多,只好放弃等postgres 官方来推进。

这里的大多数代码都在partition.c中。

 

备份恢复篇

增加了一种新的分区表,备份恢复肯定要处理下。这里最大的问题在于建表时,并不需要指定子表是第几个,而是由建立的先后顺序由内部逻辑定是第几个子表。这样做方便建表,但是对于备份就有些麻烦了,我们dump出表结构时,并不一定是按我们create的先后顺序,如果原来第1个子表是第2个顺序建,那么数据就进不去了,会被约束给限制住,所以我们在dump时需要按原来的Create顺序排序建表,详细的可以看看dump相关几个修改文件。

 

其它:

其它还有一些比较简单的,像禁止alter attach/ detach hash表,禁止drop hash子表,\d、\d+ hash表修改,srtingtonode、nodetostring支持hash,RelationBuildPartitionDesc 中的hash表排序,等等,大家有兴趣者可以看看,欢迎大家提出更优的改进建议。


本文中涉及的全部hash分区代码下载

下载链接:http://pan.baidu.com/s/1bp7UMtD 密码:l1vc

代码版本:基于官方git  2016/12/12 02:09:57 Tom Lane 最后一次提交为基线开发,patch差异文件可以直接基于这个点的版本应用patch( 官方开发线代码直接 git clone git://git.postgresql.org/git/postgresql.git 即可下载到本地)。

下载后直接把patch打到上面的基线上即可这些代码合并进去,合并进去后建议先跑下回归有没有问题,我这边是没有问题的。


 

更多postgresql 内核学习开发相关文章请点击进入我的博客查看

 

从哈希冲突到数据均衡:PostgreSQL HASH分区的数学之美与实战调优 本文深入探讨PostgreSQL HASH分区的数学原理与实战调优技巧,涵盖哈希函数选择、分区键设计、MODULUS值优化等核心内容。通过分析哈希冲突概率和数据均衡策略,帮助开发者实现高效的海量数据管理,提升查询性能和写入负载均衡。 阅读详情

相关推荐

【PostgreSQL】PostgreSQL两层hash分区表(适用于大数据量表)

【代码】【PostgreSQL】PostgreSQL两层hash分区表。

tttzzzqqq2018的博客 1369

PostgreSQL表分区的三种方式

PostgreSQL表分区的三种方式

架构师:通透,才能写出好代码! 2516

Sigmastar平台WDR调试实战:从参数解析到鬼影消除的完整指南

本文提供了Sigmastar平台宽动态(WDR)技术的实战调试指南。针对逆光、运动场景下的核心痛点,系统性地解析了从多曝光采集、HDR融合到色调映射的完整管线,并重点阐述了如何通过调整曝光比、运动阈值与调整曲线等关键参数,有效消除运动鬼影、平衡暗部噪声与细节,最终实现清晰稳定的图像效果。

Jerry的专栏 930

PostgreSQL/PgSQL使用List分区表代替Hash分区表

,更是需有一个表来做记录和判断,以免发生重号的情况,那么使用分区表以提高查询性能就势在必行了。如果系统中需要记录所有发放给的客人的卡号,这些信息如果放在一个表里,势必是会造成记录数超级多。Hash表的话,我不确定其性能到底怎么样,还是自己维护一组List分区表安心一点。建一个List分区表,字段不用多,保证IO时性能,分区值为某个字段的第一个字母。写SQL也就是半小时的事,先搞好之后记录下来,以后再去测试两种分区表的性能。说实话,我是因为不太理解Hash分区表才有这样的想法的。3、实现脚本及测试脚本。

即使放弃那棵树,也无法拥抱森林 723

杰理芯片外挂Flash音乐播放功能避坑指南(附FAT文件系统配置)

本文详细解析了杰理芯片外挂Flash实现音乐播放功能的技术要点与常见问题,包括硬件连接、SPI驱动配置、FAT文件系统烧录及音乐播放集成等关键环节。特别针对Flash选型、FAT文件系统配置等易错点提供实用解决方案,帮助开发者高效完成嵌入式音频系统开发。

yhn45678901的博客 834

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5560

【postgresql】PG HASH分区表的创建

1.pg的hash分区。

weixin_43346403的博客 1898

Flightmare实战:从零搭建强化学习无人机控制环境

本文详细介绍了从零开始搭建Flightmare强化学习无人机控制环境的完整流程。内容包括环境准备、核心库安装、依赖冲突解决,以及如何运行PPO算法示例进行训练与可视化测试。文章还提供了环境配置、自定义任务修改及常见问题的避坑指南,帮助开发者快速上手这一模块化的无人机RL仿真平台。

weixin_29081101的博客 356

PostgreSQL 10 HASH分区实现

PostgreSQL 10 HASH分区 前面简单说明了基于pg10实现hash分区的使用语法,下面介绍参照range/list分区实现的hash分区。 注意:由于本人水平限制,难免会有遗漏及错误的地方,不保证正确性,并且是个人见解,发现问题欢迎留言指正。 思路 语法尽...

1053

DINOv3 网络结构解析:从 ViT 到 ConvNeXt 的双路线设计

本文深入解析了DINOv3网络结构的双路线设计,包括ViT和ConvNeXt两种主干架构。ViT路线通过轴向旋转位置编码解决了传统ViT对固定分辨率的依赖,而ConvNeXt路线则优化了卷积设计,提升了实时处理能力。文章还探讨了Gram Anchoring、混合自监督目标等关键技术,展示了DINOv3在多任务和多模态应用中的强大潜力。

weixin_29214199的博客 565

【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码)

本系统采用SG90舵机Maix Bit摄像头STM32C8T6主控板以及LX_TRIG_MP3_V6.0语音播报模块,构建了一套高效的智能垃圾分类系统,综合运用了图像识别、语音播报及精准控制技术。SG90舵机负责控制垃圾桶的开盖操作。该舵机通过接收PWM信号来实现转动,内部有一个基准电路产生周期为20ms的PWM信号,通过外部脉冲信号的控制(高电平时间在0.5ms至2.5ms之间),使得舵机的输出轴转动到指定位置。舵机内的位置反馈电位计。

嵌入式技术开发 5103

PostgreSQL 9.x, 10, 11 hash分区表 用法举例

标签 PostgreSQL , 分区表 , 优化器 , 分区过滤 , hash 分区 背景 PostgreSQL 10开始内置分区表语法,当时只支持了range,list两种分区,实际上可以通过LIST实现HASH分区。 PostgreSQL 10 hash 分区表 使用list支持hash分区 postgres=# create t...

weixin_33692284的博客 971

【OpenClaw从入门到精通】第60篇:多智能体协同实战——用“龙虾”搭建你的数字员工团队(2026企业版)

2026年AI Agent企业落地的核心趋势,正从“单Agent单兵作战”转向“多智能体协同组网”。本文以全球开发者先锋大会“百虾大战”真实案例为蓝本,深度拆解OpenClaw多智能体协同的技术内核——三层解耦架构(模型层-技能层-网关层),系统搭建包含项目经理、架构师、执行者、质量把关者的4大核心Agent团队。通过三种主流协作架构对比、全链路配置代码实操、故障自愈实战演练,结合电商新品上架虚拟场景全流程演示,解决企业多Agent部署中的权限隔离、任务协同、运维自治三大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 770

PostgreSQL 10.0 preview 功能增强 - 分区表(hash,range,list)

标签 PostgreSQL , 10.0 , 分区表 背景 PostgreSQL 10.0将支持range,list分区表,同时hash分区处于POC阶段(同时还有一些需要改进的地方,例如优化器部分)。 如果你使用的是10.0以前的版本,可以使用pg_pathman插件实现分区,pg_pathman已经非常的完美。 PostgreSQL支持伪表作为分...

weixin_33774615的博客 244

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 406

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PostgreSQL分区表的创建和使用

pg支持两种分区表技术:表继承配合触发器实现分区、原生分区。 在pg9中只支持继承的方式实现分区表; pg10开始支持原生分区,但只支持range分区和list分区; pg11新增支持hash分区,支持默认分区等; pg12对于分区表的性能有有了极大的提升。 表继承的语法为: CREATE TABLE table_kid INHERITS(table_parents); 由于这种方法实现分区表效率很低,且现在也很少使用,所以就不过多介绍,这里主要介绍原生分区表技术。 目前内置的原生分区表支持:rang

Focus on PostgreSQL 4229

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PostgreSQL分区表原理、案例的灵活应用

PostgreSQL分区表案例的灵活应用: PostgreSQL10之前的版本不支持内置分区表,若要实现分区功能,需通过继承的方式实现。PostgreSQL 10.x 之前的版本提供了一种“手动”方式使用分区表的方式,需要使用继承 + 触发器的来实现分区表,步骤较为繁琐,需要定义附表、子表、子表的约束、创建子表索引,创建分区删除、修改,触发器等。PostgreSQL 10.x 开始提供了内置分区表(内置是相对于 10.x 之前的手动方式)。内置分区简化了操作,将部分操作内置,最终简单三步就能够创建分区表。

qq_61920297的博客 1372

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

PostgreSQL V10 分区表特性

目录 环境 文档用途 详细信息 环境 系统平台:N/A 版本:10.3 文档用途 PostgreSQL V10 分区表的理解与使用 详细信息 分区表特性是PG10新加的一个很重要的特性。 之前的版本也能实现分区表功能,是根据“继承表+约束+规则或触发器”实现。 相对于之前的分区实现方式,PG10的分区特性有以下优势: 1)管理分区方便 2)数据插入效率高 ...

HighGO 786

PostgreSQL 10 分区表探密

PostgreSQL 10 分区表探密 分区介绍 PostgreSQL的分区需要先建立主表,然后再建立子表,使用继承的特性,但不需要手动写触发器/规则了,目前支持range、list分区,10 正式版发布时不知道会不会有其他的,后面我会介绍我基于10 Beta2添加的has...

551

2 查看字段约束_【参赛作品2】openGauss 分区表

概述openGauss是基于PostgreSQL9.2.4的内核开发的,在PostgreSQL10之前要达到实现分区表的效果可以有两种方式,一种是使用继承的触发器函数来实现,一种是安装pg_pathman的插件来实现,直到PostgreSQL10才引入了partition的语法;而opengauss从开源发布就可以直接使用partition的方式来创建分区表,行存表支持范围分区和间隔分区...

weixin_31935149的博客 750

pg_pathman 与 PostgreSQL 10 原生分区混用:ATTACH/DETACH PARTITION 完整兼容指南

pg_pathman 是 PostgreSQL 的分区管理扩展,本文带你快速掌握 pg_pathman 与 PostgreSQL 10 原生声明式分区(Declarative Partitioning)的混用方法,重点讲清 `ATTACH PARTITION` / `DETACH PARTITION` 的兼容细节与迁移要点,新手也能一次学会。🚀 ## 一、先搞懂:两种分区机制的核心差异 Po

gitblog_00255的博客 405

PostgreSQL中的HASH分区:原理、实现与最佳实践

PostgreSQL的HASH分区一种数据分布技术,它通过哈希函数将表数据均匀分散到多个分区中。这种分区方式特别适合需要将数据均匀分布且没有明显自然分区键的场景。本文将深入介绍HASH分区的原理、实现方法、性能特点以及实际应用案例,帮助您在合适的场景中有效利用这一功能。

neweastsun的专栏 1711

PostgreSQL - 高级分区表:哈希分区与复合分区

本文深入探讨了PostgreSQL中的高级分区技术,重点介绍了哈希分区和复合分区的原理与实现。哈希分区通过哈希函数均匀分布数据,适合高并发写入和等值查询场景。复合分区结合多种策略(如范围+哈希),能更灵活地处理复杂数据分布需求。文章通过实际SQL示例展示了创建分区表的方法,并分析了不同分区策略的性能特点与应用场景。这些高级分区技术能显著提升大规模数据处理的性能和管理效率。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

PostgreSQL 11 新特性之哈希分区

本文介绍 PostgreSQL 11 新增的分区类型:哈希分区(hash partitioning)。

Tony.Dong的专栏 6918

如何在PostgreSQL中实现基于哈希的分区表以及其优势是什么

PostgreSQL是一个功能强大的开源关系型数据库管理系统,它支持多种分区策略,包括基于范围的分区、基于列表的分区以及基于哈希的分区。在PostgreSQL中,基于哈希的分区表通常用于将数据均匀地分布到多个分区中,以便实现更好的负载均衡和查询性能。在基于哈希的分区中,你可以创建任意数量的分区,并且PostgreSQL会根据哈希函数自动将数据分布到这些分区中。现在,你可以向主表中插入数据,PostgreSQL将自动根据哈希函数将数据分布到相应的分区中。分区键是用于确定数据应存储在哪个分区中的列。

发现生活,分享智慧,一起成长! 940

PostgreSQL分区表

分区表是一种数据库优化技术,它允许将一个大表逻辑上划分为多个较小的、可管理的部分,这些部分被称为分区或子表。分区表在物理上是分开存储的,但在逻辑上仍作为一个整体呈现给用户。这一特性特别适用于处理大量数据的场景,旨在提高查询性能、管理和维护大数据集的效率。

m0_37559973的博客 4155
上一篇: postgresql 10 分区探密
下一篇: postgresql内核语法解析器详解
postgres20
博客等级 码龄10年 100粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值