外观
GaussDB 性能诊断命令
查询性能诊断
执行计划查看
- explain:显示SQL语句的执行计划,帮助分析查询性能瓶颈sql
-- 基本执行计划 EXPLAIN SELECT * FROM table_name WHERE id = 1; -- 执行计划加实际运行时间 EXPLAIN ANALYZE SELECT * FROM table_name WHERE id = 1; -- 详细执行计划 EXPLAIN VERBOSE SELECT * FROM table_name WHERE id = 1;
慢查询分析
- pg_stat_statements:统计SQL语句的执行情况,包括调用次数、执行时间等sql
-- 启用pg_stat_statements扩展 CREATE EXTENSION pg_stat_statements; -- 查看慢查询统计,按总执行时间排序 SELECT queryid, query, calls, total_time, mean_time, rows FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10; -- 重置统计信息 SELECT pg_stat_statements_reset();
阻塞查询检测
- pg_locks:查看数据库锁信息,识别阻塞查询sql
-- 查看所有锁 SELECT * FROM pg_locks; -- 查看阻塞的查询,显示阻塞和被阻塞的进程信息 SELECT blocked_locks.pid AS 被阻塞进程ID, blocked_activity.usename AS 被阻塞用户, blocking_locks.pid AS 阻塞进程ID, blocking_activity.usename AS 阻塞用户, blocked_activity.query AS 被阻塞查询, blocking_activity.query AS 阻塞查询 FROM pg_catalog.pg_locks blocked_locks JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid WHERE NOT blocked_locks.granted;
系统状态诊断
数据库状态查看
gs_ctl:GaussDB自带的控制工具,用于查看数据库状态
bash# 查看数据库状态 gs_ctl status -D /data/gaussdb # 查看数据库详细信息 gs_ctl status -D /data/gaussdb -vpg_stat_database:查看数据库级别的统计信息
sqlSELECT datname AS 数据库名, numbackends AS 连接数, xact_commit AS 提交事务数, xact_rollback AS 回滚事务数, blks_read AS 物理读块数, blks_hit AS 缓存命中块数 FROM pg_stat_database;
连接状态查看
- pg_stat_activity:查看数据库连接的详细状态sql
-- 查看所有连接 SELECT * FROM pg_stat_activity; -- 查看活跃连接 SELECT pid AS 进程ID, usename AS 用户名, datname AS 数据库名, state AS 状态, query AS 查询内容 FROM pg_stat_activity WHERE state = 'active'; -- 查看空闲连接 SELECT pid AS 进程ID, usename AS 用户名, datname AS 数据库名, state AS 状态, query_start AS 查询开始时间 FROM pg_stat_activity WHERE state = 'idle' ORDER BY query_start;
复制状态查看
pg_stat_replication:查看主从复制状态
sql-- 查看主从复制状态 SELECT client_addr AS 从库地址, state AS 状态, sent_lsn AS 已发送LSN, write_lsn AS 已写入LSN, flush_lsn AS 已刷新LSN, replay_lsn AS 已回放LSN, sync_priority AS 同步优先级, sync_state AS 同步状态 FROM pg_stat_replication;pg_wal_lsn_diff:计算复制延迟
sql-- 计算复制延迟(字节) SELECT client_addr AS 从库地址, pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS 回放延迟字节数 FROM pg_stat_replication;
资源使用诊断
内存使用查看
pg_shmem_allocations:查看共享内存分配情况
sqlSELECT name AS 内存区域名, allocated_bytes AS 已分配字节, free_bytes AS 空闲字节, chunk_bytes AS 块字节 FROM pg_shmem_allocations ORDER BY allocated_bytes DESC;gs_checkperf:检查系统性能,包括内存使用情况
bash# 检查系统性能,重点查看内存 gs_checkperf -i mem -h host1,host2
磁盘使用查看
pg_database_size:查看数据库大小
sql-- 查看所有数据库大小 SELECT datname AS 数据库名, pg_database_size(datname) AS 大小字节, pg_size_pretty(pg_database_size(datname)) AS 大小可读格式 FROM pg_database;pg_table_size:查看表和索引的大小
sql-- 查看表大小,包括表数据和索引 SELECT schemaname AS 模式名, tablename AS 表名, pg_table_size(schemaname || '.' || tablename) AS 表数据大小, pg_indexes_size(schemaname || '.' || tablename) AS 索引大小, pg_total_relation_size(schemaname || '.' || tablename) AS 总大小 FROM pg_tables ORDER BY total_size DESC;
CPU 使用查看
top:实时查看CPU使用情况,过滤GaussDB进程
bash# 查看GaussDB进程CPU使用 top -p $(pgrep -d ',' -f gaussdb)gs_checkperf:检查CPU性能
bash# 检查CPU性能 gs_checkperf -i cpu -h host1,host2
性能诊断工具
内置诊断工具
gs_analyze:GaussDB内置的性能分析工具
bash# 分析数据库性能 gs_analyze -D /data/gaussdbgs_perf:GaussDB性能测试工具,用于评估数据库性能
bash# 运行性能测试 gs_perf -c config_file.ini
第三方诊断工具
pgBadger:日志分析工具,用于分析GaussDB日志
bash# 分析GaussDB日志,生成HTML报告 pgbadger /data/gaussdb/pg_log/postgresql-*.log -o gaussdb_report.htmlPrometheus + Grafana:监控和可视化工具组合
- 配置GaussDB指标导出器,收集数据库性能指标
- 使用Grafana创建性能仪表盘,直观展示数据库状态
- 设置性能告警规则,及时发现性能问题
常见问题(FAQ)
Q1: 如何快速定位GaussDB性能瓶颈?
A1: 可以通过以下步骤快速定位性能瓶颈:
- 使用
top和iostat命令查看系统资源使用情况,判断是否存在CPU、内存或磁盘IO瓶颈 - 使用
pg_stat_activity查看活跃连接和慢查询,识别长时间运行的SQL - 使用
EXPLAIN ANALYZE分析SQL执行计划,找出查询中的性能问题 - 使用
pg_stat_statements查看SQL执行统计,找出最耗时的查询 - 查看数据库日志中的错误和警告信息,了解是否存在配置问题或其他异常
Q2: 如何识别和优化GaussDB中的慢查询?
A2: 识别慢查询的方法包括:
- 查看
pg_stat_activity中执行时间长的查询 - 使用
pg_stat_statements按执行时间排序查询 - 启用慢查询日志,配置
log_min_duration_statement参数记录慢查询 - 使用
EXPLAIN ANALYZE分析可疑查询的执行计划
优化慢查询的方法:
- 创建合适的索引
- 优化SQL语句结构
- 调整查询参数
- 考虑表分区或分表
Q3: 如何查看GaussDB的连接数?
A3: 可以使用以下命令查看数据库连接数:
sql
SELECT datname AS 数据库名, numbackends AS 连接数 FROM pg_stat_database;或使用GaussDB自带工具:
bash
gs_ctl status -D /data/gaussdb | grep connectionsQ4: 如何查看GaussDB表的索引使用情况?
A4: 可以使用以下命令查看索引使用情况:
sql
SELECT schemaname AS 模式名, tablename AS 表名, indexname AS 索引名,
idx_scan AS 扫描次数, idx_tup_read AS 读取行数, idx_tup_fetch AS 获取行数
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;Q5: 如何监控GaussDB主从复制延迟?
A5: 监控主从复制延迟的方法包括:
- 使用
pg_stat_replication查看replay_lsn和pg_current_wal_lsn()的差异 - 配置
hot_standby_feedback参数,优化从库查询性能 - 使用
gs_ctl查看复制状态 - 在监控系统中设置复制延迟告警,及时发现复制异常
- 定期检查复制状态,确保主从数据一致性
