ITPub博客

首页 > 数据库 > 数据库开发技术 > 什么?PGSQL执行突然变慢

什么?PGSQL执行突然变慢

原创 数据库开发技术 作者:sjw1933 时间:2024-05-17 07:50:00 0 删除 编辑

作者:Digital Observer(施嘉伟)

Oracle ACE Associate: Database

PostgreSQL ACE Partner

11年数据库行业经验,现主要从事数据库服务工作

拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证

ITPUB认证专家、PolarDB开源社区技术顾问

国内某高校企业实践指导教师

公众号:Digital Observer;CSDN:施嘉伟;ITPUB:sjw1933;PGFans:施嘉伟。

PGSQL执行突然变慢的可能原因包括:数据库中的Dead Tuples累积导致性能下降,缺少或不合理的索引减慢查询速度,复杂的查询语句消耗更多资源,数据库表过大影响读写速度,内存使用不当或硬件配置不足,以及可能存在的数据库锁定或长事务等待。解决这些问题通常涉及执行VACUUM清理Dead Tuples,优化索引和查询语句,调整内存设置,升级硬件或数据库版本,以及合理设计数据库表和使用性能优化工具。

排查步骤和方法:

01
监视系统资源

使用操作系统工具监视系统资源,如 top 或 htop。

02
检查执行计划

使用 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划。

EXPLAIN ANALYZE SELECT * FROM your_table WHERE your_condition

03
统计信息更新

查看某张表的统计信息收集状态,如果近期没有手动或自动收集统计信息,则手动收集更新统计信息。

select relname,last_analyze,last_autoanalyze from pg_stat_all_tables where relname = 'your_table';

手动更新表的统计信息。

ANALYZE your_table;

04
表碎片整理

执行 VACUUM 操作。

VACUUM your_table;

05
检查索引

查看表的索引使用情况。

SELECT * FROM pg_stat_all_indexes WHERE tablename = 'your_table';

#通过查看pg_stat_all_indexes系统视图中的idx_scan来查看索引的使用情况,其代表的是在这个表上发起的索引扫描的次数,例如:
SELECT * FROM pg_stat_all_indexes WHERE relname = 'test';
 relid | indexrelid | schemaname | relname | indexrelname | idx_scan | idx_tup_read | idx_tup_fetch 
-------+------------+------------+---------+--------------+----------+--------------+---------------
 66827 |      75596 | public     | test    | test_id_idx  |       34 |          610 |           294
06
检查并发连接

检查并发连接数,看一下是不是有太多的并发。

#统计所有连接数
SELECT count(*) FROM pg_stat_activity;

#统计活跃连接数
SELECT count(*) FROM pg_stat_activity where state = 'active';
07
数据库配置

检查 PostgreSQL 配置文件。

cat /path/to/postgresql.conf
08
调整优化器选项

如果一系列手段都无法满足执行计划走更优的索引扫描,可以在事务中选择关闭优化器的全表扫描选项。

begin;
SET enable_seqscan = off;
select xxx from xxx where xxx = xxx;
end;
09
日志和错误检查

查看 PostgreSQL 的日志文件,查看有没有连接超时或者失败等情况。

tail -n 100 $PGDATA/log/postgresql-Tue.csv
10
数据库健康检查

使用 pg_stat_statements、pg_stat_activity、pg_locks 等监控工具。

11
版本升级

考虑将 PostgreSQL 升级到最新版本。

模拟案例

假设有一个表 employees,我们执行查询时突然变慢:

-- 步骤1:检查执行计划
EXPLAIN ANALYZE SELECT * FROM employees WHERE department_id = 10;

-- 步骤2:统计信息更新
ANALYZE employees;

-- 步骤3:检查索引
SELECT * FROM pg_stat_user_indexes WHERE tablename = 'employees';

-- 步骤4:监视系统资源
-- 使用操作系统工具监视 CPU、内存、磁盘和网络使用情况

-- 步骤5:查询缓存
SET enable_seqscan = off;

-- 步骤6:检查并发连接
SELECT count(*) FROM pg_stat_activity;

-- 步骤7:日志和错误检查
-- 查看 PostgreSQL 的日志文件

-- 步骤8:表碎片整理
VACUUM employees;

-- 步骤9:版本升级
-- 考虑将 PostgreSQL 升级到最新版本

-- 步骤10:数据库配置
-- 检查 PostgreSQL 配置文件

-- 步骤11:数据库健康检查
-- 使用工具如 pg_stat_statements、pg_stat_activity、pg_locks 等监控数据库的运行状况

在执行上述步骤时,你可以观察输出和日志,找到潜在的性能问题,并根据具体情况采取进一步的优化措施。


END

往期推荐:





Oracle 23ai新特性—DB_DEVELOPER_ROLE


Oracle 23ai新特性—DBMS_DICTIONARY_CHECK


分类分级在Oracle 23ai中的应用


初探Oracle 23ai——SQL*Plus新特性


国产数据库初体验——HaloDB安装

在看点这里

点击"阅读原文"


原文作者:Digital Observer;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
11年数据库行业经验,Oracle ACE、PG ACE、OCM、IBM Certified DBA、MySQL OCP、PolarDB技术专家、KCP、PCTP、PCSD、达梦师资认证、PolarDB开源社区技术顾问、ITPUB认证专家、某高校外聘教师

注册时间:2019-05-05

  • 博文量
    295
  • 访问量
    300769