【PostgreSQL 架构】PostgreSQL 11和即时编译查询

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 【PostgreSQL 架构】PostgreSQL 11和即时编译查询

PostgreSQL 11正在酝酿之中,即将发布。同时,使用您自己的应用程序对其进行测试是确保社区在零点发行之前捕获所有剩余错误的好方法。

下一个PostgreSQL版本的重大变化之一是Andres Freund在查询执行器引擎上的工作成果。Andres已经在系统的这一部分上工作了一段时间,在下一发行版中,我们将看到执行引擎中的一个新组件:一个JIT表达式编译器!

基准和TPC-H

我喜欢在Citus Data进行工程工作以通过Citus扩展扩展PostgreSQL的一件事就是,我可以运行基准测试!基准测试是一个很好的工具,可以显示性能改进可带来哪些好处。当前,JIT表达式编译器在以下情况下效果最佳:

  • 该查询包含多个复杂的表达式,例如聚合。
  • 该查询读取了大量数据,但没有IO资源短缺。
  • 该查询非常复杂,以至于需要花费大量的JIT精力。

通过主键代理ID获取某些信息的查询不太适合查看PostgreSQL中新的JIT基础结构所提供的改进。

TPC-H基准测试第1季度查询可以很好地评估新执行程序堆栈的影响,因此我们在这里使用它。

基准测试的规范可在137页的名为TPC Benchmark™H的PDF文档中找到。该规范中的每个查询都附带一个业务问题,因此请参阅第一季度

定价摘要报告查询(Q1)

此查询报告已开票,发货和退回的业务量。

定价摘要报告查询提供了给定日期发货的所有订单项的摘要定价报告。该日期位于数据库中包含的最晚发货日期的60-120天之内。该查询列出了扩展价格,折扣扩展价格,折扣扩展价格加税,平均数量,平均扩展价格和平均折扣的总计。这些聚合按RETURNFLAG和LINESTATUS分组,并按RETURNFLAG和LINESTATUS的升序排列。包括每个组中的行项目数的计数。

这就是SQL中的样子:

select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty, sum(l_extendedprice) as sum_base_price, sum(l_extendedprice * (1 - l_discount)) as sum_disc_price, sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge, avg(l_quantity) as avg_qty, avg(l_extendedprice) as avg_price, avg(l_discount) as avg_disc, count(*) as count_order from lineitem where l_shipdate <= date '1998-12-01' - interval ':1' day group by l_returnflag, l_linestatus order by l_returnflag, l_linestatus :n -1 ;

此外,该规范还提供有关查询的注释:

注释:1998-12-01是数据库填充中定义的最高可能的发货日期。(这是ENDDATE-30)。该查询将包括该日期之前减去DELTA天之前发货的所有订单项。目的是选择DELTA,以便扫描表中95%至97%的行。

为了使查询有资格显示新的PostgreSQL表达式以执行JIT编译器,我们将选择适合内存的比例因子。

结果

选择10的比例因子时,我们得到的数据库大小为22GB,包括创建的索引。此处使用的完整架构在tpch-schema.sql上可用,而索引在tpch-pkeys.sql和tpch-index.sql上。

在我的测试中,执行TPCH Q1查询时,PostgreSQL 11比PostgreSQL 10快29.31%。在循环中运行查询10分钟时,当PostgreSQL 10仅执行同一查询时,它允许PostgreSQL 11执行30次。21次。


如我们所见,PostgreSQL 10中的Andres工作已经对该查询产生了巨大影响。在此版本中,对执行程序的表达式评估进行了全面修订,以考虑到CPU缓存行和指令管道。在此基准测试中,我们选择在PostgreSQL中禁用并行查询,以便评估主要由新执行程序导致的改进。PostgreSQL 10 then 11中的并行支持能够大大增强我们在此看到的查询时间!

在PostgreSQL 11中,由于在查询计划时使用LLVM编译器基础结构,SQL表达式已转换为机器代码,这对查询性能产生了另一个非常好的影响!

工具

基准测试规范有两个文件可用:

llvm-q1-infra.ini定义了用于运行此测试的AWS EC2实例。

  • 在这里您可以看到我们选择了c5.4xlarge实例来托管我们的PostgreSQL数据库。它们每个都有30GB的RAM,因此我们的22GB数据集和索引非常适合RAM。
  • 另外,我们使用http://apt.postgresql.org中的软件包选择了debian操作系统,该软件包提供了我们在此处一直使用的PostgreSQL 11开发快照。

llvm-q1-schedule.ini定义了我们的基准计划,这在这里非常简单:

[schedule]
full   = initdb, single-user-stream, multi-user-stream


  • 在initdb阶段,在8个并发进程中加载比例因子10的数据,每个进程一次执行一个步骤,考虑到我们将工作负载分为10个子进程。
  • 我们在这里使用TPC-H s语。另外,在我研究的PostgreSQL的TPC-H实现中,我增加了对直接加载机制的支持,这意味着dbgen工具连接到数据库服务器并使用COPY协议。
  • 然后执行一个单用户流,该流包括在客户端的单个CPU上运行尽可能多的查询,并持续10分钟。
  • 然后执行一个多用户流,该流包含从所有8个CPU并行运行尽可能多的查询,并持续10分钟。

