mogdb(其实也包括opengauss, 以后如果不特意说明,opengauss也同理)中,sql的相关统计信息保存在 dbe_perf.statement表中。
值得注意的是,dbe_perf这个schema在一个实例的所有数据库中都可以访问到,且对应同一份数据。但权限控制比较严格,只有具有monitoradmin的用户有权限访问。甚至连授予了sysadmin的用户都没有权限。当然,初始用户是有权限的,以至于有时用惯了初始用户,往往会忽略访问dbe_perf.*是需要额外权限的。
其他用户如果要访问,需要被授予monitoradmin权限。
create user xxx monadmin ....
或者
alter user xxx monadmin ....
dbe_perf.statement(后面提及可能会略去"dbe_perf."前缀)可以类比oracle的vsql或者vsqlstat, 但有一点比较特殊,就是它记录的是“归一化”之后的sql, 所谓的归一化,就是替换掉sql文本里面的常量位和变量位为占位符?。这样就算没有使用绑定变量,统计的也是同样的sql.
我经常使用的获取top sql的脚本是:
select unique_sql_id,round(total_elapse_time/1e6,1) "总执行时间",n_calls "执行次数",round(total_elapse_time/n_calls/1e3,2) "单次时间"
,round(cpu_time/n_calls/1e3,2) "单次cpu时间" ,round(data_io_time/n_calls/1e3,1) "单次io时间"
,round(n_blocks_fetched/n_calls,1) "单次内存块",round((n_blocks_fetched-n_blocks_hit)/n_calls,1) "单次物理块"
,round(n_tuples_fetched/n_calls,1) "单次访问行数",round(n_tuples_returned/n_calls,1) "单次返回行数"
,substr(query,1,1024) "sql文本"
from dbe_perf.statement
where n_calls>0
order by 2 desc limit 30;
使用中文别名的原因是为了省去解释各个字段名称的篇幅。
如果需要进一步了解,可以访问
此sql取出的是根据总执行时间排序的前30条,当然,根据需要,你可以添加其他的列,也可以使用其他的排序规则,以获取自己需要的top sql.
有几个参数可以调节dbe_perf.statement里面的相关信息,主要是
- instr_unique_sql_count,设置数据库内statement记录的最大条数,默认100,根据需要可以调整的更大。
- track_stmt_details_size,设置statement里面query这一列的最大长度,默认4096,超过会截断。如果你的数据库中经常出现很大的sql, 且你需要通过statement表获取准确的sql文本,可以考虑改大一些。
当然,改大这两个参数,会消耗更大的内存。
最后修改时间:2023-01-13 09:45:23
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【米乐app官网下载的版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。