大家好,这里是公众号 DBA学习之路,致力于分享数据库领域相关知识。
目录
前言
数据库性能是应用系统高效运行的基石,因此性能调优至关重要。比如在 Oracle 数据库中,DBAers 通常使用 AWR、ASH、ADDM 等性能优化工具进行分析与优化数据库。
在金仓数据库 KingbaseES 中也为用户提供了对应的优化工具(三剑客):
- KWR(Kingbase Auto Workload Repertories)
- KSH
- KDDM

通过以上性能优化工具,可以轻松驾驭性能调优。本文主要讲一下 KWR 工具的使用!
KWR 介绍
SYS_KWR 是 KingbaseES 自动负载信息库(Kingbase Auto Workload Repertories)的简称,它通过周期性自动记录性能统计相关的快照,分析出 KingbaseES 的操作系统运行环境、数据库时间组成、等待事件和 TOP SQL 等性能指标,为数据库性能调优提供指导。
KWR 以插件的形式存在于 KingbaseES 产品中,目前最新版本是 1.8。
📢 注意:KingbaseES 由低版本升级至 V009R001C002B0014 后,需尽快将 KWR 插件升级至 1.8 版本,否则
自动快照和手工快照功能将无法使用。
KWR 的基本原理:数据库实例运行过程中不断产生一些统计数据,比如对某个表的访问次数,数据页的内存命中次数,某个等待事件发生的次数和总时间,SQL 语句的解析时间等,这些统计数据被一个叫做 KWR collector 的后台性能监控进程周期性地(默认每小时)自动采集,存储到 KWR 快照库里面,这些快照默认保存 8 天,到期后那些旧的快照被自动删除。
当出现性能问题的时候,可以通过指定时间段来查询相关快照列表,生成 KWR 报告,定位性能问题的根本原因。
KWR 通过自动采集操作系统和数据库实例的性能数据,将其存储为 KWR 快照,并依此来生成 KWR 报告为
DBA 性能调优提供参考,其价值包括:
- 自动采集操作系统统计信息,不需要额外的性能监控工具。
- 感知数据库运行环境,排查数据库实例外部原因造成的性能问题。
- 通过统一的 DB Time 模型,度量数据库关键活动耗时。
- 通过 query ID 将 SQL 执行时间、等待时间和资源消耗关联起来,进行语句级分析。
- 从多个维度(时间、IO、内存、锁、实例、库对象等)分析数据库实例的性能问题。
- 自动生成快照,便于回溯之前发生的性能问题。
- 为 KDDM 等自动诊断和建议提供基础数据。
开启 KWR
开启 KWR 插件需要配置 kingbase.conf 文件,打开统计开关:
[kingbase@kesv9:/data]$ vi /data/kingbase.conf
## 添加如下参数
## shared_preload_libraries 里至少包含:sys_kwr, sys_stat_statements
shared_preload_libraries = 'liboracle_parser, sys_kwr, sys_stat_statements'
## 配置 GUC 参数,KWR 依赖内核统计模块采集性能统计数据,建议开启以下 GUC 参数,否则 KWR 报告里会缺失部分内容
## 统计 SQL 时间、SQL 等待事件、SQL IO,默认为 off,建议开启
track_sql = on
## 统计实例级 IO、锁、关键活动,默认为 off,建议开启
track_instance = on
## 统计累积式等待事件的时间,默认为 on,建议开启
track_wait_timing = on
## 统计数据库活动,默认为 on
track_counts = on
## 统计 IO 耗时,默认为 off,建议开启
track_io_timing = on
## 统计用户自定义函数使用情况,默认为’none’,建议’all’
track_functions = 'all'
## 设置 sys_stat_statements.track 控制哪个语句可以被该模块跟踪,声明’top’ 来跟踪顶级(直接通过客户端发出)的语句,’all’ 跟踪嵌套的语句,’none’ 禁用语句状态收集,建议使用’top’
sys_stat_statements.track = 'top'
## 统计数据库对象使用情况,在 sys_kwr1.7 之前默认值为 on,从 sys_kwr1.7 默认值更改为 off,建议关闭。该参数需要手动添加
## sys_kwr.track_objects = off
## 统计系统数据,默认为 on,建议开启。该参数需要手动添加
sys_kwr.track_os = on
## 开启 kwr 自动快照,默认为关
sys_kwr.enable = on
## 显示 kwr 报告中排名前 n 条的信息,默认为 20,最少为 10,最多为 100
sys_kwr.topn = 10
## 快照保留日期,默认为 8 天,最少 1 天,最多 1000 天
sys_kwr.history_days = 15
## 自动快照间隔,默认 60 分钟,最短 10 分钟,最长 144000 分钟(100 天)
sys_kwr.interval = 30
## KWR 报告、KWR diff 报告使用语言,默认为中文(chinese 或 chn),可选为英文 (english
或 eng)
sys_kwr.language = chinese
## Windows 平台下是否跟踪操作系统统计信息,默认为 on。开启该开关后,每次连接 KWR 插件所在数据库会消耗大约 300 毫秒来初始化 Windows 下的 WMI 库。
sys_kwr.track_windows_os_info = off
## KWR 1.8 新增参数,用于指定自动快照的数据库。配置该参数后,自动快照进程会连接目标数据库,并周期性创建 KWR 快照,同时采集包括数据库对象在内的全部性能统计指标。
## 参数为 text 类型,区分大小写,仅可配置一个数据库。
## 参数默认值为’kingbase’,如果不设置,则系统仍然使用默认的 kingbase 库来创建自动快照。
sys_kwr.database = 'kingbase'
重启数据库服务器:
[kingbase@kesv9:/data]$ sys_ctl restart
等待服务器进程关闭 .... 完成
服务器进程已经关闭
等待服务器进程启动 ....2025-02-07 10:40:47.773 CST [3428] LOG: config the real archive_command string as soon as possible to archive WAL files
2025-02-07 10:40:47.803 CST [3428] LOG: sepapower extension initialized
2025-02-07 10:40:47.809 CST [3428] LOG: starting KingbaseES V009R001C002B0014 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
2025-02-07 10:40:47.809 CST [3428] LOG: listening on IPv4 address "0.0.0.0", port 54321
2025-02-07 10:40:47.809 CST [3428] LOG: listening on IPv6 address "::", port 54321
2025-02-07 10:40:47.811 CST [3428] LOG: listening on Unix socket "/tmp/.s.KINGBASE.54321"
2025-02-07 10:40:47.955 CST [3428] LOG: redirecting log output to logging collector process
2025-02-07 10:40:47.955 CST [3428] HINT: Future log output will appear in directory "sys_log".
完成
服务器进程已经启动
使用 KWR
通过 KSQL 连接,创建 KWR 插件,创建快照,执行 SQL 后再次创建快照:
[kingbase@kesv9:/data]$ ksql test system
-- 创建 kwr 插件
test=# CREATE EXTENSION sys_kwr;
-- 获得快照 1
test=# SELECT * FROM perf.create_snapshot();
-- 创建一个示例表
test=# CREATE TABLE IF NOT EXISTS t1(id int);
-- 执行一些 SQL
test=# INSERT INTO t1 values(1),(2),(3);
test=# SELECT count(*) FROM t1;
-- 获得快照 2
test=# SELECT * FROM perf.create_snapshot();
-- 查看快照
test=# SELECT * FROM perf.kwr_snapshots;
生成全实例的 TEXT 版本 KWR 报告:
test=# SELECT * FROM perf.kwr_report(1,2);
-- 生成指定数据库的 TEXT 版本报告,以 kingbase 为例:
-- test=# SELECT * FROM perf.kwr_report(1,9, 'text','kingbase');
部分内容显示效果如下:





