Skip to content

KingBaseES 动态性能视图参考

概述

KingBaseES 动态性能视图是数据库内置的系统视图,实时反映数据库运行状态、性能指标和资源使用情况。这些视图由数据库自动维护,无需人工干预,是 DBA 进行性能监控、故障诊断和优化的核心工具。

动态性能视图主要以 sys_stat_sys_ 为前缀,存储在 sys_catalog 模式下,可直接通过 SQL 查询访问。它们涵盖了从实例级到会话级的全方位监控信息,包括:

  • 数据库整体健康状态
  • 活跃会话详情
  • SQL 执行统计
  • 锁竞争情况
  • 资源使用效率
  • 主备复制状态

动态性能视图分类

根据监控对象和用途,动态性能视图可分为以下几类:

实例级监控视图

视图名称描述
sys_stat_database数据库级统计信息,包括连接、事务、I/O 等
sys_stat_bgwriter后台写入器进程统计,反映缓冲区管理效率
sys_stat_walWAL 相关统计,包括生成、归档和复制情况
sys_stat_checkpointer检查点进程统计,反映数据持久化效率
sys_stat_replication主备复制状态,包括延迟和同步信息

会话级监控视图

视图名称描述
sys_stat_activity活跃会话详情,包括执行的 SQL 和资源使用
sys_stat_user_functions用户函数调用统计
sys_stat_user_indexes用户索引使用效率统计
sys_stat_user_tables用户表访问模式和效率统计

SQL 执行分析视图

视图名称描述
sys_stat_statementsSQL 语句执行统计,是性能优化的核心工具
sys_stat_sslSSL 连接统计信息
sys_stat_xact_user_functions事务级用户函数统计
sys_stat_xact_user_tables事务级用户表访问统计

锁与等待事件视图

视图名称描述
sys_locks实时锁信息,包括持有和等待的锁
sys_lock_waits锁等待关系,用于定位锁竞争源头

缓冲区与 I/O 视图

视图名称描述
sys_buffercache缓冲区缓存内容,反映缓存使用效率
sys_statio_user_indexes用户索引 I/O 统计
sys_statio_user_tables用户表 I/O 统计

复制与订阅视图

视图名称描述
sys_stat_replication主备复制状态详情
sys_stat_subscription订阅状态统计
sys_replication_slots复制槽信息,确保 WAL 不丢失

核心动态性能视图详解

sys_stat_database

视图用途

该视图提供数据库级别的综合统计信息,是了解数据库整体健康状态的起点。

核心字段

字段名称数据类型描述生产意义
datnamename数据库名称标识监控对象
numbackendsinteger活跃后端进程数反映当前连接压力
xact_commit/xact_rollbackbigint事务提交/回滚数评估事务成功率
blks_hit/blks_readbigint缓冲区命中/磁盘读取次数计算缓存命中率
tup_returned/fetched/inserted/updated/deletedbigint数据行操作统计反映业务操作特征
temp_files/temp_bytesbigint临时文件统计标识内存不足情况
deadlocksbigint死锁次数评估并发控制效率
blk_read_time/blk_write_timedouble precisionI/O 时间统计评估存储性能

生产运维示例

sql
-- 1. 计算缓冲区命中率(反映内存配置合理性)
SELECT datname, 
       round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS hit_ratio
FROM sys_stat_database
WHERE datname NOT LIKE 'template%';

-- 2. 分析事务成功率(识别异常回滚)
SELECT datname, 
       xact_commit, 
       xact_rollback, 
       round(100.0 * xact_commit / nullif(xact_commit + xact_rollback, 0), 2) AS commit_ratio
FROM sys_stat_database
WHERE datname NOT LIKE 'template%';

-- 3. 识别 I/O 密集型数据库
SELECT datname, 
       blk_read_time + blk_write_time AS total_io_time,
       temp_bytes / 1024 / 1024 AS temp_mb
FROM sys_stat_database
WHERE datname NOT LIKE 'template%'
ORDER BY total_io_time DESC;

sys_stat_activity

视图用途

实时监控当前数据库中所有会话的状态和活动,是故障诊断和性能分析的核心视图。

核心字段

字段名称数据类型描述生产意义
pidinteger进程 ID唯一标识会话,用于终止异常进程
usenamename用户名识别操作主体
datnamename数据库名称定位问题数据库
application_nametext应用程序名称识别问题应用
client_addrinet客户端 IP定位问题来源
statetext会话状态区分活跃/空闲会话
wait_event_type/wait_eventtext等待事件定位性能瓶颈类型
query_starttimestamp查询开始时间计算查询执行时长
querytext执行的 SQL直接查看问题语句
backend_typetext后端类型区分普通会话与系统进程

