外观
KingBaseES 动态性能视图参考
概述
KingBaseES 动态性能视图是数据库内置的系统视图,实时反映数据库运行状态、性能指标和资源使用情况。这些视图由数据库自动维护,无需人工干预,是 DBA 进行性能监控、故障诊断和优化的核心工具。
动态性能视图主要以 sys_stat_ 或 sys_ 为前缀,存储在 sys_catalog 模式下,可直接通过 SQL 查询访问。它们涵盖了从实例级到会话级的全方位监控信息,包括:
- 数据库整体健康状态
- 活跃会话详情
- SQL 执行统计
- 锁竞争情况
- 资源使用效率
- 主备复制状态
动态性能视图分类
根据监控对象和用途,动态性能视图可分为以下几类:
实例级监控视图
| 视图名称 | 描述 |
|---|---|
| sys_stat_database | 数据库级统计信息,包括连接、事务、I/O 等 |
| sys_stat_bgwriter | 后台写入器进程统计,反映缓冲区管理效率 |
| sys_stat_wal | WAL 相关统计,包括生成、归档和复制情况 |
| 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_statements | SQL 语句执行统计,是性能优化的核心工具 |
| sys_stat_ssl | SSL 连接统计信息 |
| 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
视图用途
该视图提供数据库级别的综合统计信息,是了解数据库整体健康状态的起点。
核心字段
| 字段名称 | 数据类型 | 描述 | 生产意义 |
|---|---|---|---|
| datname | name | 数据库名称 | 标识监控对象 |
| numbackends | integer | 活跃后端进程数 | 反映当前连接压力 |
| xact_commit/xact_rollback | bigint | 事务提交/回滚数 | 评估事务成功率 |
| blks_hit/blks_read | bigint | 缓冲区命中/磁盘读取次数 | 计算缓存命中率 |
| tup_returned/fetched/inserted/updated/deleted | bigint | 数据行操作统计 | 反映业务操作特征 |
| temp_files/temp_bytes | bigint | 临时文件统计 | 标识内存不足情况 |
| deadlocks | bigint | 死锁次数 | 评估并发控制效率 |
| blk_read_time/blk_write_time | double precision | I/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
视图用途
实时监控当前数据库中所有会话的状态和活动,是故障诊断和性能分析的核心视图。
核心字段
| 字段名称 | 数据类型 | 描述 | 生产意义 |
|---|---|---|---|
| pid | integer | 进程 ID | 唯一标识会话,用于终止异常进程 |
| usename | name | 用户名 | 识别操作主体 |
| datname | name | 数据库名称 | 定位问题数据库 |
| application_name | text | 应用程序名称 | 识别问题应用 |
| client_addr | inet | 客户端 IP | 定位问题来源 |
| state | text | 会话状态 | 区分活跃/空闲会话 |
| wait_event_type/wait_event | text | 等待事件 | 定位性能瓶颈类型 |
| query_start | timestamp | 查询开始时间 | 计算查询执行时长 |
| query | text | 执行的 SQL | 直接查看问题语句 |
| backend_type | text | 后端类型 | 区分普通会话与系统进程 |
生产运维示例
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 的核心工具。
核心字段
| 字段名称 | 数据类型 | 描述 | 生产意义 |
|---|---|---|---|
| query | text | 归一化后的 SQL | 识别相似查询模式 |
| calls | bigint | 执行次数 | 反映查询热度 |
| total_time | double precision | 总执行时间(毫秒) | 评估查询总耗时 |
| mean_time | double precision | 平均执行时间(毫秒) | 评估单条查询效率 |
| rows | bigint | 返回行数 | 评估查询结果集大小 |
| shared_blks_hit/read | bigint | 共享缓冲区命中/读取 | 评估缓存效率 |
| temp_blks_read/written | bigint | 临时块统计 | 识别内存不足的查询 |
| blk_read_time/blk_write_time | double precision | I/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
视图用途
实时监控数据库中的锁信息,包括锁类型、持有会话和等待会话,是解决锁竞争和死锁问题的关键视图。
核心字段
| 字段名称 | 数据类型 | 描述 | 生产意义 |
|---|---|---|---|
| locktype | text | 锁类型 | 区分表锁、行锁等 |
| relation | oid | 关系 OID | 关联到具体表或索引 |
| pid | integer | 进程 ID | 识别持有/等待锁的会话 |
| mode | text | 锁模式 | 区分共享锁、排他锁等 |
| granted | boolean | 是否已授予 | 区分持有锁和等待锁 |
生产运维示例
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_name | text | 备库应用名称 | 标识不同备库 |
| client_addr | inet | 备库 IP | 定位备库位置 |
| state | text | 复制状态 | 反映复制健康度 |
| sent_lsn | pg_lsn | 发送到备库的 WAL 位置 | 主库 WAL 发送进度 |
| write_lsn | pg_lsn | 备库写入的 WAL 位置 | 备库 WAL 接收进度 |
| flush_lsn | pg_lsn | 备库刷新到磁盘的 WAL 位置 | 备库 WAL 持久化进度 |
| replay_lsn | pg_lsn | 备库重放的 WAL 位置 | 备库数据同步进度 |
| replay_lag | interval | 重放延迟 | 直观反映数据延迟 |
| sync_state | text | 同步状态 | 区分同步/异步备库 |
生产运维示例
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;动态性能视图最佳实践
监控策略设计
分层监控:
- 实例级:监控整体健康状态,如连接数、事务率、缓存命中率
- 会话级:监控活跃会话和长查询
- SQL 级:监控高频和慢查询
- 锁级:监控锁竞争和等待事件
定期收集与基线建立:
- 生产环境建议每 5-15 分钟收集一次关键指标
- 建立性能基线,用于识别异常变化
- 保存至少 3 个月的历史数据,用于趋势分析
告警机制:
- 针对关键指标设置合理阈值,如 CPU 使用率 > 90%、复制延迟 > 30 秒
- 结合业务高峰和低谷调整阈值
- 实现分级告警,区分警告和紧急级别
查询性能优化
- 避免全表扫描:只查询必要字段,减少数据传输
- 添加过滤条件:限制返回行数,提高查询效率
- 合理使用聚合:对统计数据进行聚合查询,减少结果集大小
- 控制查询频率:动态性能视图查询会消耗系统资源,避免过于频繁
常见生产场景应用
性能瓶颈定位:
- 使用
sys_stat_activity查看当前负载 - 使用
sys_stat_statements识别慢 SQL - 使用
sys_locks检查锁竞争 - 使用等待事件分析识别 I/O 或 CPU 瓶颈
- 使用
故障诊断:
- 数据库连接失败:检查
sys_stat_activity中的连接数和状态 - 查询执行慢:分析
sys_stat_statements中的执行统计 - 死锁问题:使用
sys_locks和sys_lock_waits定位锁等待链 - 复制延迟:监控
sys_stat_replication中的延迟指标
- 数据库连接失败:检查
容量规划:
- 基于
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 新增视图
- sys_stat_subscription:提供逻辑复制订阅状态统计
- sys_stat_ssl:监控 SSL 连接性能和状态
- sys_stat_progress_create_index:实时查看索引创建进度
- sys_stat_progress_vacuum:监控 VACUUM 操作进度
- 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 可以显著提高数据库管理效率,确保系统稳定高效运行,为业务发展提供可靠的数据支撑。
