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

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 【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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
tengine 虚拟化
在M2 MacBook上编译x86_64架构的Tengine
在M2 MacBook上编译x86_64架构的Tengine
464 1
|
7月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
750 0
|
3月前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
1月前
|
SQL 关系型数据库 数据库
PostgreSQL性能飙升的秘密:这几个调优技巧让你的数据库查询速度翻倍!
【10月更文挑战第25天】本文介绍了几种有效提升 PostgreSQL 数据库查询效率的方法,包括索引优化、查询优化、配置优化和硬件优化。通过合理设计索引、编写高效 SQL 查询、调整配置参数和选择合适硬件,可以显著提高数据库性能。
377 1
|
4月前
|
运维 监控 关系型数据库
【一文搞懂PGSQL】7. PostgreSQL + repmgr + witness 高可用架构
该文档介绍了如何构建基于PostgreSQL的高可用架构,利用repmgr进行集群管理和故障转移,并引入witness节点增强网络故障检测能力。repmgr是一款轻量级的开源工具,支持一键部署、自动故障转移及分布式节点管理。文档详细描述了环境搭建步骤,包括配置postgresql参数、安装与配置repmgr、注册集群节点以及配置witness节点等。此外,还提供了故障手动与自动切换的方法及常用命令,确保集群稳定运行。
|
4月前
|
缓存 关系型数据库 数据库
PostgreSQL 查询性能
【8月更文挑战第5天】PostgreSQL 查询性能
88 8
|
6月前
|
SQL 关系型数据库 数据库
Python执行PostgreSQL数据库查询语句,并打印查询结果
本文介绍了如何使用Python连接和查询PostgreSQL数据库。首先,确保安装了`psycopg2`库,然后创建数据库连接函数。接着,展示如何编写SQL查询并执行,例如从`employees`表中选取所有记录。此外,还讨论了处理查询结果、格式化输出和异常处理的方法。最后,提到了参数化查询和事务处理以增强安全性及确保数据一致性。
Python执行PostgreSQL数据库查询语句,并打印查询结果
|
5月前
|
Java 关系型数据库 API
使用Spring Boot和PostgreSQL构建高级查询
使用Spring Boot和PostgreSQL构建高级查询
|
5月前
|
SQL
云架构数据倾斜问题之在SQL数据源读取查询时合并小文件如何解决
云架构数据倾斜问题之在SQL数据源读取查询时合并小文件如何解决
|
6月前
|
SQL 关系型数据库 数据库
Python查询PostgreSQL数据库
木头左教你如何用Python连接PostgreSQL数据库:安装`psycopg2`库,建立连接,执行SQL脚本如创建表、插入数据,同时掌握错误处理和事务管理。别忘了性能优化,利用索引、批量操作提升效率。下期更精彩!💡 csvfile
Python查询PostgreSQL数据库