自定义博客皮肤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数据库

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

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

2019-05-18 20:25:00 685

原创 GreenPlum AOCO列存读IO原理

GreenPlum AOCO列存读IO原理GP自带AOCO列存,它的IO和heap表的IO是分开的。Heap表的脏数据由checkpoint或后台write进程刷写,也就是FlushBuffer函数调用smgrwrite。由magnetic disk storage manager管理IO模块。但是AOCO列存则是由本身进行管理,由函数BufferedAppendWrite完成脏页的刷写。同理,A...

2022-11-26 21:36:52

转载 PostgreSQL中NULL的意义

PostgreSQL中NULL的意义PG中,NULL可以表示空numeric值;不能进行数学操作符计算,NULL参与的结果都是NULL。1、NULL是什么首先需要理解NULL值是什么。因不同语言处理方式不同,所以NULL值经常引起一些混淆。在详细介绍之前,还需要了解三值逻辑和二值逻辑概念。二值是布尔值的概念,要么真,要么假。但三值逻辑可以真,也可以为假,还可以是中间值(未知)。某些语言中,NULL...

2022-11-12 21:08:05 12

原创 PolarDB for PostgreSQL透明加密

PolarDB for PostgreSQL透明加密简介透明加密TDE(Transparent Data Encryption)通过在数据库层执行静止数据加密,阻止可能的攻击者绕过数据库直接从存储读取敏感信息。经过数据库身份认证的应用和用户可以继续透明地访问数据,而尝试读取数据库文件中敏感数据的操作系统用户或者未经认证的用户将不允许访问数据。PolarDB for PG透明加密使用方法1)编译代码...

2022-11-09 22:12:55 66

原创 openGauss向量化Merge Join--semi join

openGauss向量化执行引擎的Merge Join1 什么是semi joinSemi join语义:对于外表一行值,只要内表有一行与之相等,即满足join条件,就输出外表值。这里需要注意,仅输出外表值,而不和对应内表值合并输出。2 openGauss VecMergeJoin状态机VecMergeJoin状态机如下图所示:下面我们以一个例子为例,解释各个join的执行情况。表t30和t31的...

2022-11-01 00:56:16 15

原创 openGauss向量化Merge Join--inner join

openGauss VecMergeJoin状态机VecMergeJoin状态机如下图所示:下面我们以一个例子为例,解释各个join的执行情况。表t30和t31的结构及数据如下:postgres=# select * from t30id1 | id2----|----1 | 12 | 32 | 3(3 rows)postgres=# select * from t31id1 ...

2022-10-30 22:51:31 51

原创 PostgreSQL/GreenPlum Merge Inner Join解密

PostgreSQL/GreenPlum Merge Inner Join解密1、什么是Merge Join合并连接是一种匹配算法,其中外表的每个记录与内表的每个记录进行匹配,直到存在连接子句匹配的可能性为止。仅当两个表都已排序并且join子句的运算符是“=”时,才使用该算法。如下图所示:merge join的字节点需要Sort节点对内外表进行排序,然后进行join。2、Merge Inner J...

2022-10-22 09:21:48 38

原创 GreenPlum Hash聚合简析

GreenPlum Hash聚合简析Hash聚合相关结构体首先需要了解Hash表是什么结构?该Hash表在哪个结构里进行管理?如何和聚合算子的结构联系起来?从下图可以看到:1)Hash表位于:AggState聚合算子状态描述结构的perhash中,即hashtable。2)hash表的hash函数由perhash->hashfunctions进行描述,其实是个二维数组指针,包含每个hash列...

2022-10-15 13:43:18 64

转载 [译]学习PostgreSQL内核

学习PostgreSQL内核发现一个学习PG内核的资料,以作记录。首先,从愿景开始,阅读Postgres的设计:了解PG与其历史的区别:复杂对象、用户可扩展性、活跃的数据库设施,同时保留关系的概念。https://dsf.berkeley.edu/papers/ERL-M85-95.pdf其次,浏览下Bruce Momjain的“Internal”:这些往往有些老,Bruce已经有段实际没有做深入...

2022-10-07 22:02:45 17

转载 [译]Windows下的流复制:快速指南

Windows下的流复制:快速指南大家可能对Linux环境下搭建流复制很熟悉,对于windows环境下配置流复制可能会有些默认,从PostgreSQL weekly博客中看到有篇对Windows环境下搭建流复制的介绍,本文将其整理过来,以供参考。PG weekly:https://postgresweekly.com/DB weekly:https://www.dbweekly.com/Postg...

2022-10-02 20:44:20 21

原创 GreenPlum列存解密

