查询性能问题

4.2.5版本,测试环境配置很低,3个节点每个节点只有24G内存,16c,ssd
对于一张没有索引没有主键的大表,有以下2个sql
sql1: select sum(aa) from t1;
sql2: select avg(bb) from t1;
我第一次执行sql1比较慢,大概5秒,接着执行sql2只需0.1-0.2秒。同一个sql会有缓存这个好理解,上述不同sql针对不同字段,这个情况怎么理解呢?

1 个赞

1、发一下执行计划 explain extended 保存在文本里
2、获取 sql plan monitor 信息,全过程可以参看如下操作
1.登录sys租户设置 sql_plan_monitor 参数
–确认 sql_plan_monitor 已经打开
show parameters like ‘enable_sql_audit’;

–如果 enable_sql_audit = False 则将其打开
alter system enable_sql_audit = true;

  1. 登录业务租户,获取 sql 的执行计划
    EXPLAIN EXTENDED sql语句;

  2. 设置临时 trace 获取
    SET ob_enable_show_trace=‘ON’;

  3. 再次执行需要采集的 sql 语句

  4. 获取上一步执行的 sql 的 trace_id 信息
    select last_trace_id();

  5. 临时关闭 plan monitor 数据,防止信息被覆盖
    alter system enable_sql_audit = false;

  6. 获取 plan monitor 的 sql ,将 xxxxx 替换为第 6 步返回的 trace_id ,以获取每个算子的吐行信息
    select plan_line_id, plan_operation, sum(output_rows), sum(STARTS) rescan, min(first_refresh_time) open_time, max(last_refresh_time) close_time, min(first_change_time) first_row_time, max(last_change_time) last_row_eof_time, count(1) from oceanbase.gv$sql_plan_monitor where trace_id = ‘xxxxx’ group by plan_line_id, plan_operation order by plan_line_id;

8 恢复 sql_audit 参数
alter system enable_sql_audit = true;
3、obdiag收集

收集SQL性能问题信息

obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”
安装文档
https://www.oceanbase.com/docs/common-obdiag-cn-1000000001768178

1 个赞

这个执行7秒多
00062858-0da4-d88e-e357-5f920b293c9e.txt (47.9 KB)
接着执行下面这个,0.1秒
00062858-1b11-a896-0f96-ff3be33cb842.txt (4.5 KB)

1 个赞

我看着意思是response_result这一步花了7.66s,都耗在这里了,但我不知道啥意思

1 个赞

response_result:计划过程和结果。你把执行计划和sql_monitor 发一下

1 个赞

EXPLAIN EXTENDED sql语句; 尽量保存在文本里 不然这样很乱 几乎没办法看

1 个赞

avg(WC004_STATUS).txt (2.3 KB)
SUM(WC002_PFLOWSTEP).txt (2.1 KB)

1 个赞

1 个赞

另一个语句的sql_monitor发一下

1 个赞

两个语句都加一下 hint /*+monitor */
尽量用obdiag收集一下 好分析问题 很好用的工具

收集SQL性能问题信息

obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”
安装文档
https://www.oceanbase.com/docs/common-obdiag-cn-1000000001768178

1 个赞

按照我上面发的 重新执行 用obdiag收集一下

1 个赞

1 个赞

你先用obdiag收集一下吧 obdiag收集完 会有一个详细的报告信息 好解读一些

obdiag gather scene:
gather_scene.zip (454.4 KB)
新建一张表,insert数据,然后执行下面语句
call dbms_stats.gather_table_stats(‘test’, ‘GT012_LOGININFO_6’);
ALTER SYSTEM MINOR FREEZE;
然后执行以下sql:
select /*+monitor */ sum(GC012_Client) from GT012_LOGININFO_6
第一次6.9s,后面再执行都是0.7s

用其他数据库同一个sql连续执行多次,执行时间不会相差这么大。我主要是担心我哪里配置的不对或者用的不对(初学),导致原本就该0.7s执行完,结果第一次要花10倍的时间。

谢谢

之前不是说聚合函数sum()和avg()么?我看现在是同一条语句执行两次 第一次6.9s第二次或着多次0.7s是么?

都是一个意思,就是第一次慢,从第二次开始就快很多。
比如第一次sum慢,第二次sum就快
或者第一次avg慢,接着再执行sum就快

不一样的兄弟 使用的算子不一样 第一次发的 牵扯聚合函数的算法问题 第二次发的第一次执行是硬解析 第二次软解析 计划被缓存了 是不一样的 在你看来表现的是一样的

是,表现出来的先快后慢的效果是一样的。同一个sql执行多次算第一个场景,我再统一一个先avg后sum的场景发出来

avg(a)_sum(b).zip (456.0 KB)
先avg(aa),3s
然后sum(bb),0.07s

好的 把这个场景也发一下