PostgreSQL码农集散地

每天5分钟PG聊通透第18期,如何找到捣蛋SQL?

参考文档点击文末阅读原文打开; 推荐《最好的PostgreSQL学习镜像》;


每天5分钟PG聊通透第18期,如何找到捣蛋SQL?

背景

  • 问题说明(现象、环境)
  • 分析原因
  • 结论和解决办法

链接、驱动、SQL

18、为什么性能差? 如何找到捣蛋鬼SQL?

https://www.bilibili.com/video/BV1X3411v7sn/

性能差的原因千差万别, 这里重点讲一讲数据库SQL层面导致的性能差.

1、抓取性能异常时间段的TOP SQL

session_preload_libraries = 'pg_stat_statements,auto_explain'  
compute_query_id = on  
pg_stat_statements.max = 10000  
pg_stat_statements.track = all  
pg_stat_statements.track_utility = on  
pg_stat_statements.track_planning = on  

  create extension pg_stat_statements;  

例如, 开始时间为 '2021-12-22 10:00:00'

select pg_stat_statements_reset();  

结束时间, 保存pg_stat_statements快照

drop table if exists abc_pg_stat_statements ;  
create table abc_pg_stat_statements as select '2021-12-22 10:00:00'::timestamp,now()::timestamp,* from pg_stat_statements;  

分析各个维度的top sql

postgres=# select * from abc_pg_stat_statements order by total_exec_time + total_plan_time desc limit 1;  
-[ RECORD 1 ]-------+--------------------------------------------------------------------  
timestamp           | 2021-12-22 10:00:00  
now                 | 2021-12-22 16:47:28.569557  
userid              | 10  
dbid                | 14238  
toplevel            | t  
queryid             | 7731771931230979388  
query               | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2  
plans               | 0  
total_plan_time     | 0  
min_plan_time       | 0  
max_plan_time       | 0  
mean_plan_time      | 0  
stddev_plan_time    | 0  
calls               | 435236  
total_exec_time     | 371563.23506400164  
min_exec_time       | 0.008787000000000001  
max_exec_time       | 287.247661  
mean_exec_time      | 0.8537051968679229  
stddev_exec_time    | 7.490290707841332  
rows                | 435236  
shared_blks_hit     | 6840657  
shared_blks_read    | 1  
shared_blks_dirtied | 135  
shared_blks_written | 201  
local_blks_hit      | 0  
local_blks_read     | 0  
local_blks_dirtied  | 0  
local_blks_written  | 0  
temp_blks_read      | 0  
temp_blks_written   | 0  
blk_read_time       | 0  -- 跟踪IO时间需要开启 track_io_timing    
blk_write_time      | 0  -- 跟踪IO时间需要开启 track_io_timing    
wal_records         | 466720  
wal_fpi             | 0  
wal_bytes           | 34867024  

2、优化方法

例子参考:

《PostgreSQL 如何查找TOP SQL (例如IO消耗最高的SQL) (包含SQL优化内容) - 珍藏级 - 数据库慢、卡死、连接爆增、慢查询多、OOM、crash、in recovery、崩溃等怎么办?怎么优化?怎么诊断?》

3、排查过去已经发生的问题

  • auto_explain
  • awr
  • performance insight

其他:
1、宏观资源消耗瓶颈

《2019-PostgreSQL 2天体系化培训 - 适合DBA》

《DB吐槽大会,第48期 - PG 性能问题发现和分析能力较弱》

参考:
《PostgreSQL 如何查找TOP SQL (例如IO消耗最高的SQL) (包含SQL优化内容) - 珍藏级 - 数据库慢、卡死、连接爆增、慢查询多、OOM、crash、in recovery、崩溃等怎么办?怎么优化?怎么诊断?》

《PostgreSQL 活跃会话历史记录插件 - pgsentinel 类似performance insight \ Oracle ASH Active Session History》

《PostgreSQL Oracle 兼容性之 - performance insight - AWS performance insight 理念与实现解读 - 珍藏级》

《PostgreSQL pg_stat_statements AWR 插件 pg_stat_monitor , 过去任何时间段性能分析 [推荐、收藏]》

《PostgreSQL 兼容Oracle插件 - pgpro-pwr AWR 插件》

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

《2019-PostgreSQL 2天体系化培训 - 适合DBA》

《DB吐槽大会,第48期 - PG 性能问题发现和分析能力较弱》

https://www.postgresql.org/docs/14/pgstatstatements.html

本期彩蛋 - 数据库生态工具&国产开源数据库

用好周边工具, 数据库管理水平战胜90%老司机

1、管控软件

云猿生开源的kubeblocks, 如果你要管理很多套并且种类很多的数据库产品, 推荐选择.

  • https://github.com/apecloud/kubeblocks

乘数开源的clup, 专门用来管理PostgreSQL和PolarDB的集群管理软件, 如果你要管理很多套数据库, 推荐选择. 并且clup还提供了企业版、自研的连接池、分布式存储、一体机、备份平台等, 企业可以关注一下.

  • https://www.csudata.com/

若航开源的pigsty, 集成了300多个PG插件的PG集群和PolarDB集群管理软件, 如果你要管理很多套数据库, 并且对插件有特别多的需求, 推荐选择.

  • https://pigsty.cc/zh/

2、审计监控诊断优化

海信聚好看的 DBdoctor, 采用ebpf技术, 在对数据库几乎没有影响的情况下实时监控数据库和服务器的各项指标, 发现和诊断问题根因非常方便.

  • https://www.dbdoctor.cn/

Bytebase 的目标非常远大, 是位于您和数据库之间的中间件。它是数据库 DevOps 的 GitLab/GitHub,专为开发人员、DBA 和平台工程师打造。

  • https://bytebase.cc/docs/introduction/what-is-bytebase/

D-Smart, Oracle老前辈白老大他们搞的, 专注企业级市场, 将业界顶级DBA经验的产品化作品, 产品功能包括数据库监控、诊断、优化等.

  • https://www.modb.pro/db/567140

3、国产数据库IDE

这个关注的人比较少但是确是开发者的必备工具,可以看一下tony老师的deskui: https://www.deskui.com

4、数据同步&迁移&备份恢复

NineData, 老领导出去创业做的产品, 产品涵盖了数据同步、迁移、备份、比对、devops、chatDBA等.

  • https://www.ninedata.cloud/home

DSG, 非常老牌的数据库同步迁移企业级产品, 支持各种数据库的异构和同构迁移, 用他们的话说, 没有dsg搞不定的迁移, 比goldengate还牛.

  • https://www.dsgdata.com/

除了PolarDB还非常值得关注的几款PG栈国产数据库:

HaloDB(基于PG兼容PostgreSQL、Oracle、MySQL. http://www.halodbtech.com/ )、IvorySQL(基于开源PG兼容PG、Oracle. https://www.ivorysql.org/zh-cn/ )、ProtonBase(云原生分布式数仓. https://protonbase.com/ )、文武数据库(https://ww-it.cn)

参考文档点击阅读原文获得


感谢关注我的github (https://github.com/digoal/blog) 及视频号:

Image

彩蛋2:  全国大学生数据库创新设计赛  点击报名