【重新发现PostgreSQL之美】- 38 肝者,将军之官,谋虑出焉. 优化器

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 大家好,这里是重新发现PostgreSQL之美 - 38 肝者,将军之官,谋虑出焉. 优化器

背景


场景:


  • HTAP业务, 企业级OLTP业务.
  • ORM(自动生成SQL, 无法优化, 数十表的SQL JOIN)

挑战:


  • 优化器弱无法选择最佳执行路径,
  • 统计信息不及时, 无法得出最佳执行计划,
  • 环境: ssd, disk 多种不同硬件组成的表空间, 怎么才能算出最佳代价
  • 执行器弱支持的数据扫描、计算方法少的可怜.

PG 解决方案:


  • 优化器强大
  • 执行器强大
  • 支持扩展执行器
  • 支持并行计算、JIT

PG的将军之官 - 优化器


谋虑的前提?

  • 数据 案例 逻辑 理想

JOIN :


穷举的问题: N的阶乘种组合方式, 表多会导致组合太多, 导致优化器根本算不出来

PG支持:

  • JOIN数超过设定参数, 自动使用遗传算法(图、TSP经典问题的解法)
  • 参数可设置, 使用固定顺序
  • 默认穷举
  • aqo插件, 类似机器学习, 适合非常复杂的SQL

join算法 :

  • nest(普通, 物化)
  • merge
  • hash
  • limit优化

in大量value优化

  • hash sub sets

并行计算:

  • 根据SQL的代价自动启用并行计算, 适合AP场景
  • 什么时候用并行? 参数阈值决定.
  • 多大并行? 自动根据代价、表的大小等相关值计算

jit:

  • 根据SQL代价自动启用JIT, 适合计算记录数多、表达式多的AP型SQL
  • 什么时候? 参数阈值决定, 当代价大于阈值, 自动使用JIT

扫描方法怎么选择:

  • 索引扫描
  • 位图扫描
  • 全表扫描
  • ctid扫描
  • ctid range scan
  • 物化扫描等
  • ...

代价因子, 可自定义

  • 适合任意硬件组合, 选出更佳的计划

选择性怎么评估?

  • 自动生成统计信息(根据数据的变化量自动生成, 所以统计信息很及时)
  • 统计信息柱状图
  • 高频次分布
  • 自定义统计信息
  • 唯一值个数
  • 字段和存储的线性相关性

prepared statement时倾斜怎么办?

custom scan provider开放接口, 适合内置scan方法不能解决的特定workload场景:

  • GPU, pg_strom, heterodb
  • citus column store, pg_pathman都用了custom scan provider. 提升性能.
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
SQL Oracle 关系型数据库
PostgreSQL JOIN limit 优化器 成本计算 改进 - mergejoin startup cost 优化
标签 PostgreSQL , join , limit , startup cost , cbo , 优化器改进 背景 PostgreSQL limit N的成本估算,是通过计算总成本A,以及估算得到的总记录数B得到: (N/B)*A 大概意思就是占比的方法计算 对于单表查询...
1226 0
|
算法 关系型数据库 C语言
PostgreSQL 当有多个索引可选时,优化器如何选择
标签 PostgreSQL , 索引 , 复合索引 , 选择 , 成本 , 优化器 背景 当一个表有很多索引时,并且一个QUERY可以使用到其中的多个索引时,数据库会如何做出选择?最终选择哪个,或者哪几个索引呢? 《PostgreSQL 多查询条件,多个索引的选择算法与问题诊断方法》 选择单个索引时,PATH可以选择index scan , index only scan, bitmap scan。
3102 0
|
存储 关系型数据库 PostgreSQL
PostgreSQL优化器之从一个关于扫描方式选择引发的思考
# 一个关于PostgreSQL使用组合索引的问题 近期阅读了《数据库查询优化器的艺术》这本书,对PG和Mysql优化器技术的轮廓有了一定了解。在阅读的过程中,因为知识背景和书本身的表述问题产生了许多困惑,这里就分享对其中一个困惑的探索过程作为看完书的总结。 在这本书的第十八章,关于PG和Mysql的优化器对于索引的优化能力对比中的一段让我困惑不已。如图一所示,单独使用组合索引的后半部分作为查
4724 0
|
关系型数据库 物联网 PostgreSQL
PostgreSQL技术周刊第16期:PostgreSQL 优化器代码概览
PostgreSQL(简称PG)的开发者们:云栖社区已有5000位PG开发者,发布了3000+PG文章(文章列表),沉淀了700+的PG精品问答(问答列表)。 PostgreSQL技术周刊会为大家介绍最新的PG技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅PostgreSQL技术周刊。
3545 0
|
SQL 算法 关系型数据库
PostgreSQL 优化器代码概览
## 简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目。上世纪末,Andrew Yu 等人在它上面搭建了第一个SQL Parser,这个版本称为Postgre95,也是加州大学伯克利分校版本的PostgreSQL的基石[1]。
1664 0
|
SQL 关系型数据库 PostgreSQL
|
关系型数据库 PostgreSQL 索引
|
关系型数据库 PostgreSQL
|
关系型数据库 测试技术 数据库
下一篇
无影云桌面