PostgreSQL SQL调优案例实录

最近在项目上遇到一个SQL问题,以为挺有意思的,在这里给你们分享下。事情的发生是这样的:忽然有一天发现项目中数据库Postgresql的一个主要的表(数据量也很大)相关的SQL session都很是慢,即便是随便一个查询语句也是这样。如下是对排查问题过程的总结。sql


1)遇到这样的问题,第一反应就是查看当前数据库中活跃的sql session都有哪些?能够经过以下语句进行查找:数据库

select * from pg_stat_activity where state = 'active';

查找到这些结果以后,作一个简单的概括总结,好比哪些SQL的比例占大数。经过查找发现,活跃的SQL session并非不少,只是绝大数和系统的一个主表有关联。
session

2) 发现相关的SQL,分别是简单的select,delete:app

select * from table_name where xx_id = 'xxx';delete from table_name where xx_id = 'xxx';

这种SQL从结构上看,真的是很是简单,不该该出现很长时间不返回结果的状况。是否是数据库CPU在此时比较忙碌?
ide


3)检查数据库资源消耗状况,发现数据库资源状况很好,CPU使用率只有20%左右,那么回到第2步,继续进行问题排查。性能

4)仔细发现"xx_id" 这个字段没有添加index,而且此表因为是业务的主表,数据量很大,因此查找会全表扫描。其实delete语句也是同样,若是是加where子句的delete或者update,子句中的筛查字段若是加index效率仍是比不加index要好。测试

5)经过SQL的执行计划也能够印证这一点。select 语句比较慢,CPU是在等待磁盘io的结果返回,因此数据库磁盘统计数据(读操做也是比较频繁的)。spa

6)经过讨论,解决方案就是在xx_id上添加索引,而且添加必要的filter条件,特别是主表主键相关code

结合以上基本就解决了这个问题。你们也能够扫描并关注以下公众号“TimTest”,会有更多性能测试相关内容分享。索引

qrcode_for_gh_39009e949117_258-1.jpg