PostgreSQL列存增加更新和删除功能

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PostgreSQL列存增加更新和删除功能

PostgreSQL列存增加更新和删除功能


Hydra是企业级数据仓库的开源替代品。速度快且功能丰富,开发人员可以更快的构建更好的分析。支持列存PG的更新和删除是#1客户功能请求,现在GA了。之前博文“如何为分析构建最快的PG数据库”中,回顾了Hydra团队如何将列存、向量化和查询并行化添加到PG中,以及使用ClickBench的基准测试结果。目前对WHERE进行了向量化但未用SIMD,声称很快会提供。平均下来,查询性能比基本PG提高了23!这也太夸张了吧,可以弄下来测试下,文末有源码地址。


如何工作


更新和删除是关系型数据库中一些最常见的功能。虽然append-only存储对不可变数据很有用,但缺乏其他数据库任务所需的灵活性。PG中的更新和删除并不是物理删除,而是在heap存储的tuple header中标记删除。


Hydra实现


列存储功能依赖于columnar schema中的几个元数据表。例如columnar.stripe表包含事务当前可见的所有stripes,这些信息用来读取和定位列存表的stripes

Heap表通过MVCC在并发环境中提供数据的一致性版本。每个SQL语句可以看到一段时间之前的快照数据,而不管底层数据的当前状态如何。您可以想象当两个并发事务处于活动状态时的情况 - A B。如果事务 A 向表中添加行,那么另一个事务将无法看到它们,因为事务 B 中的条目将不可见,即使columnar.stripe它们对事务 A 可见。

每个stripe包含15chunk,每个chunk最多包含10,000行,每个chunk的元数据存储在columnar.chunk。该表可以根据chunk的最小值和最大值过滤chunk。每个chunk列在该表都有记录,因此执行过滤(WHERE)时,将根据最小值和最大值在读取chunk前检查这些值。

由于Hydra列存最初不可变,仅能追加,需要一些方法来标记列存外更新和删除的行。为此,添加了一个columnar.row_mask堆表来检查是否应跳过一行,从而模拟DML功能。

表的定义columnar.row_mask

    CREATE TABLE row_mask (
        id BIGINT NOT NULL,
        storage_id BIGINT NOT NULL,
        start_row_number BIGINT NOT NULL,
        end_row_number BIGINT NOT NULL,
        mask BYTEA,
        PRIMARY KEY (id, storage_id, start_row_number, end_row_number)
    ) WITH (user_catalog_table = true);
    ALTER TABLE columnar.row_mask ADD CONSTRAINT row_mask_stripe_unique
    UNIQUE (storage_id, start_row_number);

    每个columnar.row_mask条目都与一个写入的chunk相关联。当刷写stripe时,也会为stripe中的每个chunk创建一个条目。该表几乎是完全静态的——除了mask之外的所有列都不会改变。mask是一个字节数组,其中每个位对应块中的一行--对于每个块,最多使用 1125 个字节。最初所有位都设置为零(可见)。当删除一行时,我们会将相应的位设置为1,表示扫描时应跳过该行。

    Hydra的列存DELETE命令使用每个row_mask行的mask列逻辑标记已经删除的行,并在未来查询中隐藏他们。UPDATE命令类似,组合DELETEINSERT操作,但是不会为逻辑删除的元组和新插入的元组之间留下任何链接。

    列存表并发修改时锁表粒度是全表。


    最佳实践


    检查行是否被删除有一些开销——每扫描 100 万行大约需要 2 毫秒。只有在未过滤的情况下才会检查行,因此性能取决于WHERE查询中的子句。此外,不会检查没有删除行的块,这意味着未修改数据的性能非常快。

    更新和删除数据的速度远不如插入数据快,因此应该谨慎进行。如果我们预计数据不会更改,则列式存储效果最好。由于每个事务都会创建一个stripe,因此理想情况下,您应该在单个批处理事务中执行尽可能多的更新。我们将在未来的版本中研究优化此行为。


    下一步


    计划通过VACUUM回收未使用的空间。通过堆表来对其进行并发控制。

    GitHub分支地址:https://github.com/hydradatabase/hydra


    原文


    https://blog.hydra.so/blog/2023-03-02-columnar-updates-and-deletes

    相关实践学习
    使用PolarDB和ECS搭建门户网站
    本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
    阿里云数据库产品家族及特性
    阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
    目录
    相关文章
    |
    5天前
    |
    关系型数据库 Serverless 分布式数据库
    【公测】PolarDB PostgreSQL版Serverless功能免费使用​!
    【公测】PolarDB PostgreSQL版Serverless功能免费使用​,公测于2024年3月28日开始,持续三个月,公测期间可以免费使用!
    |
    5天前
    |
    存储 关系型数据库 MySQL
    PolarDB优势功能
    PolarDB优势功能
    |
    5天前
    |
    关系型数据库 Serverless 分布式数据库
    PolarDB PostgreSQL版Serverless功能上线公测啦,公测期间免费使用!
    Serverless数据库能够使得数据库集群资源随客户业务负载动态弹性扩缩,将客户从复杂的业务资源评估和运维工作中解放出来。PolarDB PostgreSQL版 Serverless提供了CPU、内存、存储、网络资源的实时弹性能力,构建计算与存储分离架构下的 PolarDB PostgreSQL版产品新形态。
    |
    5天前
    |
    关系型数据库 MySQL 分布式数据库
    PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
    【5月更文挑战第13天】PolarDB MySQL版集群版本支持库表恢复功能的版本要求是什么?
    10 0
    |
    5天前
    |
    SQL 容灾 关系型数据库
    [版本更新] PolarDB-X V2.4 列存引擎开源正式发布
    [版本更新] PolarDB-X V2.4 列存引擎开源正式发布!
    [版本更新] PolarDB-X V2.4 列存引擎开源正式发布
    |
    5天前
    |
    SQL 运维 关系型数据库
    PolarDB产品使用合集之PolarDB 2.3.0 版本的 CDC 功能支持 Polardb-X 到 Polardb-X 的数据同步吗
    PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
    |
    5天前
    |
    关系型数据库 MySQL 分布式数据库
    PolarDB产品使用合集之PolarDB MySQL标准版中带有分区功能吗
    PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
    |
    5天前
    |
    SQL 关系型数据库 分布式数据库
    在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
    在PolarDB for PostgreSQL中,你可以使用LIKE运算符来实现类似的查询功能,而不是使用IF函数
    50 7
    |
    5天前
    |
    关系型数据库 Linux Shell
    Centos系统上安装PostgreSQL和常用PostgreSQL功能
    Centos系统上安装PostgreSQL和常用PostgreSQL功能
    |
    5天前
    |
    关系型数据库 MySQL 分布式数据库
    PolarDB MySQL企业版与标准版功能对比:如何选择适合您的版本?
    随着数字化时代的到来,企业对于数据处理的需求越来越高,而数据库作为数据处理的核心,其性能和成本成为了企业关注的焦点。阿里云全新推出的PolarDB MySQL企业版和标准版,以全新的架构和优化,为企业提供了高性能、低成本的数据库解决方案。但在功能上,这两个版本有很多差异,我们该如何选择呢?
    73 2