自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

帅的数说

专注于MySQL、MariaDB、Percona、PostgreSQL数据库及Aerospike等nosql数据库

  • 博客(644)
  • 问答 (1)
  • 收藏
  • 关注

原创 我的微信公众号二维码

2019-05-18 20:25:00 808

原创 GPDB HashAgg算法 | 第3期 | 版本6的spill溢出磁盘解秘

GPDB HashAgg算法 | 第3期 | 版本6的spill溢出磁盘解秘上期我们介绍了版本12的spill场景下hashagg如何进行操作,本期接着介绍下GPDB版本6是怎么操作的,它是否和版本12的原理一样?当然不一样,和版本12将不在当前hash表分组的元组溢出到磁盘不同,它是将当前hash表溢出到磁盘,然后再将元组插入到腾出空间的hash表中。1、hash表的管理Hash表的结构为Has...

2024-09-08 09:48:28 1047

原创 PgSQL基础知识 | 第1期 | 聚合计算

PgSQL基础知识 | 第1期 | 聚合计算本期开始陆续学习PgSQL基础知识,本节全面介绍PgSQL中的聚合操作,尤其是PgSQL的聚合支持各种高级功能,比如filter、order by、distinct等功能。1、语法aggregate_name (expression [ , ... ] [ order_by_clause ] ) [ FILTER ( WHERE filter_claus...

2024-09-01 07:28:07 506

原创 PgSQL HashAgg算法 | 第2期 | 版本12的spill溢出磁盘解秘

PgSQL HashAgg算法 | 第2期 | 版本12的spill溢出磁盘解秘HashAgg需要在内存中构建Hash表,以此来构建聚合分组;但是当数据量大到内存放不下时,就需要spill溢出到磁盘;构建好当前hash表并输出分组值后,再将磁盘上的spill文件中数据加载重新构建hash表并构建聚合分组。PgSQL在演进过程中,有两种spill磁盘方式,本期介绍如何spill并根据磁盘临时文件构建...

2024-08-18 21:50:37 924

原创 CloudberryDB | 第1期 | 向量化引擎解读

CloudberryDB | 第1期 | 向量化引擎解读GreenPlum闭源带来了挑战,CloudberryDB接棒GreenPlum继续前行。CloudberryDB向量化引擎有开源计划,8月3号社区首期线下沙龙对向量化引擎从4个方面进行了介绍:首先是OLAP性能优化点有哪些:编译执行、向量化执行和并行。1)其中编译执行:将复杂运算在执行前编译成一个函数,优点有:分支预测代价低,执行速度快(因...

2024-08-11 13:49:56 322

原创 DuckDB核心模块揭秘 | 第1期 | 向量化执行引擎之Pipeline

DuckDB核心模块揭秘 | 第1期 | 向量化执行引擎之PipelineDuckDB是一款非常火的OLAP嵌入式数据库,性能超级棒。它分为多个组件:解析器、逻辑规划器、优化器、物理规划器、执行器以及事务和存储管理层。其中解析器原语PgSQL的解析器;逻辑规划器包含binder、plan generator,前者解析所有引用的schema中的对象的表达式,将其与列名和类型匹配,后者将binder生...

2024-07-27 23:02:33 516

原创 PgSQL内核算法 | Hash Agg数据溢出写盘机制解析

PgSQL内核算法 | Hash Agg数据溢出写盘机制解析PgSQL进行Hash分组聚合时,针对数据的hash key(分组键)进行hash得到hash桶,同一个分组数据在同一桶上(为简化说明排除hash冲突场景)。当数据量比较大且比较分散造成分组数比较多时,构建的hash表在内存中放不下,就会将后续的不在当前分组中的数据写到磁盘临时文件。本文解析下写临时文件聚合的原理。1、Hash聚合流程1)...

2024-07-14 22:31:56 841

原创 openGauss - 向量化执行引擎算子HashAgg解读

openGauss - 向量化执行引擎算子HashAgg解读对于分组聚合来说,可以通过排序将待排序值按照大小排列起来,相同的值就紧密连在一起,然后依次遍历,遇到不相同的值就得到一个分组。另一种方式是通过Hash来完成,将所有值都构建到hash表中,同一个桶的值即为一个分组(hash冲突的场景忽略)。openGauss的向量化执行引擎如何通过Hash来实现聚合?1、HashAggRunner类Has...

2024-07-07 15:17:53 406

原创 CloudberryDB什么条件下使用Runtime Filter

CloudberryDB什么条件下使用Runtime Filter前文讲述了CloudberryDB的Runtime Filter两种实现方法。Hash Join时,将内表的值构建hash表的同时将其再构建到布隆过滤器中,然后将该过滤器传递给左子树的RuntimeFilter算子或者下沉到SeqScan算子,但是布隆过滤器的生成、传输及检查会引入额外开销,若不加节制滥用,则可能导致性能下降。Clo...

2024-06-30 15:23:54 184

原创 国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter今年5月份GreenPlum官方将GitHub仓库代码全部删除,各个分支的issues和bugs讨论等信息全部清除,仅将master分支代码进行归档。对于国内应用GPDB的用户来说,这是一个挑战性事件,对与后期维护、升级等都变得非常困难。有幸HashData开源了基于GP衍生版本CloudberryDB版本,对国...

2024-06-23 21:33:45 418

转载 PostgreSQL使用Linux cgroup2控制资源消耗

PostgreSQL使用Linux cgroup2控制资源消耗多租户和共host是一个挑战性问题。运行多个PG实例可以帮助减少内部竞争点(可伸缩性问题)。然而,一个租户的load可能会影响其他tenets,即所谓的“Noisy Neighbor”效应。幸运的是Linux允许用户通过每个程序使用cgroups来控制资源消耗。Cgroup2替代了cgroup1,处理了版本1几乎所有的限制。Linux的...

2024-06-10 16:24:09 59

原创 PgSQL技术内幕 - psql与服务端连接与交互机制

PgSQL技术内幕 - 客户端psql与服务端连接与交互机制简单来说,PgSQL的psql客户端向服务端发起连接请求,服务端接收到请求后,fork出一个子进程,之后由该子进程和客户端进行交互,处理客户端的SQL等,并将结果返回给客户端。那么,他是如何做到客户端和服务端子进程进行交互呢?服务端怎么做到和多个客户端交互呢?1、客户端如何连接psql客户端连接及发送SQL命令过程如下图所示:1)通过pa...

