top:累计 Top SQL
sys_stat_statements 的累计 Top SQL;没在收集时明说。采集于 2026-10-07(UTC+08),本地 KingbaseES V008R006C009B0014 主节点和备节点,数据库 test。工具是 Go 版源码提交 96c874f 编译的 ~/kbdiag(linux/amd64 静态二进制)。这是测试环境实测,不代表生产环境验收。没有注入故障。实验环境两个节点上 sys_stat_statements.track 都是 none,没有在收集语句,top 没有行可显示。这一页展示的就是这种情况,也是实验环境的真实状态。统计开着的情况没有采到(见最后一节)。
用法
| 参数 | 作用 |
|---|---|
--limit N | 最多显示 N 条语句;默认 20,0 表示全部 |
--by ORDER | 排序方式:time(累计执行时间,默认)、mean(每次耗时)、calls(调用次数)、io(读盘块数)、temp(写临时文件块数)。它是排序,不是过滤 |
--json | 输出 JSON |
--by 给了别的值是用法错误(退出码 64)。连接参数和 sessions 相同。
没在收集语句
skipped并写明原因,结论是 UNKNOWN:空表加 OK 等于说“没有昂贵的 SQL”,而实际上什么都没测。备库(kes-node2)上打印的一样。- 打开它的开关是
sys_stat_statements.track(top或all)。另外两种原因有各自的提示:库没加载进shared_preload_libraries(要重启),或者扩展没装在当前库(CREATE EXTENSION sys_stat_statements,或者用-d)。 - 视图按
sys_extension找到的 schema 读,不走search_path:否则别人在public里放一个同名视图,就能让 kbdiag 报假数据。 - 本连接的
track=none不等于没有数据(角色、库可以自己设,save=on也会留着旧数据),所以 kbdiag 照样读视图,一行都没有才写skipped。
统计开着时:没有采到
按源码写,不是实采:语句被收集时,输出是一张表,列是 total、share、calls、mean、rows、read、temp、user、database、query,表头说明数值是自上次重置以来的累计值。
share是这条语句占全部执行时间的比例,直接回答“数据库的时间花在哪”。哪条 SQL 算太贵没有客观线,所以top只展示,没有 finding。- 数值是自上次统计重置以来的累计值。这个版本没有
sys_stat_statements_info,重置时间拿不到,表头直说了这点。read和temp的单位是块。 track=all时,函数里执行的语句会在调用它的语句里再算一次,所以比例加起来会超过 100%,文本会说明。track=none但有行时,文本说明这些是之前收集的,或者来自自己设了track的角色和库。- 时间按量级换单位(0.09 ms、503 ms、1.75 s)。这个账号看不到的 query 显示
?。 top --interval(最近 N 秒)这个版本不做。
退出码
| 退出码 | 含义 |
|---|---|
| 0 | OK:语句有被收集 |
| 3 | UNKNOWN:有数据没采到或看不到 |
| 64 | 参数错误,包括 --by 的值不对 |
| 69 | 连不上数据库 |