PostgreSQL SQL自动优化案例 - 极简,自动推荐索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介:

标签

PostgreSQL , 自动推荐索引 , 统计信息 , 慢SQL回溯 , TOP SQL , TOP SQL


背景

SQL自动优化是数据库的高级特性,其中包括SQL 自动rewrite,自动推荐索引,自动优化执行计划 等。

1、自动优化执行计划

目前postgrespro在做这块


Machine learning

Query planner selects “cheapest” query plan based on its cost estimation. But it’s done with many rough assumptions. This is why the estimated cost could be inadequate to real execution cost. One possibility is to improve the cost estimate mechanism itself by adding features like multivariate statistics. Another possibility is to use query execution feedback: see how estimated parameter values differ from actual parameter values. We can apply machine learning techniques to improve the cost estimates using this feedback, so DBMS would learn on its own mistakes.

We’ve already done this in a simple case, and further work is planned in the following directions:

  • Extend implemented model to cover more use cases,

  • Provide the infrastructure necessary to make our machine learning an extension.

Execution-time planning

Currently, query planning strictly precedes query execution. Sometimes it appears to be a serious limitation. When one part of a plan is already executed it could be possible to significantly improve the rest of the plan on the basis of gathered statistics. We can see two cases when this approach could be applied:

  • Online reordering of filter expressions. During sequential scan of large table it’s important to do the cheapest and the most selective checks first. However estimated selectivity and cost of filtering are inaccurate, and thus the order of applying filters based on estimates can be not optimal. But filter expressions could be reordered online on the base of statistics of their previous execution.

  • Some queries could be divided into sequence of steps when subsequent steps could be replanned on the base of results of previous steps. For instance, suppose that step 1 is a scan of table A, and step 2 is a join of tables A and B. Depending on row count and data distribution from the first step we could choose different join algorithm on the second step.

2、自动rewrite SQL,实际上PostgreSQL已经做了很多这样的工作,不过还有更多可以做的。这里有一些例子。

《PostgreSQL 优化器逻辑推理能力 源码解析》

3、自动推荐索引,就是本文要说的。

EDB已支持:https://www.enterprisedb.com/docs/en/9.5/asguide/EDB_Postgres_Advanced_Server_Guide.1.56.html

自动推荐索引的方法

1、首先要判断哪些表可能需要加索引,方法如下:

1.1、TOP SQL与慢SQL,可以从pg_stat_statements中获取。

慢 SQL还可以从日志中获取。

参考:

《PostgreSQL 如何查找TOP SQL (例如IO消耗最高的SQL)》

1.2、统计信息

从统计信息中,同样可以分析出哪些表可能需要加索引。

《PostgreSQL pg_stat_ pg_statio_ 统计信息(scan,read,fetch,hit)源码解读》

分析方法如下,

A=pg_stat_all_tables.seq_scan,代表全表扫描次数   
   
B=pg_stat_all_tables.seq_tup_read,代表返回记录数   
   
C=pg_class.reltuples,代表表的记录数   
   
D=pg_class.relpages,代表表的大小(占用了多少数据块)   
   
E=pg_statio_all_tables.heap_blks_read + pg_statio_all_tables.heap_blks_hit,代表扫描了多少个堆表的数据块   

如果A很大,并且B/A很小,并且C较大或D较大,那么说明需要加索引。

如果E/A较大,并且D或C较大,那么说明需要加索引。

判断标准就是:

大表被全表扫描了很多数据块,并返回了少量记录。

1.3、针对需要加索引的表,在pg_stat_statements中,找到对应的SQL。

2、判断需要针对哪些列加索引

针对找到的需要加索引的SQL,生成执行计划。

从执行计划中,判断哪些位置的COST较大,并且是SEQUENCE SCAN,找到对应的filter字段。

3、判断需要加什么类型的索引(btree, brin, gin, gist, sp-gist, hash, bloom, ...?)

对2得到的字段,判断应该加什么类型的索引?原理如下,根据统计信息,以及索引接口的特性,自动判断加什么类型的索引:

《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》

《PostgreSQL 9种索引的原理和应用场景》

4、记录慢SQL执行计划

记录第2步骤得到的执行计划。

5、加虚拟索引

虚拟索引,并不是针对索引,不会影响实际的执行计划,也不耗资源,方法如下:

《PostgreSQL 虚拟|虚假 索引(hypothetical index) - HypoPG》

6、查看加完索引后慢SQL执行计划是否发生变化。

使用虚拟索引生成执行计划,并对比4得到的执行计划,是否用上了索引。

方法如下:

《PostgreSQL 虚拟|虚假 索引(hypothetical index) - HypoPG》

7、输出报告

输出两个执行计划的前后对比,输出报告。

8、删除虚拟索引

9、加真实索引

用户可以查看报告,并决定是否加索引。

加索引时,可以使用并行语法,不堵塞DML操作。

Command:     CREATE INDEX   
Description: define a new index   
Syntax:   
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]   
    ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )   
    [ WITH ( storage_parameter = value [, ... ] ) ]   
    [ TABLESPACE tablespace_name ]   
    [ WHERE predicate ]   

参考

《自动选择正确索引访问接口(btree,hash,gin,gist,sp-gist,brin,bitmap...)的方法》

《PostgreSQL 9种索引的原理和应用场景》

《PostgreSQL 函数调试、诊断、优化 & auto_explain》

《PostgreSQL 统计信息pg_statistic格式及导入导出dump_stat - 兼容Oracle》

《PostgreSQL pg_stat_ pg_statio_ 统计信息(scan,read,fetch,hit)源码解读》

《PostgreSQL 如何查找TOP SQL (例如IO消耗最高的SQL)》

《如何追溯 PostgreSQL 慢查询当时的状态》

《PostgreSQL 虚拟|虚假 索引(hypothetical index) - HypoPG》

《PostgreSQL 优化器逻辑推理能力 源码解析》


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
148 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
17天前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
18天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
33 1
|
2月前
|
JSON 关系型数据库 PostgreSQL
PostgreSQL 9种索引的原理和应用场景
PostgreSQL 支持九种主要索引类型,包括 B-Tree、Hash、GiST、SP-GiST、GIN、BRIN、Bitmap、Partial 和 Unique 索引。每种索引适用于不同场景,如 B-Tree 适合范围查询和排序,Hash 仅用于等值查询,GiST 支持全文搜索和几何数据查询,GIN 适用于多值列和 JSON 数据,BRIN 适合非常大的表,Bitmap 适用于低基数列,Partial 只对部分数据创建索引,Unique 确保列值唯一。
|
4月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
4月前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
298 3
|
4月前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
121 0
|
5月前
|
SQL 大数据 API
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
107 0
|
6月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
7月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
789 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版