外观
KingBaseES 内置视图与动态性能视图
动态性能视图概述
KingBaseES 提供了丰富的内置视图和动态性能视图,用于监控数据库运行状态、性能指标和系统资源使用情况。这些视图是 DBA 进行日常运维、性能调优和故障诊断的重要工具。
动态性能视图的特点:
- 实时反映数据库运行状态
- 无需手动创建和维护
- 数据来源于数据库内部结构和内存
- 可通过 SQL 查询直接访问
核心动态性能视图
实例级视图
sys_stat_database
该视图提供了数据库实例级别的统计信息,包括连接数、事务数、查询数等。
主要字段:
datname:数据库名称numbackends:当前连接数xact_commit:已提交事务数xact_rollback:已回滚事务数blks_read:物理块读取数blks_hit:缓冲区命中数tup_returned:返回行数tup_fetched:获取行数tup_inserted:插入行数tup_updated:更新行数tup_deleted:删除行数
使用示例:
sql
SELECT datname, numbackends, xact_commit, xact_rollback,
(blks_hit::float / (blks_read + blks_hit)) * 100 as buffer_hit_rate
FROM sys_stat_database;sys_stat_bgwriter
该视图提供了后台写入进程(bgwriter)的统计信息,用于监控检查点和缓冲区管理。
主要字段:
checkpoints_timed:定时检查点数checkpoints_req:请求检查点数checkpoint_write_time:检查点写入时间(毫秒)checkpoint_sync_time:检查点同步时间(毫秒)buffers_checkpoint:检查点写入的缓冲区数buffers_clean:bgwriter 写入的缓冲区数maxwritten_clean:bgwriter 因限制而停止的次数buffers_backend:后端进程直接写入的缓冲区数buffers_backend_fsync:后端进程直接执行的 fsync 次数buffers_alloc:分配的缓冲区数
会话级视图
sys_stat_activity
该视图提供了当前所有数据库会话的详细信息,是监控和诊断会话问题的重要工具。
主要字段:
pid:进程 IDdatid:数据库 IDdatname:数据库名称usename:用户名application_name:应用程序名称client_addr:客户端 IP 地址client_port:客户端端口backend_start:后端启动时间xact_start:事务开始时间query_start:查询开始时间state:会话状态(active, idle, idle in transaction 等)wait_event_type:等待事件类型wait_event:具体等待事件query:当前执行的查询
使用示例:
sql
-- 查看所有活跃会话
SELECT pid, datname, usename, client_addr, state, query
FROM sys_stat_activity
WHERE state = 'active';
-- 查看长时间运行的查询
SELECT pid, usename, now() - query_start as duration, query
FROM sys_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;sys_stat_user_tables
该视图提供了用户表的统计信息,包括行数、索引使用情况、真空状态等。
主要字段:
relid:表 OIDschemaname:模式名称relname:表名称seq_scan:顺序扫描次数seq_tup_read:顺序扫描读取的行数idx_scan:索引扫描次数idx_tup_fetch:索引扫描获取的行数n_tup_ins:插入行数n_tup_upd:更新行数n_tup_del:删除行数n_tup_hot_upd:热更新行数n_live_tup:估计活行数n_dead_tup:估计死行数last_vacuum:最后一次真空时间last_autovacuum:最后一次自动真空时间last_analyze:最后一次分析时间last_autoanalyze:最后一次自动分析时间
索引相关视图
sys_stat_user_indexes
该视图提供了用户索引的使用统计信息。
主要字段:
relid:表 OIDindexrelid:索引 OIDschemaname:模式名称relname:表名称indexrelname:索引名称idx_scan:索引扫描次数idx_tup_read:索引扫描读取的行数idx_tup_fetch:索引扫描获取的行数
sys_stat_user_indexes
该视图提供了用户索引的使用统计信息。
锁相关视图
sys_locks
该视图提供了当前数据库中的锁信息,用于诊断锁等待和死锁问题。
主要字段:
locktype:锁类型(relation, extend, page, tuple 等)database:数据库 OIDrelation:关系 OIDpage:页面号tuple:元组号virtualxid:虚拟事务 IDtransactionid:事务 IDclassid:类 OIDobjid:对象 OIDobjsubid:对象子 IDpid:持有或等待锁的进程 IDmode:锁模式(AccessShareLock, RowShareLock, RowExclusiveLock 等)granted:是否已授予锁
使用示例:
sql
-- 查看锁等待情况
SELECT blocked_locks.pid AS blocked_pid,
blocked_activity.usename AS blocked_user,
blocking_locks.pid AS blocking_pid,
blocking_activity.usename AS blocking_user,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM sys_locks blocked_locks
JOIN sys_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN sys_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 sys_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;WAL 相关视图
sys_stat_wal
该视图提供了 WAL 生成和归档的统计信息。
主要字段:
wal_records:生成的 WAL 记录数wal_fpi:WAL 全页图像数wal_bytes:生成的 WAL 字节数wal_buffers_full:WAL 缓冲区已满的次数archive_records:已归档的 WAL 记录数archive_bytes:已归档的 WAL 字节数archive_failed:归档失败次数
性能监控应用
实时性能监控
使用动态性能视图可以构建实时性能监控仪表板,监控关键指标:
- 数据库负载:通过
sys_stat_database监控 TPS、QPS、缓冲区命中率 - 会话状态:通过
sys_stat_activity监控活跃会话、长时间运行的查询 - 锁状态:通过
sys_locks监控锁等待和死锁 - 索引使用:通过
sys_stat_user_indexes监控索引效率 - 表统计:通过
sys_stat_user_tables监控表的真空状态和统计信息
性能问题诊断
动态性能视图在性能问题诊断中发挥着重要作用:
- 慢查询分析:通过
sys_stat_activity查看当前执行的慢查询 - 锁等待分析:通过
sys_locks定位锁等待的源头 - 资源瓶颈定位:通过
sys_stat_database和sys_stat_bgwriter定位 I/O 瓶颈 - 内存使用分析:通过相关视图监控共享缓冲区和工作内存使用
版本差异(V8 R6 vs V8 R7)
V8 R7 新增动态性能视图
- sys_stat_replication_slots:提供复制槽的详细统计信息
- sys_stat_wal_receiver:提供 WAL 接收器的详细信息
- sys_stat_subscription:提供逻辑复制订阅的统计信息
- sys_stat_ssl:提供 SSL 连接的统计信息
- sys_stat_progress_vacuum:提供真空操作的进度信息
视图字段增强
sys_stat_activity:
- V8 R7 新增
backend_xid和backend_xmin字段,便于监控事务状态 - 新增
state_change字段,记录状态变更时间
- V8 R7 新增
sys_stat_database:
- V8 R7 新增
stats_reset字段,记录统计信息重置时间 - 新增
checksum_failures和checksum_last_failure字段,用于监控数据块校验和错误
- V8 R7 新增
sys_locks:
- V8 R7 新增
fastpath字段,指示锁是否通过快速路径获取
- V8 R7 新增
最佳实践
视图使用注意事项
- 权限控制:动态性能视图包含敏感信息,应严格控制访问权限
- 查询频率:避免过于频繁地查询动态性能视图,以免影响数据库性能
- 结果缓存:对于频繁查询的视图,可以考虑使用物化视图进行缓存
- 结合工具:结合 KingBaseES Manager 或第三方监控工具使用,提高效率
常见查询示例
- 查看缓冲区命中率
sql
SELECT
datname,
round((blks_hit * 100.0) / (blks_hit + blks_read), 2) AS buffer_hit_rate
FROM sys_stat_database;- 查看表的索引使用率
sql
SELECT
schemaname,
relname,
seq_scan,
idx_scan,
round((idx_scan * 100.0) / nullif(seq_scan + idx_scan, 0), 2) AS index_usage_rate
FROM sys_stat_user_tables
ORDER BY index_usage_rate;- 查看当前锁等待情况
sql
SELECT
pid,
usename,
wait_event_type,
wait_event,
state,
query
FROM sys_stat_activity
WHERE wait_event IS NOT NULL;常见问题(FAQ)
Q1:动态性能视图的数据是实时的吗?
A:是的,动态性能视图的数据来源于数据库内存和内部结构,反映的是实时的数据库运行状态。
Q2:查询动态性能视图会影响数据库性能吗?
A:一般情况下,查询动态性能视图对数据库性能影响很小。但如果过于频繁地查询或查询结果集很大,可能会产生一定的性能开销。建议合理控制查询频率,避免在高负载时段进行复杂查询。
Q3:如何重置动态性能视图的统计信息?
A:可以使用 sys_stat_reset() 函数重置统计信息。该函数会重置当前数据库的所有统计信息,包括表、索引、数据库等的统计数据。
sql
-- 重置当前数据库的统计信息
SELECT sys_stat_reset();
-- 重置指定表的统计信息
SELECT sys_stat_reset_single_table_counters('schema_name', 'table_name');Q4:V8 R6 和 V8 R7 的动态性能视图有什么主要区别?
A:V8 R7 新增了多个动态性能视图,如 sys_stat_replication_slots、sys_stat_wal_receiver 等,并增强了现有视图的字段,提供了更丰富的监控信息。具体差异可参考本章的"版本差异"部分。
Q5:如何监控 KingBaseES 的长事务?
A:可以通过 sys_stat_activity 视图监控长事务:
sql
SELECT
pid,
usename,
now() - xact_start AS duration,
query
FROM sys_stat_activity
WHERE state IN ('active', 'idle in transaction')
AND now() - xact_start > interval '5 minutes'
ORDER BY duration DESC;Q6:如何查找不使用索引的表?
A:可以通过 sys_stat_user_tables 视图查找:
sql
SELECT
schemaname,
relname,
seq_scan,
idx_scan
FROM sys_stat_user_tables
WHERE idx_scan = 0
AND seq_scan > 0
ORDER BY seq_scan DESC;总结
KingBaseES 提供了丰富的内置视图和动态性能视图,是 DBA 进行日常运维、性能监控和故障诊断的重要工具。熟练掌握这些视图的使用方法,可以帮助 DBA 更好地了解数据库运行状态,及时发现和解决性能问题,保障数据库系统的稳定运行。
在使用动态性能视图时,需要注意权限控制、查询频率和结果缓存等最佳实践,以避免对数据库性能造成不必要的影响。同时,要关注不同版本间动态性能视图的差异,充分利用新版本提供的增强功能。
