postgresql数据库更新慢的原因是什么

  介绍

本篇文章给大家分享的是有关postgresql数据库更新慢的原因是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1。查看语句是否有问题

复制俩个一模一样的表和数据手动执行语句发现不到一分钟就运行成功了这样就可以确认语句没有问题

2。查找影响updata的因素

我的第一反应是不是有锁有锁的情况会导致等待或者死锁

查询锁

select  w1.pid  as 等待进程,   w1.mode  as 等待锁模式,   w2.usename  as 等待用户,   w2.query  as 等待会话,   b1.pid  as 锁的进程,   b1.mode 锁的锁模式,   b2.usename  as 锁的用户,   b2.query  as 锁的会话,   b2.application_name 锁的应用,   b2.client_addr 锁的IP地址,   b2.query_start 锁的语句执行时间   得到pg_locks  w1   join  pg_stat_activity  w2 提醒w1.pid=w2.pid   join  pg_locks  b1 提醒w1.transactionid=b1.transactionid 以及w1.pid !=b1.pid   join  pg_stat_activity  b2 提醒b1.pid=b2.pid   where  not  w1.granted; SELECT  pg_terminate_backend (pid),得到pg_stat_activity  where  pid=& # 39; 62560 & # 39;

查询到有锁把锁进程杀掉重启服务继续跟踪发现5分钟后又出现锁了反复试了几次发现跟锁没有关系

3。查询参数

首先看的的是shared_buffers参数,发现也没有问题

 postgresql数据库更新慢的原因是什么

4。收缩真空表

查询数据进程时,发现自动收缩也执行10分钟还没好就查询表收缩的情况

用于服务器监控,可查询进程,时间消耗与锁相关

SELECT       C.relname 对象名称,   l.locktype 可锁对象的类型,   l.pid 进程id,   l.MODE 持有的锁模式,   l.GRANTED 是否已经对锁进行授权,   l.fastpath,   psa.datname 数据库名称,   psa.usesysid 用户id,   psa.usename 用户名称,   psa.application_name 应用程序名称,   psa.client_addr 连接的IP地址,   psa.client_port 连接使用的TCP端口号,   psa.backend_start 进程开始时间,   psa.xact_start 事务开始时间,   psa.query_start 事务执行此语句时间,   psa.state_change 事务状态改变时间,   psa.wait_event_type 等待事件类型,   psa.wait_event 等待事件,   psa.STATE 查询状态,      backend_xid 事务是否有写入操作,   backend_xmin 是否执事务快照,      psa.query 执行语句,   现在(,),安康;query_start 持续时间      从      l pg_locks    INNER  JOIN  pg_stat_activity  psa 提醒(=,,psa.pid  l.pid )   LEFT  OUTER  JOIN  pg_class  C 提醒(=,,l.relation  C.oid )   ——,where  l.relation =, & # 39; tb_base_apparatus& # 39;:: regclass      where  relkind =& # 39; " # 39;   ORDER  BY  query_start  asc

查询是否到达自动清理的表

选择   ,c.relname 表名,   ,(current_setting (& # 39; autovacuum_analyze_threshold& # 39;)::数字(12,4))+ (current_setting (& # 39; autovacuum_analyze_scale_factor& # 39;)::数字(12,4))* reltuples  AS 自动分析阈值,   ,(current_setting (& # 39; autovacuum_vacuum_threshold& # 39;)::数字(12,4))+ (current_setting (& # 39; autovacuum_vacuum_scale_factor& # 39;)::数字(12,4))* reltuples  AS 自动清理阈值,   0,reltuples::小数(19日),活元组数,   0,n_dead_tup::小数(19日),死元组数   从   ,pg_class  c       LEFT  JOIN  pg_stat_all_tables  d      ,提醒C.relname =d.relname   在哪里   ,c.relname 像# 39;结核病% & # 39;,以及reltuples 在0   n_dead_tup 害;祝辞,(current_setting (& # 39; autovacuum_analyze_threshold& # 39;)::数字(12,4))+ (current_setting (& # 39; autovacuum_analyze_scale_factor& # 39;)::数字(12,4))* reltuples;

然后发现死元祖太多
然后我手动收缩了这个表之后更新的就快了

VACUUM  FULL  VERBOSE 表名;   VACUUM  FULL  VERBOSE  ANALYZE 表名;

postgresql数据库更新慢的原因是什么