生成全实例的 HTML 版报告:
test=# SELECT * FROM perf.kwr_report(1,2, 'html');
-- 可以使用以下 SQL 函数将生成的 html 文件保存到指定文件路径
-- test=# SELECT * FROM perf.kwr_report_to_file(1,2, 'html', '/home/kingbase/kwr.html');
-- 生成指定数据库的 HTML 版报告,以 kingbase 为例
-- test=# SELECT * FROM perf.kwr_report(1,9, 'html', 'kingbase');
📢 注意:生成的 KWR 报告会自动保存到 DATA 目录下的 sys_log 子目录下。

推荐使用 HTML 格式,因为它更便于阅读:






查看 KWR 报告
KWR 报告主要由三部分组成:
1、报告头:这部分主要是列出数据库实例的版本、运行环境和快照信息。
2、报告摘要:这是整个报告的精华所在,大部分的性能问题都能够从这部分报告里看到。看这部分内容的时候,如果有必要,还可以结合后面的详细报告具体分析问题。这部分最重要的几个报告是:负载分析、实例效率百分比(目标 100%)、Top 10 前台等待事件、主机环境统计(主机 CPU、IO、内存和网络)。
报告摘要部分报告列表:
- 负载分析
- 实例效率百分比(目标 100%)
- Top 10 前台等待事件
- Top 10 前台等待事件分类
- 主机 CPU
- 主机 IO
- 主机内存
- 主机网络
- IO 分析
- 内存统计
- SQL 语句数统计
3、报告主体:报告主体提供了更加全面的性能指标,主要包括:DB Time 模型、等待事件、内存统计、实例 IO 统计、锁活动统计、关键活动统计、SQL 报文统计、TOP SQL 统计、后台写统计、数据库对象统计和配置参数。
报告主体报告列表:
- CPU 统计
- 主机 CPU 详细
- 时间模型和等待事件统计
- 时间模型统计
- 前台等待事件分类
- 前台等待事件
- 后台等待事件
- 数据库执行时间
- SQL 报文执行时间
- 内存统计
- Top 10 共享内存统计
- 实例 IO 统计
- 实例 IO 按进程类型统计
- 实例 IO 按文件类型统计
- 实例 IO 按数据库名统计
- 实例 IO 按表空间统计
- 实例 IO 按数据库对象类型统计
- Top 10 读写的数据库对象统计
- 锁活动统计
- Top 10 请求次数的锁活动
- Top 10 等待时间的锁活动
- 关键活动统计
- 关键活动按执行次数统计
- 关键活动按执行时间统计
- Top SQL 统计
- 按数据库时间排序的 SQL 语句
- 按 CPU 时间排序的 SQL 语句
- 按解析时间排序的 SQL 语句
- 按计划时间排序的 SQL 语句
- 按执行时间排序的 SQL 语句
- 按执行次数排序的 SQL 语句
- 按返回元组数排序的 SQL 语句
- 按 I/O 时间排序的 SQL 语句
- 按逻辑读块数排序的 SQL 语句
- 按物理读块排序的 SQL 语句
- 按逻辑写块数排序的 SQL 语句
- 按物理写块数排序的 SQL 语句
- 按临时块数读写排序的 SQL 语句
- 按本地数据块使用排序的 SQL 语句
- 完整 SQL 列表
- 后台写统计
- 数据库统计
- 数据库对象统计
- 按顺序扫描页数排序的关系表
- 按逻辑读页数排序的关系表
- 按物理读页数排序的关系表
- 按 DML 行数排序的关系表
- 按命中率排序的关系表
- 按逻辑读页数排序的索引
- 按物理读页数排序的索引
- 按命中数排序的索引
- 存在未使用的索引
- 按执行时间排序的函数
- 按执行次数排序的函数
写在最后
金仓数据库 KWR 大概就介绍到这了,算是一个入门,后续更多细节需要自行探索!




