GPDB中AOCO列存页的checksum

简介: GPDB中AOCO列存页的checksum

GPDBAOCO列存页的checksum为了保证数据的正确性,AOCO列存页采用CRC32即循环冗余校验算法来进行校验。首先看下页结构。页类型有四种:AOSmallContentHeaderAOLargeContentHeaderAONonBulkDenseContentHeaderAOBulkDenseContentHeader。页头的大小都是8个字节。除了这些内容外,页头其实还有firstRowNumchecksum,但这两个成员在计算时归到了数据那部分。下面我们以SmallContentHeader为例来讲解下checksum

页头部分结构如上图所示。Checksum部分大小为8字节,分为2部分:block checksumheader checksum。首先计算block checksum,其实就是数据部分的checksumfirstRowNumvalue部分的crc值;然后再计算header checksumAoHeader_RegularSizeblock checksum部分的crc值。这样通过两个checksum来分别保证页头和数据部分的正确性。我们看下计算流程:计算时先计算block checksum,存储位置位于第1个crc的位置,计算内容从firstRowNum开始的所有数据。接着计算header checksum,存储位置位于第2个crc位置,计算内容从页头开始一直到第一个crc的结尾。AppendOnlyStorageFormat_AddBlockHeaderChecksums函数计算checksum

再看下,什么时候进行校验:

也就是当从磁盘上加载上来列内容后,会立即通过函数


AppendOnlyStorageFormat_VerifyHeaderChecksum

进行页头的checksum校验,然后读取块内容时调用函数


AppendOnlyStorageFormat_VerifyBlockChecksum

进行block checksum校验。

目录
相关文章
|
存储 关系型数据库 数据库
How to Optimize PostgreSQL Logical Replication
How to Optimize PostgreSQL Logical Replication
73 0
How to Optimize PostgreSQL Logical Replication
|
SQL NoSQL 数据库
GPDB中gp_vmem_protect_limit参数的意义
GPDB中gp_vmem_protect_limit参数的意义
144 0
GPDB6和GPDB7直连primary命令的不同
GPDB6和GPDB7直连primary命令的不同
109 0
|
存储 监控 算法
PostgreSQL checksum
在计算机系统中,[checksum](https://en.wikipedia.org/wiki/Checksum) 通常用于校验数据在传输或存取过程中是否发生错误。PostgreSQL 从 9.3 开始支持 checksum,以发现数据因磁盘、 I/O 损坏等原因造成的数据异常。
3960 0
|
SQL 数据库 数据库管理
Replication-Replication Distribution Subsystem: agent xxxxxx failed. Column names in each table must be unique
原文:Replication-Replication Distribution Subsystem: agent xxxxxx failed. Column names in each table must be unique   最近遇到一个关于发布订阅(Replication)的奇葩问题,特此记录一下这个案例。
1027 0
|
Oracle 网络协议 关系型数据库
|
算法 数据安全/隐私保护 SQL