2024-06-08 23:40:50 482

原创 国产数据库 - 架构设计 - 初识Doris

国产数据库 - 架构设计 - 初识DorisDoris是一款基于MPP架构的分析型数据库。整体架构很简单,只有两类进程FE和BE。其中FE(Frontend)主要负责用户请求的接入、查询解析规划、元数据管理和节点管理相关工作;BE(Backend)主要负责数据存储、查询计划的执行。1、架构业界比较有名另一款的MPP分布式数据库GreenPlum,对照其来说,这里的FE和GPDB的Master相对应...

2024-05-29 22:48:44 826

原创 PgSQL内核机制 - 算子执行统计元组个数

PgSQL内核机制 - 算子执行统计元组个数我们在执行explain analyze观察执行计划执行情况时,时常通过每个算子实际执行结果来分析SQL的执行,其中有一项“rows = XXX”表示执行的行数(这里姑且先认为是执行的真实行数)。但有些场景下,比如MergeJoin,如下:可以看到内表t1的SeqScan算子扫描出8行记录,而排序Sort算子仅4个,难道不是应该8个元组都进行排序吗?那我...

2024-05-25 22:58:31 434

原创 openGauss的BatchStore和Batchsortstate为什么仅ForwardScanDirection取数据

openGauss - 内核原理 - BatchStore和Batchsortstate为什么仅ForwardScanDirection取数据openGauss的普通执行引起从Tuplestorestate(物化)和Tuplesortstate(排序)取数据时,会有方向,即ForwardScanDirection:从前向后依次取;BackwardScanDirection:从后向前依次取。但是,在...