GreenPlum支持列式存储。叫做AOCO表。那么AOCO列存是如何管理列存文件?如何实现MVCC?是否支持索引,若支持如何实现的呢?下面我们介绍下AOCO的实现机制。1、存储结构如上图所示,列存每一列单独存储一个文件。上面一个表有4个字段,那么对应分别存储在relfilenode.1,relfilenode.129,relfilenode.257,relfilenode.385文件中。其中re...

2022-09-21 22:09:21 113

原创 Inner Join与Left Join

Inner Join与Left Join内连接、外连接、半连接区别是什么?先创建一个示例表及数据:postgres=# create table t10(id1 int,id2 int);CREATE TABLEpostgres=# create table t11(id1 int,id2 int);CREATE TABLEpostgres=# select * from t11; id1...

2022-09-18 22:16:14 62

转载 [译]PostgreSQL15 public shema权限增强

PostgreSQL 15对用户权限这块进行了增强。默认情况下,不再设置public schema的CREATE权限。2021年9月,PG15的版本提交了一个patch:默认情况下不再设置public schema的CREATE权限。该建议来自:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-1058。Commit为:https://...

2022-09-11 00:23:19 36

翻译 [译]PostgreSQL 15: stats collector进程优化掉了

PostgreSQL 15: stats collector进程优化掉了PG15对统计进行了重大改进。将stats collector进程优化掉了,不再将统计数据放入临时文件中,而是放到共享内存中,在shutdown前由checkpoint进程将其持久化,启动时由startup进程将其加载。减少了IO和进程间通信,从而改进性能。正文尝试使用PG15的用户都会发现有一个后台进程消失了:postgre...

2022-09-04 21:20:22 39

翻译 [译]PostgreSQL HAVING子句

PostgreSQL HAVING子句正文了解GROUP BY和HAVING子句的工作原理可以帮助写出更加高效的SQL。这里用一个真实例子来说明这一点。假设由2个表:country、invoice:select * from country;ctry_code ctry_nameUS USACA CanadaCN China.. ..7 rowssel...

2022-08-21 11:37:43 45

原创 GreenPlum数据分布机制

一、介绍GreenPlum是Coodinator/Segment架构,集群通常由一个Coodinator节点和一个standby coodinator节点以及多个segment节点组成,其中数据放置在segment节点上。Coodinator是整个数据库的入口,客户端只会连接到Coodinator上并执行相关查询操作,Standby节点为Coordinator提供高可用支...

2022-08-13 22:03:51 62

原创 PostgreSQL中插件如何新增一个配置项

PostgreSQL通过插件可以集成许多扩展,比如auth_delay。添加插件时,会引入一些guc配置变量,比如auth_delay的auth_delay.milliseconds。那么这些变量是如何随着插件的安装集成到server中呢?在系统中又是如何管理的呢?我们先看下guc参数是如何管理的。首先初始化GUC选项,将其设置为默认值;然后读取命令行配置,最后读取配置文...

2022-07-30 23:31:37 78

原创 俄罗斯postgresql公司PostgresPro新书:PG14技术内幕

Postgrespro是俄罗斯著名的数据库公司,旗下主要产品基于PostgreSQL。近期发布了一本新书“PostgreSQL 14Internals”。本书适用于那些使用数据库时不满足于黑盒方法的人。简要介绍了PostgreSQL的主要概念,然后深入数据一致性和隔离级别,解释了多版本并发控制和快照隔离、缓冲区缓存和预写日志以及锁系统的实现细节。本书的其余部分涵盖了执行...

2022-07-20 22:00:11 413

原创 AnalyticDB向量化引擎

AnalyticDB是阿里云企业级云原生数据仓库,在GreenPlum和PostgreSQL基础上开发的。语法上对两者保持兼容,功能层面上为GP超集。其架构:这里重点关注他的向量化引擎。PG的执行引擎是Record-Oriented的火山模型,也就是面向行。ADB自研了Block-Oriented向量化执行引擎。对于Record-Oriented通过getNext()接口...

2022-07-17 12:29:31 85

翻译 [译]PostgreSQL15改进了UNIQUE和NULL

PostgreSQL15改进了UNIQUE和NULL最近发布了PG15 beta 2。本文关注对有NULL值的列进行UNIQUE约束的改进。虽然唯一约束的细小差别不如加速排序那样惊艳,但对于提高数据库开发人员对数据质量的控制来说,总归是一个好处。邮件列表对此进行了讨论:https://www.postgresql.org/message-id/flat/84e5ee1b-...

2022-07-15 21:19:52 81

原创 字节跳动火山引擎ByteHouse的hash join