此处使用的基准测试工具是“开源”,可从https://github.com/dimitri/tpch-citus免费获得。这是一个简单的应用程序,可以自动在动态的AWS EC2基础架构中运行TPCH。

这个想法是,在创建几个配置文件后,可以在多个系统上并行驱动一个完整的基准测试,并在合并的数据库中检索结果以供以后分析。

此外,该项目还包括适用于PostgreSQL的TPCH C代码版本,并使用COPY协议实现直接加载。然后,该项目使用dbgen工具生成数据,并使用qgen工具为每个客户端根据规范生成新的查询流。

期待未来的Postgres

PostgreSQL 11引入了一个新的PostgreSQL执行引擎,借助LLVM框架,该引擎将您的SQL代码编译为机器代码。对于足够昂贵的查询(遍历许多行并一次又一次地计算表达式的查询),其好处可能是巨大的!

为了帮助PostgreSQL实现版本11的最佳发行,请考虑在测试和CI环境中使用beta版本,并报告您可能会发现的所有错误或性能下降,并通过一种简便的方法来再现它们。有关声明和如何报告相关发现的详细信息,请参见PostgreSQL 10.5和11 Beta 3 Released。

在我们的基准测试中,PostgreSQL 11 JIT是一项很棒的技术,它提供了高达29.31%的速度改进,在使用PostgreSQL 10时以20.5s的比例因子10执行TPC-H Q1而不是29s。

在Citus,我们几个月来一直在忙于针对PostgreSQL测试Citus扩展。因为Citus是Postgres的纯粹扩展,而不是fork,这意味着当时候到来时,您应该能够升级以获得Postgres 11的所有新优势,以帮助您保持扩展。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6天前
|
关系型数据库 分布式数据库 数据库
PolarDB常见问题之加了索引但是查询没有使用如何解决
PolarDB是阿里云推出的下一代关系型数据库,具有高性能、高可用性和弹性伸缩能力,适用于大规模数据处理场景。本汇总囊括了PolarDB使用中用户可能遭遇的一系列常见问题及解答,旨在为数据库管理员和开发者提供全面的问题指导,确保数据库平稳运行和优化使用体验。
|
6天前
|
存储 关系型数据库 分布式数据库
电子好书发您分享《PolarDB分布式版架构介绍PolarDB分布式版架构介绍》
**《PolarDB分布式版架构介绍》电子书分享:** 探索阿里云PolarDB分布式设计,采用计算存储分离,借助GMS、CN组件实现大规模扩展。[阅读更多](https://developer.aliyun.com/ebook/8332/116553?spm=a2c6h.26392459.ebook-detail.5.3b3b2ccbVVjjt0)
21 3
|
6天前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
6天前
|
存储 SQL 关系型数据库
关系型数据库强大的查询功能
【5月更文挑战第9天】关系型数据库强大的查询功能
10 3
|
6天前
|
缓存 关系型数据库 数据库
关系型数据库高效查询和统计
【5月更文挑战第8天】关系型数据库高效查询和统计
22 7
|
1天前
|
存储 关系型数据库 分布式数据库
【PolarDB开源】深入PolarDB内核:探究存储计算分离架构的设计哲学
【5月更文挑战第20天】PolarDB是阿里巴巴的云原生分布式数据库,以其存储计算分离架构为核心,解决了传统数据库的扩展性和资源灵活性问题。该架构将数据存储和计算处理分开,实现高性能(通过RDMA加速数据传输)、高可用性(多副本冗余保证数据可靠性)和灵活扩展(计算资源独立扩展)。通过动态添加计算节点以应对业务流量变化,PolarDB展示了其在云时代应对复杂业务场景的能力。随着开源项目的进展,PolarDB将持续推动数据库技术发展。
28 6
|
5天前
|
存储 SQL 关系型数据库
关系型数据库结构化数据存储查询方式
【5月更文挑战第10天】关系型数据库结构化数据存储查询方式
20 2
|
6天前
|
存储 Cloud Native 关系型数据库
PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
【5月更文挑战第14天】PolarDB-X 是面向超高并发、海量存储和复杂查询场景设计的云原生分布式数据库系统
43 2
|
6天前
|
缓存 监控 负载均衡
关系型数据库设计集群架构
【5月更文挑战第5天】关系型数据库设计集群架构
22 3
关系型数据库设计集群架构
|
6天前
|
关系型数据库 Linux 分布式数据库
源码编译实现PolarDB-X部署安装的体验报告
本文档记录了编译安装PolarDB-X的步骤,包括设置CentOS开发环境、从GitHub获取源码、编译(耗时较长)、解决依赖和权限问题、安装部署及测试验证。作者建议优化文档细节、减少编译时间、改进错误提示,并提议提供一键安装依赖脚本、新手视频教程及加强社区支持。整个过程虽有挑战,但具有成就感。
20 0