2024-05-19 22:13:31 920

原创 第三章 crash recovery机制

PgSQL崩溃恢复机制

2024-05-12 21:02:20 111

原创 第二章 checkpoint机制 - 原理

checkpoint内核原理

2024-05-11 21:34:07 88

原创 第一章 buffer cache管理 - 2 原理机制

PostgreSQL的buffer cache机制

2024-05-10 22:27:49 344

原创 第二章 checkpoint机制 - 介绍

PostgreSQL的checkpoint介绍

2024-05-10 21:57:53 98

原创 第一章 buffer cache管理--1 介绍

PostgreSQL通过自己的buffer和操作系统内核缓冲来缓冲数据,即在内存中存储着两份数据,分别在shared buffer和内核buffer中。上面的方法是最简单的,还有其他方式。表t1的索引t1_pkey占cache的37.8%,占表总大小的90.2%,缓存中读取了索引中90%多的数据。默认情况下,pg_prewarm会将内存中的块链表存储到磁盘,重启时自动读取这个链表中页号,并把这些对于页读取到cache。注意,这种方式统计的信息包含系统表的信息,所以如果统计某个表的命中率,需要通过方法2。

2024-05-08 22:26:59 132

原创 PostgreSQL备份恢复与复制

学习本专栏能达到的效果:了解PG备份恢复与复制使用方法的同时,从代码层次深入理解其原理机制。

2024-05-08 22:02:20 99

原创 湖仓一体 - Apache Arrow的那些事

湖仓一体 - Apache Arrow的那些事Arrow是高性能列式内存格式标准。它的优势:高效计算:所有列存的通用优势,CPU缓存友好、SIMD向量化计算友好等;零序列化/反序列化:arrow的任何数据结构都是一段连续的内存,在跨进程/跨及其传输数据时直接发送/接收整段内存即可,不需要序列化和反序列化;完善的数据类型和生态;支持跨语言跨系统互操作。Arrow代码库分为3个层次:core层,提供数...

2024-05-05 12:46:58 872

原创 openGauss - 向量化执行引擎 - distinct分组聚合的实现

openGauss - 向量化执行引擎 - distinct分组聚合的实现openGauss向量化执行引擎中分组聚合有两种实现方式:排序和hash。本文介绍排序实现机制下的distinct分组聚合如何实现。分组聚合也分为两种使用方式:普通group by和grouping sets等分组集,其中普通group by就是每次查询生成一个分组的聚合;而grouping sets、cube或者rollu...

2024-04-27 19:09:24 860

原创 GPDB技术内幕 - SEMI JOIN浅析

GPDB技术内幕 - SEMI JOIN浅析SEMI JOIN顾名思义,半连接,相对于join字段来说,针对外表的一行记录,内表只要有一条满足,就输出外表记录。注意,这里是仅输出外表记录。GPDB中有几种实现方式,本文我们简单聊聊。从代码中,我们看到SEMI JOIN的类型有3类:1、JOIN_SEMI这是普通实现方式。针对nestloop join、merge join、hash join的in...

2024-04-12 22:41:19 933

转载 PgSQL技术内幕 - PostgreSQL查询处理阶段综述

PgSQL技术内幕 - PostgreSQL查询处理阶段综述查询发送到PgSQL后在后台进程会经历几个处理阶段,每个阶段都有不同职责,保证用户在尽可能短的时间内收到正确的响应。这个过程相当复杂,本文概述每个查询处理阶段的作用和意义。5个查询处理阶段解析器PgSQL使用lex(Flex lexical analyzer)和yacc(bison parser)工具创建解析器。通常通过写一个正则表达式定...

2024-04-05 22:35:44 66

原创 PgSQL - 内核插件 - pg_dirtyread