生产运维示例

sql
-- 1. 查看所有活跃会话(排除空闲)
SELECT pid, usename, datname, application_name, client_addr, state, query
FROM sys_stat_activity
WHERE state <> 'idle' AND backend_type = 'client backend';

-- 2. 识别长时间运行的查询(超过 5 分钟)
SELECT pid, usename, datname, 
       now() - query_start AS duration, 
       query
FROM sys_stat_activity
WHERE state <> 'idle' 
  AND backend_type = 'client backend'
  AND now() - query_start > interval '5 minutes';

-- 3. 分析会话等待事件分布
SELECT wait_event_type, wait_event, count(*) AS wait_count
FROM sys_stat_activity
WHERE wait_event_type IS NOT NULL
GROUP BY wait_event_type, wait_event
ORDER BY wait_count DESC;

-- 4. 查找特定应用的所有会话
SELECT pid, usename, datname, state, query
FROM sys_stat_activity
WHERE application_name = 'my_application';

sys_stat_statements

视图用途

提供 SQL 语句的执行统计信息,是识别性能瓶颈和优化 SQL 的核心工具。

核心字段

字段名称数据类型描述生产意义
querytext归一化后的 SQL识别相似查询模式
callsbigint执行次数反映查询热度
total_timedouble precision总执行时间(毫秒)评估查询总耗时
mean_timedouble precision平均执行时间(毫秒)评估单条查询效率
rowsbigint返回行数评估查询结果集大小
shared_blks_hit/readbigint共享缓冲区命中/读取评估缓存效率
temp_blks_read/writtenbigint临时块统计识别内存不足的查询
blk_read_time/blk_write_timedouble precisionI/O 时间评估存储访问效率

生产运维示例

sql
-- 1. 识别总耗时最长的 SQL(TOP 10)
SELECT query, calls, 
       round(total_time / 1000, 2) AS total_sec, 
       round(mean_time, 2) AS mean_ms, 
       rows
FROM sys_stat_statements
ORDER BY total_time DESC
LIMIT 10;

-- 2. 识别平均耗时最长的 SQL(执行次数 > 10)
SELECT query, calls, 
       round(total_time / 1000, 2) AS total_sec, 
       round(mean_time, 2) AS mean_ms, 
       rows
FROM sys_stat_statements
WHERE calls > 10
ORDER BY mean_time DESC
LIMIT 10;

-- 3. 识别 I/O 密集型 SQL
SELECT query, calls, 
       round(blk_read_time + blk_write_time, 2) AS io_time_ms
FROM sys_stat_statements
ORDER BY io_time_ms DESC
LIMIT 10;

-- 4. 识别生成大量临时文件的 SQL
SELECT query, calls, 
       temp_blks_written AS temp_blocks
FROM sys_stat_statements
WHERE temp_blks_written > 0
ORDER BY temp_blocks DESC
LIMIT 10;

sys_locks

视图用途

实时监控数据库中的锁信息,包括锁类型、持有会话和等待会话,是解决锁竞争和死锁问题的关键视图。

核心字段

字段名称数据类型描述生产意义
locktypetext锁类型区分表锁、行锁等
relationoid关系 OID关联到具体表或索引
pidinteger进程 ID识别持有/等待锁的会话
modetext锁模式区分共享锁、排他锁等
grantedboolean是否已授予区分持有锁和等待锁

生产运维示例

sql
-- 1. 查看所有锁信息,关联表名
SELECT locktype, 
       database, 
       relation::regclass AS table_name, 
       pid, 
       mode, 
       granted
FROM sys_locks;

-- 2. 查看等待锁的会话及相关信息
SELECT a.pid, 
       a.usename, 
       a.query, 
       l.locktype, 
       l.relation::regclass AS table_name, 
       l.mode, 
       l.granted
FROM sys_locks l
JOIN sys_stat_activity a ON l.pid = a.pid
WHERE NOT l.granted;

-- 3. 查看持有锁的会话及相关信息
SELECT a.pid, 
       a.usename, 
       a.query, 
       l.locktype, 
       l.relation::regclass AS table_name, 
       l.mode, 
       l.granted
FROM sys_locks l
JOIN sys_stat_activity a ON l.pid = a.pid
WHERE l.granted;