带有过滤条件的hash join,首先针对左表构建hash表,然后对右表进行过滤,针对hash表中每个元组都对右表过滤后的结果进行探测,满足条件的作为join结果。当左表比较大时,构建hash表就需要较大代价。字节跳动的火山引擎Bytehouse中对hash join进行了优化。当右表过滤后结果集比较小时,将右表结果集作为过滤条件过滤左表,然后再构建hash表进行探测。如...

2022-07-13 21:12:24 184

原创 Wal receiver进程描述结构

WalReceiver进程的描述结构WalRcvData,仅当作记录typedef struct{ pid_t pid;//当前walreciver进程的pid WalRcvState walRcvState;//标记进程状态 pg_time_t startTime;//RequestXLogStream函数调用的开始时间 //startup...

2022-07-11 22:02:26 46

原创 StartRocks向量化过滤

如何通过SIMD指令快速过滤?比如上图的例子,有atrr_A列,有8个值。TID:0-7,过滤小于45的列值。1)通过SIMD COMPARE指令可以一次性比较一批数据。比如上例,满足条件的标记到bitmask中。2)通过SIMDpermute压缩,将满足条件的移动到前面,满足条件的都在一起。3)通过SIMDmasked store将TID输出。这样就批量快速过滤出来...

2022-07-10 21:00:49 39

原创 PG的wal receiver进程如何启动

备机的receiver进程是由恢复进程即startup进程发启。具体如下:1)恢复进程首先需要打开需要恢复的WAL日志文件。通过函数WaitForWALToBecomeAvailable完成。2)从前文中可知,日志文件读取的顺序是LOG_FROM_ARCHIVE - XLOG_FROM_PG_WAL - XLOG_FROM_STREAM。也就是先从归档中读取,归档读取失败...

2022-07-07 23:03:08 70

原创 GreenPlum和openGauss进行简单聚合时对扫描列的区别

GreenPlum在PG优化器下针对列存表执行单列聚集时(无过滤条件),不管聚集中包含多少列,都需要将所有列扫描上来。比如select avg(id1) from t1。扫描时,不仅将id1列的数据读取出来,还会将其他列的数据也读取上来。一旦列里有变长数据,无疑会显著拖慢扫描速度。这是怎么做到的?在哪里设置的需要读取所有列?以及为什么要这么做?1、首先,需要知道如何确定扫...

2022-07-03 22:43:22 49

原创 PG的synchronous_commit

PostgreSQL复制中有个很重要的参数:synchronous_commit。它决定何时向客户端确认事务提交成功。这个参数不仅仅关于主备同步,还有更广泛的含义,对于单机PG实例也很有用。为了更好地理解,需要了解WAL记录的整个传播过程以及可以接受提交确认的各个阶段。这使得我们能够为每个事务选择不同级别的持久性。持久性的级别越低,确认越快,从而提高系统整体吞吐量和性能。...

2022-06-17 21:09:24 283

原创 GP/PG从MinimalTuple转换TupleTableSlot需要理解的数据结构

比如在排序中,待排序的结构SortTuple中存储的是MinimalTupleData,里面包含有排序需要的值等信息。排好序后,需要将MinimalTupleData再此转换成TupleTableSlot。转换由函数tts_minimal_store_tuple完成,可以看到MinimalTupleData并没有解析,而是直接放到了MinimalTupleTableSlo......

2022-06-06 23:36:28 51

原创 openGauss向量化在排序中的一个疑惑

openGauss向量化引擎在排序过程中,需要通过UseMem函数统计其内存使用。比如在Batchsortstate::InitCommon函数中:第732行m_storeColumns.Init会申请对m_storeColumns.m_memValues申请10240* sizeof(MultiColumns));但是在第735行统计使用内存的时候,从m_storeCo......

2022-05-31 22:50:18 29

翻译 [译]PG15加速排序性能

PG15加速排序性能介绍近年来,PG对排序进行了一些改进。PG15的开发周期中,我和Ronan、Dunklau、Thomas Munro、Heikki Linnakangas对PG做了一些更改以加快排序速度。当PG15于2022年底推出时,排序的每一项改进都应该可用。排序主要用于ORDER BY查询,也可用于:1)使用ORDER BY子句聚合函数2)GROUP BY查......

2022-05-21 21:43:13 218

翻译 [译]逻辑复制的Tablesync workers

逻辑复制的Tablesync workers富士通的OSS团队和其他OSS社区成员合作,一直在贡献代码增强PG的逻辑复制功能。逻辑复制的PUBLISHER/SUBSCRIBER模型设计的基础是如何使用一个后台进程完成订阅功能。本文介绍订阅进程的一些背景知识以及我们对Tablesync进程做的一些增强。我们在这方面所做的大部分工作都不是面向用户的;有必要提供一些背景信息,以......