PgSQL - 内核插件- pg_dirtyread表中删除了记录,并且没有进行vacuum,此时可以通过pg_dirtyread扩展读取死记录。1、使用方法CREATE EXTENSION pg_dirtyread;SELECT * FROM pg_dirtyread('tablename') AS t(col1 type1, col2 type2, ...);安装插件后,通过pg_dirt...

2024-03-31 22:20:43 472

原创 GPDB - 内核特性 - 分区表如何处理表名超长

GPDB - 内核特性 - 分区表如何处理表名超长GPDB分区表创建时有可能表名已存在,此时报错退出。但当分区表名超过64字符时,会进行截断,仅保留前63字符,此时就可能出现分区表名不同,截断后创建的分区表名相同从而创建失败的情况;还会出现分区表父表创建成功,但分区子表名创建失败,报表名已存在等错误导致创建失败。本文基于GreenPlum7.0分区表经典语法详细分析分区表名及分区子表名生成机制。1...

2024-03-23 21:48:41 404

原创 PgSQL技术内幕 - 优化器如何估算行数

PgSQL技术内幕 - 优化器如何估算行数PgSQL优化器根据统计信息估算执行计划路径的代价,从而选择出最优的执行计划。而这些统计信息来自pg_statistic,当然这个系统表是由ANALYZE或者VACUUM进行样本采集而来。关于该系统表的介绍详见:PgSQL技术内幕-Analyze做的那些事-pg_statistic系统表在理解优化器估算行数原理前,先了解几个概念。1、MCVMCV即Most...

2024-03-13 22:26:25 914 2

原创 PgSQL - 内核特性 - 把DuckDB弄进来怎么样

PgSQL - 内核特性 - 把DuckDB弄进来怎么样DuckDB是一款高性能的分析型数据库系统,支持了基于Push-based pipeline的向量化执行引擎。这么好的一款数据库,有办法直接弄到PgSQL里面,以利用其优秀的列式存储、向量化执行引擎等优秀特性吗?Hydra团队开源了一款插件pg_quack,将duckdb以表访问方法的方式加到PgSQL中,为PgSQL提供了新的存储引擎以及执...

2024-02-24 23:02:15 671

翻译 PgSQL - 16新特性 - 查询优化器改进

PgSQL - 16新特性 - 查询优化器改进PgSQL16对查询优化器进行了一些改进,使得很多查询比之前版本执行更快。PgSQL16分为10个大的改进。1、DISTINCT查询的增量排序PgSQL13中首次引入增量排序。增量排序减少了获取排序结果的代价。怎么做到?根据一个或者多个leading列已排好序的结果集只在剩余的列上执行排序。举个例子:列a上有一个btree索引,我们需要在a,b列上进行...

2024-02-17 09:37:54 579

原创 GPDB - 高可用 - FTS机制(一):探测成功

GPDB - 高可用 - FTS机制(一):探测成功作为GreenPlum高可用的核心功能,FTS(Fault Tolerance Server)进程负责故障检测。该进程是master上的一个子进程,可以快速检测到primary或者mirror是否宕机,并及时让primary/mirror进行故障切换。如果fts挂掉了,master还会再重新fork出一个。本文说说FTS的工作机制。1、gp_se...

2024-02-14 22:05:49 912

原创 PgSQL内核特性 - push-based pipeline 执行引擎

PgSQL内核特性 - push-based pipeline 执行引擎数据库的SQL执行引擎负责处理和执行SQL请求。通常情况下,查询优化器会输出物理执行计划,一般由一系列的算子组成。当前,有两种算子流水线构建方式:1)需求驱动的流水线,由算子不断从下级算子拉取数据;2)数据驱动的流水线,由算子将每个数据推送给父算子。论文《Push versus pull-based loop fusion i...

2024-02-10 20:07:46 1019 1

原创 PgSQL技术内幕 - case when表达式实现机制

