Skip to content

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:进程 ID
  • datid:数据库 ID
  • datname:数据库名称
  • 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:表 OID
  • schemaname:模式名称
  • 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:表 OID
  • indexrelid:索引 OID
  • schemaname:模式名称
  • relname:表名称
  • indexrelname:索引名称
  • idx_scan:索引扫描次数
  • idx_tup_read:索引扫描读取的行数
  • idx_tup_fetch:索引扫描获取的行数

sys_stat_user_indexes

该视图提供了用户索引的使用统计信息。

锁相关视图

sys_locks

该视图提供了当前数据库中的锁信息,用于诊断锁等待和死锁问题。

主要字段:

  • locktype:锁类型(relation, extend, page, tuple 等)
  • database:数据库 OID
  • relation:关系 OID
  • page:页面号
  • tuple:元组号
  • virtualxid:虚拟事务 ID
  • transactionid:事务 ID
  • classid:类 OID
  • objid:对象 OID
  • objsubid:对象子 ID
  • pid:持有或等待锁的进程 ID
  • mode:锁模式(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:归档失败次数

性能监控应用

实时性能监控

使用动态性能视图可以构建实时性能监控仪表板,监控关键指标:

  1. 数据库负载:通过 sys_stat_database 监控 TPS、QPS、缓冲区命中率
  2. 会话状态:通过 sys_stat_activity 监控活跃会话、长时间运行的查询
  3. 锁状态:通过 sys_locks 监控锁等待和死锁
  4. 索引使用:通过 sys_stat_user_indexes 监控索引效率
  5. 表统计:通过 sys_stat_user_tables 监控表的真空状态和统计信息

性能问题诊断

动态性能视图在性能问题诊断中发挥着重要作用:

  1. 慢查询分析:通过 sys_stat_activity 查看当前执行的慢查询
  2. 锁等待分析:通过 sys_locks 定位锁等待的源头
  3. 资源瓶颈定位:通过 sys_stat_databasesys_stat_bgwriter 定位 I/O 瓶颈
  4. 内存使用分析:通过相关视图监控共享缓冲区和工作内存使用

版本差异(V8 R6 vs V8 R7)

V8 R7 新增动态性能视图

  1. sys_stat_replication_slots:提供复制槽的详细统计信息
  2. sys_stat_wal_receiver:提供 WAL 接收器的详细信息
  3. sys_stat_subscription:提供逻辑复制订阅的统计信息
  4. sys_stat_ssl:提供 SSL 连接的统计信息
  5. sys_stat_progress_vacuum:提供真空操作的进度信息

视图字段增强

  1. sys_stat_activity

    • V8 R7 新增 backend_xidbackend_xmin 字段,便于监控事务状态
    • 新增 state_change 字段,记录状态变更时间
  2. sys_stat_database

    • V8 R7 新增 stats_reset 字段,记录统计信息重置时间
    • 新增 checksum_failureschecksum_last_failure 字段,用于监控数据块校验和错误
  3. sys_locks

    • V8 R7 新增 fastpath 字段,指示锁是否通过快速路径获取

最佳实践

视图使用注意事项

  1. 权限控制:动态性能视图包含敏感信息,应严格控制访问权限
  2. 查询频率:避免过于频繁地查询动态性能视图,以免影响数据库性能
  3. 结果缓存:对于频繁查询的视图,可以考虑使用物化视图进行缓存
  4. 结合工具:结合 KingBaseES Manager 或第三方监控工具使用,提高效率

常见查询示例

  1. 查看缓冲区命中率
sql
SELECT 
  datname, 
  round((blks_hit * 100.0) / (blks_hit + blks_read), 2) AS buffer_hit_rate
FROM sys_stat_database;
  1. 查看表的索引使用率
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;
  1. 查看当前锁等待情况
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_slotssys_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 更好地了解数据库运行状态,及时发现和解决性能问题,保障数据库系统的稳定运行。

在使用动态性能视图时,需要注意权限控制、查询频率和结果缓存等最佳实践,以避免对数据库性能造成不必要的影响。同时,要关注不同版本间动态性能视图的差异,充分利用新版本提供的增强功能。