-- 4. 分析锁等待链(识别死锁)
WITH RECURSIVE lock_chain AS (
  SELECT l1.pid AS waiting_pid, 
         l2.pid AS holding_pid,
         1 AS level
  FROM sys_locks l1
  JOIN sys_locks l2 ON l1.locktype = l2.locktype
                   AND l1.database = l2.database
                   AND l1.relation = l2.relation
                   AND l1.granted = false
                   AND l2.granted = true
                   AND l1.mode = 'ExclusiveLock'
                   AND l2.mode = 'ExclusiveLock'
  UNION ALL
  SELECT lc.waiting_pid, 
         l2.pid AS holding_pid,
         lc.level + 1 AS level
  FROM lock_chain lc
  JOIN sys_locks l1 ON lc.holding_pid = l1.pid
  JOIN sys_locks l2 ON l1.locktype = l2.locktype
                   AND l1.database = l2.database
                   AND l1.relation = l2.relation
                   AND l1.granted = false
                   AND l2.granted = true
                   AND l1.mode = 'ExclusiveLock'
                   AND l2.mode = 'ExclusiveLock'
)
SELECT * FROM lock_chain WHERE waiting_pid = holding_pid;

sys_stat_replication

视图用途

监控主备复制状态,包括备库连接、延迟和同步信息,是确保数据一致性的重要视图。

核心字段

字段名称数据类型描述生产意义
application_nametext备库应用名称标识不同备库
client_addrinet备库 IP定位备库位置
statetext复制状态反映复制健康度
sent_lsnpg_lsn发送到备库的 WAL 位置主库 WAL 发送进度
write_lsnpg_lsn备库写入的 WAL 位置备库 WAL 接收进度
flush_lsnpg_lsn备库刷新到磁盘的 WAL 位置备库 WAL 持久化进度
replay_lsnpg_lsn备库重放的 WAL 位置备库数据同步进度
replay_laginterval重放延迟直观反映数据延迟
sync_statetext同步状态区分同步/异步备库

生产运维示例

sql
-- 1. 查看所有备库复制状态
SELECT application_name, 
       client_addr, 
       state, 
       sent_lsn, 
       write_lsn, 
       flush_lsn, 
       replay_lsn, 
       replay_lag
FROM sys_stat_replication;

-- 2. 计算复制延迟(字节和时间)
SELECT application_name, 
       client_addr, 
       sent_lsn - replay_lsn AS bytes_lag,
       replay_lag
FROM sys_stat_replication;

-- 3. 监控同步备库状态
SELECT application_name, 
       client_addr, 
       state, 
       sync_state, 
       replay_lag
FROM sys_stat_replication
WHERE sync_state = 'sync';

-- 4. 检查备库是否正常应用 WAL
SELECT application_name, 
       client_addr, 
       CASE 
         WHEN state = 'streaming' AND replay_lsn < sent_lsn THEN 'delayed'
         WHEN state = 'streaming' THEN 'normal'
         ELSE 'abnormal'
       END AS replication_status
FROM sys_stat_replication;

动态性能视图最佳实践

监控策略设计

  1. 分层监控

    • 实例级:监控整体健康状态,如连接数、事务率、缓存命中率
    • 会话级:监控活跃会话和长查询
    • SQL 级:监控高频和慢查询
    • 锁级:监控锁竞争和等待事件
  2. 定期收集与基线建立

    • 生产环境建议每 5-15 分钟收集一次关键指标
    • 建立性能基线,用于识别异常变化
    • 保存至少 3 个月的历史数据,用于趋势分析
  3. 告警机制

    • 针对关键指标设置合理阈值,如 CPU 使用率 > 90%、复制延迟 > 30 秒
    • 结合业务高峰和低谷调整阈值
    • 实现分级告警,区分警告和紧急级别

查询性能优化

  1. 避免全表扫描:只查询必要字段,减少数据传输
  2. 添加过滤条件:限制返回行数,提高查询效率
  3. 合理使用聚合:对统计数据进行聚合查询,减少结果集大小
  4. 控制查询频率:动态性能视图查询会消耗系统资源,避免过于频繁

常见生产场景应用

  1. 性能瓶颈定位

    • 使用 sys_stat_activity 查看当前负载
    • 使用 sys_stat_statements 识别慢 SQL
    • 使用 sys_locks 检查锁竞争
    • 使用等待事件分析识别 I/O 或 CPU 瓶颈
  2. 故障诊断

    • 数据库连接失败:检查 sys_stat_activity 中的连接数和状态
    • 查询执行慢:分析 sys_stat_statements 中的执行统计
    • 死锁问题:使用 sys_lockssys_lock_waits 定位锁等待链
    • 复制延迟:监控 sys_stat_replication 中的延迟指标
  3. 容量规划

    • 基于 sys_stat_database 中的历史数据预测增长趋势
    • 分析 sys_stat_wal 中的 WAL 生成速率,规划存储容量
    • 基于 sys_stat_activity 中的连接数,规划服务器资源