PgSQL技术内幕 - case when表达式实现机制CASE表达式如同 C语言中的if/else语句一样,为SQL添加了条件逻辑处理能力,可以根据不同条件返回不同结果。PgSQL支持两种语法:简单表达式和搜索表达式。1、搜索表达式语法如下:CASE WHEN condition THEN result [WHEN ...] [ELSE result]END表达式计算过程:...

2024-02-04 22:19:54 728 1

原创 PgSQL - 17新特性 - 块级别增量备份

PgSQL - 17新特性 - 块级别增量备份PgSQL可通过pg_basebackup进行全量备份。在构建复制关系时,创建备机时需要通过pg_basebackup全量拉取一个备份,形成一个mirror。但很多场景下,我们往往不需要进行全量备份/恢复,数据量特别大的时候,这个代价太大了。GPDB中有个工具gprecoverseg支持全量备份和增量备份。所谓全量备份,主要通过pg_basebacku...

2024-01-21 21:47:22 853

原创 GPDB - 高可用 - 流复制状态

GPDB - 高可用 - 流复制状态GPDB的高可用基于流复制,通过FTS进行自动故障切换。自动故障切换需要根据primary-mirror流复制的各种状态进行判断。本节就聊聊primary-mirror流复制的各种状态。同样适用于PgSQL1、WalSndStatetypedef enum WalSndState{ WALSNDSTATE_STARTUP = 0, WALSNDSTAT...

2024-01-06 22:57:54 1153

原创 PgSQL技术内幕 - ereport ERROR跳转机制

PgSQL技术内幕 - ereport ERROR跳转机制使用客户端执行SQL的时候经常遇到报ERROR错误,然后SQL语句就退出了。当然,事务也会回滚掉。本文我们看下它是如何做到退出SQL语句并回滚事务的。1、以insert一个numeric类型值为例表一个字段为numeric(10,2)类型,表示存储10位数字,精确到小数点后两位。当插入的值超过10位时就会报错:numeric field o...

2023-12-24 14:19:11 189

原创 GPDB - FTS机制 - FTS进程启动

GPDB - FTS机制 - FTS进程启动作为GreenPlum高可用的核心功能,FTS(Fault Tolerance Server)进程负责故障检测。该进程是master上的一个子进程,可以快速检测到primary或者mirror是否宕机,并及时让primary/mirror进行故障切换。如果fts挂掉了,master还会再重新fork出一个。本文说说FTS进程是怎么启动的。1、FTS进程的...

2023-12-17 19:02:05 76

原创 GPDB - 高可用特性 - 同步复制与异步复制

GPDB - 高可用特性 - 同步复制与异步复制GreenPlum是基于PostgreSQL的分布式数据库,master用于接收用户请求并生成执行计划与分发,当然也可以参与计算;而segment则用于存储数据,将计算的结果传递给master。Segment本身具有高可用特性,即分为primary和mirror,通过主从复制构建高可用关系。默认使用同步复制,若FTS检测到mirror发生异常,则修改...

2023-12-10 22:16:23 123

转载 PgSQL 16 - 新特性 - reserved_connections

PgSQL 16 -新特性 - reserved_connectionsPgSQL16中新加了一个新特性:新增reserved_connections。DBA和软件开发工程师经常使用超级用户(比如postgres)进行维护等操作。然而,在安全性方面,这并不是一个理想的操作。多年来,已经添加了一些功能来减少使用这种高度特权的系统连接方式的需要,而预留连接是另一种方法。1、调整PgSQL中的连接参数...

2023-12-04 15:31:39 132

原创 PgSQL技术内幕 • statement_timeout做的那些事

PgSQL技术内幕 •statement_timeout做的那些事statement_timeout是Postgres种的一个配置参数,用于指定SQL语句执行的超时时间,当超时时就取消该SQL的执行,并返回错误信息。这个参数通常用于控制运行时间较长的查询,避免影响数据库性能和响应时间。一旦一条SQL查询花费几分钟甚至更长时间才能执行完时,若没有限制,这种查询可能占用数据库资源,导致其他请求阻塞。...

2023-12-01 22:10:45 446

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除