Skip to content

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 -v
  • pg_stat_database:查看数据库级别的统计信息

    sql
    SELECT 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:查看共享内存分配情况

    sql
    SELECT 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/gaussdb
  • gs_perf:GaussDB性能测试工具,用于评估数据库性能

    bash
    # 运行性能测试
    gs_perf -c config_file.ini

第三方诊断工具

  • pgBadger:日志分析工具,用于分析GaussDB日志

    bash
    # 分析GaussDB日志,生成HTML报告
    pgbadger /data/gaussdb/pg_log/postgresql-*.log -o gaussdb_report.html
  • Prometheus + Grafana:监控和可视化工具组合

    • 配置GaussDB指标导出器,收集数据库性能指标
    • 使用Grafana创建性能仪表盘,直观展示数据库状态
    • 设置性能告警规则,及时发现性能问题

常见问题(FAQ)

Q1: 如何快速定位GaussDB性能瓶颈?

A1: 可以通过以下步骤快速定位性能瓶颈:

  1. 使用 topiostat 命令查看系统资源使用情况,判断是否存在CPU、内存或磁盘IO瓶颈
  2. 使用 pg_stat_activity 查看活跃连接和慢查询,识别长时间运行的SQL
  3. 使用 EXPLAIN ANALYZE 分析SQL执行计划,找出查询中的性能问题
  4. 使用 pg_stat_statements 查看SQL执行统计,找出最耗时的查询
  5. 查看数据库日志中的错误和警告信息,了解是否存在配置问题或其他异常

Q2: 如何识别和优化GaussDB中的慢查询?

A2: 识别慢查询的方法包括:

  1. 查看 pg_stat_activity 中执行时间长的查询
  2. 使用 pg_stat_statements 按执行时间排序查询
  3. 启用慢查询日志,配置 log_min_duration_statement 参数记录慢查询
  4. 使用 EXPLAIN ANALYZE 分析可疑查询的执行计划

优化慢查询的方法:

  1. 创建合适的索引
  2. 优化SQL语句结构
  3. 调整查询参数
  4. 考虑表分区或分表

Q3: 如何查看GaussDB的连接数?

A3: 可以使用以下命令查看数据库连接数:

sql
SELECT datname AS 数据库名, numbackends AS 连接数 FROM pg_stat_database;

或使用GaussDB自带工具:

bash
gs_ctl status -D /data/gaussdb | grep connections

Q4: 如何查看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: 监控主从复制延迟的方法包括:

  1. 使用 pg_stat_replication 查看 replay_lsnpg_current_wal_lsn() 的差异
  2. 配置 hot_standby_feedback 参数,优化从库查询性能
  3. 使用 gs_ctl 查看复制状态
  4. 在监控系统中设置复制延迟告警,及时发现复制异常
  5. 定期检查复制状态,确保主从数据一致性