版本差异

V8 R6 与 V8 R7 视图差异

视图名称V8 R6 特点V8 R7 特点运维影响
sys_stat_activity基本会话信息增加更多等待事件和状态详情V8 R7 可更精准定位会话瓶颈
sys_stat_statements基础 SQL 统计增加更多执行统计字段V8 R7 提供更全面的 SQL 性能分析
sys_locks基本锁信息增加锁类型和等待详情V8 R7 锁监控更精细化
sys_stat_replication基础复制状态增加延迟和同步状态字段V8 R7 复制监控更直观
sys_stat_wal基础 WAL 统计增加 WAL 生成和归档详情V8 R7 WAL 监控更全面

V8 R7 新增视图

  1. sys_stat_subscription:提供逻辑复制订阅状态统计
  2. sys_stat_ssl:监控 SSL 连接性能和状态
  3. sys_stat_progress_create_index:实时查看索引创建进度
  4. sys_stat_progress_vacuum:监控 VACUUM 操作进度
  5. sys_stat_progress_cluster:监控 CLUSTER 操作进度

常见问题(FAQ)

如何重置动态性能视图的统计信息?

A:使用以下函数重置不同范围的统计信息:

sql
-- 重置所有数据库统计
SELECT sys_stat_reset();

-- 重置后台写入器统计
SELECT sys_stat_reset_shared('bgwriter');

-- 重置 WAL 统计
SELECT sys_stat_reset_shared('wal');

-- 重置 SQL 语句统计
SELECT pg_stat_statements_reset();

动态性能视图的数据更新频率是多少?

A:不同视图更新频率不同:

  • sys_stat_activity:实时更新
  • sys_stat_statements:语句执行完成后更新
  • sys_stat_database:定期更新(约 5 秒)
  • sys_locks:锁状态变化时更新

为什么有些视图查询结果为空?

A:可能原因包括:

  • 没有相关数据(如无活跃会话)
  • 权限不足(需要 SYS_STAT_ACCESS 权限)
  • 视图在当前版本不可用
  • 扩展未启用(如 pg_stat_statements 需要单独启用)

查询动态性能视图会影响数据库性能吗?

A:查询会消耗一定资源,但影响通常很小。建议:

  • 避免使用 SELECT * 查询所有字段
  • 合理控制查询频率(生产环境建议 ≥ 5 分钟)
  • 仅查询必要的字段和记录

如何启用 pg_stat_statements 扩展?

A:需要在 kingbase.conf 中配置并重启数据库:

shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.track = all

如何监控特定应用的性能?

A:使用 application_name 字段过滤:

sql
-- 监控特定应用的活跃会话
SELECT * FROM sys_stat_activity WHERE application_name = 'my_app';

-- 监控特定应用的 SQL 执行
SELECT * FROM sys_stat_statements 
WHERE query LIKE '%my_app%' 
ORDER BY total_time DESC;

如何识别内存不足的情况?

A:关注以下指标:

sql
-- 1. 大量使用临时文件
SELECT datname, temp_files, temp_bytes FROM sys_stat_database;

-- 2. SQL 生成临时块
SELECT query, temp_blks_written FROM sys_stat_statements WHERE temp_blks_written > 0;

-- 3. 工作内存不足导致的排序溢出
SELECT * FROM sys_stat_activity WHERE query LIKE '%Sort Method: external merge%';

总结

KingBaseES 动态性能视图是数据库运维的核心工具集,通过这些视图可以全面监控数据库运行状态、定位性能瓶颈、诊断故障问题。在实际生产中,DBA 应根据业务特点和系统规模,设计合理的监控策略,结合历史数据和基线分析,实现 proactive 运维。

使用动态性能视图时,需注意:

  • 理解各视图的核心用途和字段含义
  • 设计高效的查询语句,减少系统开销
  • 建立完善的监控和告警机制
  • 结合业务上下文进行分析,避免孤立解读指标
  • 定期更新统计信息,保持数据准确性

通过熟练掌握动态性能视图的使用方法和最佳实践,DBA 可以显著提高数据库管理效率,确保系统稳定高效运行,为业务发展提供可靠的数据支撑。