1. 金仓sys_stat_statements扩展概述
作为金仓数据库(KingbaseES)的核心性能监控插件,sys_stat_statements为DBA和开发人员提供了强大的SQL语句执行统计功能。这个扩展能够记录数据库中所有SQL语句的执行情况,包括执行次数、耗时、资源消耗等关键指标,是数据库性能分析和优化的利器。
在实际生产环境中,我们经常遇到数据库性能问题,而80%的性能瓶颈往往集中在少数几个SQL语句上。sys_stat_statements就像数据库的"X光机",能够精准定位这些"问题SQL",帮助我们有的放矢地进行优化。
2. 插件安装与配置
2.1 安装步骤
安装sys_stat_statements需要修改KingbaseES的配置文件kingbase.conf:
# 编辑配置文件 vi $KINGBASE_DATA/kingbase.conf # 在shared_preload_libraries参数中添加sys_stat_statements shared_preload_libraries = 'sys_stat_statements' # 重启数据库服务使配置生效 sys_ctl restart -D $KINGBASE_DATA注意:此插件属于共享预加载(shared preload)类型,必须通过重启数据库服务来加载,不能使用CREATE EXTENSION动态加载。
2.2 关键参数配置
安装完成后,可以通过以下参数精细控制插件行为:
# 设置最大跟踪SQL数量(默认5000) sys_stat_statements.max = 10000 # 设置跟踪级别:'top'只跟踪顶层SQL,'all'跟踪所有SQL包括嵌套调用 sys_stat_statements.track = 'top' # 是否跟踪实用程序命令(非DML语句) sys_stat_statements.track_utility = on # 是否在服务器关闭时保存统计信息 sys_stat_statements.save = on这些参数需要配置在kingbase.conf中,修改后同样需要重启数据库生效。
3. 使用方法和实践技巧
3.1 基本查询方法
插件加载后,可以通过查询sys_stat_statements视图获取SQL统计信息:
-- 查询执行时间最长的TOP 10 SQL SELECT query, calls, total_time, mean_time, rows FROM sys_stat_statements ORDER BY total_time DESC LIMIT 10; -- 查询执行次数最多的SQL SELECT query, calls, total_time, mean_time FROM sys_stat_statements ORDER BY calls DESC LIMIT 10;3.2 视图字段详解
sys_stat_statements视图包含丰富的统计信息,主要字段包括:
| 字段名 | 类型 | 描述 |
|---|---|---|
| query | text | SQL语句文本(常量参数会被替换为?) |
| calls | bigint | 执行次数 |
| total_time | double | 总执行时间(毫秒) |
| min_time | double | 单次最小执行时间 |
| max_time | double | 单次最大执行时间 |
| mean_time | double | 平均执行时间 |
| rows | bigint | 处理的总行数 |
| shared_blks_hit | bigint | 共享缓冲区命中次数 |
| shared_blks_read | bigint | 从磁盘读取的块数 |
3.3 高级使用技巧
定期重置统计:可以使用以下函数重置统计信息,避免历史数据干扰分析
SELECT sys_stat_statements_reset();结合其他视图分析:将sys_stat_statements与sys_stat_activity等视图关联,可以获取更全面的性能信息
SELECT a.query_start, s.query, s.total_time, a.wait_event_type, a.wait_event FROM sys_stat_activity a JOIN sys_stat_statements s ON a.query = s.query WHERE a.state = 'active';长期监控方案:建议定期将统计信息导出到历史表,建立性能基线
CREATE TABLE sql_stats_history AS SELECT now() AS collect_time, * FROM sys_stat_statements;
4. 典型应用场景
4.1 识别性能瓶颈
通过分析执行时间和资源消耗,快速定位问题SQL:
-- 查找I/O密集型的SQL SELECT query, shared_blks_read, shared_blks_hit FROM sys_stat_statements ORDER BY shared_blks_read DESC LIMIT 10;4.2 优化SQL性能
结合执行计划,分析SQL效率:
-- 查找执行次数多且效率低的SQL SELECT query, calls, total_time, mean_time FROM sys_stat_statements WHERE calls > 1000 AND mean_time > 10 ORDER BY total_time DESC;4.3 容量规划
通过SQL执行频率和资源消耗预测系统负载:
-- 分析SQL执行频率趋势 SELECT query, calls, total_time, calls/(SELECT max(calls) FROM sys_stat_statements) AS call_ratio FROM sys_stat_statements ORDER BY calls DESC;5. 注意事项与常见问题
内存消耗:sys_stat_statements会占用共享内存,max参数设置过大可能影响数据库性能。建议根据实际情况调整,一般生产环境设置5000-10000足够。
统计精度:对于非常短的SQL(<1ms),时间统计可能不够精确。建议关注执行次数多或总耗时长的SQL。
SQL归一化:插件会对SQL进行归一化处理,将常量替换为?。这有利于归类相似SQL,但也可能导致某些具体值信息丢失。
权限控制:普通用户只能看到自己执行的SQL统计信息,超级用户可以看到所有信息。
版本兼容性:不同版本的KingbaseES可能在字段名称和功能上有细微差异,使用时需注意版本说明。
通过合理使用sys_stat_statements扩展,DBA可以建立起有效的SQL性能监控体系,快速定位和解决数据库性能问题,提升整个系统的稳定性和效率。