2022-05-12 23:20:32 36

翻译 [译]PG复制和自动故障转移--2

PostgreSQL 的预写日志 (WAL) 示例1)SELECT datname, oid FROM pg_database WHERE datname = 'postgres';datname | oid ----------+-------postgres | 15709Note the database OID, i.e. 157092)SELECT...

2022-04-27 21:45:58 93

翻译 [译]PG复制和自动故障转移--1

什么是PG复制将数据从一个服务器复制到另一个服务器的过程就是PG复制。源数据库服务器通常称为Master,而接收复制数据的数据库服务器称为Replica服务器。PG中的自动故障转移是什么PG中设置和配置物理流复制后,如果服务器的master发送故障,则可以进行故障转移。故障转移是描述恢复过程的属于。PG中可能需要一些实际,特别是因为PG本身不提供用于检测服务器故障的内置工......

2022-04-26 22:11:34 90

原创 PG/GP排序中的abbreviated key

PG/GP排序私有状态结构Tuplesortstate中有一个成员SortSupport sortKeys;而sortKeys中有这么几个成员abbreviate、abbrev***:"abbreviate" concerns whether or not the abbreviated key optimization is applicable in principl...

2022-04-20 07:30:00 98

原创 PG/GP group by expression语法

GROUP BY在关系数据库中比较常见,他是SQL和PG不可或缺的一个语法。除了可以使用简单字段分组外,还可以使用表达式以更加复杂的方式进行分组。首先看下简单的GROUP BY语句:postgres=# select *from t1;id1 | name | class | score-----+----------+-------+-------1 |...

2022-04-18 22:10:58 881

原创 PG/GP limit...offset...实现机制

主要介绍limit...offset...是如何实现的。首先看下数据结构。1数据结构Limit算子的描述结构式LimitState,它的结构如上图。PlanState是计划节点的描述信息;重要结构成员limitOffset和limitCount分别是limit算子计算offset和limit返回数量的表达式计算步骤,这个结构在ExecInitLimit中进行初始化;off...

2022-04-16 20:40:34 293

翻译 [译]理解PG如何执行一个查询-2

LimitLimit算子用于限制结果集的大小。PG使用limit算子进行limit和offset处理。Limit算子将输入集前x行去掉,返回接着的y行,再将剩下的丢弃。如果查询中包括offset,x表示offset的数量,否则x为0.如果查询中包含Limit,y表示limit数量,否则y是输入集的大小。输入集的顺序对LIMIT运算符并不重要,但它通常对整个查询计划很重要。......

2022-04-12 22:34:40 146

翻译 [译]理解PG如何执行一个查询-1

理解PG如何执行一个查询PG服务器收到客户端发来的查询后,查询的文本交给解析器。解析器扫描查询并检查它的语法。若语法正确,解析器会将查询文本转换成解析树。解析树是一种以正式、明确的形式表示查询含义的数据结构。给定查询:SELECT customer_name, balance FROM customers WHERE balance > 0 ORDER BY bal......

2022-04-11 07:00:00 98

原创 PG的空值相加如何实现

PostgreSQL数据库中,对于NULL值相加的处理:任何数值和NULL相加都得NULL。postgres=# create table t3(id1 int,id2 int);CREATE TABLEpostgres=# insert into t3 select 1,2;INSERT 0 1postgres=# insert into t3 select 1...

2022-04-10 15:39:13 335

原创 PG14 IO向量化

PostgreSQL14新增了一个特性,对IO进行向量化。提供pg_preadv和pg_pwritev函数,以提供同步向量化文件IO接口。这些映射到preadv和pwritev函数,并且为没有这个函数的系统提供回退实现。还提供了一个封装函数pg_pwritev_with_retry以对short write进行自动重试。并在上面的基础上使用向量化IO填充新的WAL段文件。......

2022-04-05 21:35:45 45

原创 PG12/GP7操作符+的实现[更正]

发现微信公众号仅能对已发布文字中文字进行修改。另加一篇更正昨天结构体之间关系。投影的targetlist链表其实长度仅为1,里面为操作符的TableEntry:OpExpr,包括操作符oid、操作符对于函数的oid、入参链表。入参链表即两个Var也就是列id1、id2的描述。最终表达式计算时,还需要最后一步EEOP_ASSIGN_TMP,将+计算的结果存储到投影表达式pi......

2022-03-31 22:14:35 44

空空如也

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

TA关注的人

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