请教一个慢sql执行的问题

ob: 社区版4.4.1.0
部署:3台配置一样的ecs(8c 32G )

查询sql执行速度慢的记录:
SELECT
usec_to_time(REQUEST_TIME) AS start_time,
elapsed_time/1000 AS query_time,
query_sql AS sql_text,
user_name AS user_host,
svr_ip AS db
FROM gv$ob_sql_audit
WHERE
query_sql LIKE ‘%unfinished_count%’
AND usec_to_time(REQUEST_TIME) > ‘2025-12-08’
ORDER BY elapsed_time DESC, request_time DESC


可以看到有个sql,基本上每分钟都会慢的记录。

这条sql是在java程序里面执行的,java应用服务器本地安装了obproxy,java程序连接的是本地的obproxy。

1 ssh登录192.168.0.33这个ob,用obclient连接,执行对应的sql,速度很快,几百毫秒;
2 ssh登录java应用服务器,用obclient连接本地obproxy,执行同样的sql,数据也很快,几百毫秒;

所以问题在哪里呢 难道是java程序用的mysql客户端导致的? 请帮忙分析,谢谢!

又看了一下数据

java执行的时候,wait时间明显要大很多

3 个赞

学习一下,请大佬们解答

1 个赞

听你分析的话 应该是的 可以看看是不是驱动哪里的参数配置有问题 驱动使用的哪个版本

1 个赞

程序里面使用的是mysql-connector-java:8.0.25

ssh登录java应用服务器 这个需要驱动程序么?

连接参数也是常规的
useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false

不用啊,就是普通的ssh登录,然后再用obclient连接数据库


把这个查询的信息 弄一个表格提供一下

@AntTech_ZGW8AE 有无最小可复现的代码呢?

收藏了

ob_sql_audit1419.zip (67.1 KB)

导出为xls格式了,请看14:18分附近的记录
其中有几条sql语句: SELECT /ligang1418/,这个是我在app服务器上手工执行的,其他都是java程序中执行的。

请问您指的代码是sql语句吗?

@AntTech_ZGW8AE 是 java 代码,就是这段代码可以复现 SQL 执行速度慢的现象

java代码很简单,springboot项目,执行
List list = orderMapper.getNeedAutoCheckOrderSensi2(delayTimeSensi);

在mapper里面定义了这个getNeedAutoCheckOrderSensi2

在xml里面写具体的sql,都是很标准的方式

可否给个目标表的表结构示例和数据示例,以及目标表有多少数据?

你的查询 SQL 是什么,Excel 中好像截断了,没有看到

抱歉,没想到用wps转了一下,内容没有了,sql是这个:

SELECT /ligang1418/
a.order_id,
a.use_type,
( SELECT COUNT( 1 ) FROM t_order_file g,t_file h WHERE g.order_id = a.order_id AND h.file_id = g.file_id AND
(h.sensi_flag is null OR h.sensi_flag in (1,1000))) unfinished_count,
( SELECT COUNT( 1 ) FROM t_order_file g,t_file h WHERE g.order_id = a.order_id AND h.file_id = g.file_id AND
h.sensi_flag in (2,96,97) ) sensi_count,
( SELECT COUNT( 1 ) FROM t_order_file g,t_file h WHERE g.order_id = a.order_id AND h.file_id = g.file_id AND
h.sensi_flag in (98,99)) black_count,
u.censor_flag,u.sensi_handle_flag
FROM
t_order a
LEFT JOIN t_set s ON a.set_id = s.set_id
LEFT JOIN t_set_security_policy t on s.set_id = t.set_id
LEFT JOIN t_security_policy u on t.policy_id = u.policy_id
WHERE
a.state_date > DATE_ADD(now(),INTERVAL - 3 HOUR) and a.r_tenant_id = ‘woqu’
AND a.state_date < DATE_ADD(now(),INTERVAL - 60 SECOND)
AND a.state = ‘00’
AND a.checked_flag is null;

order表数据有几百万,现在的问题,其实不是数据多少,而是为何走java执行会有时候慢,直接走obclient就很快

这个需要看是否可以复现,所以问了下数据量

从你提供的 SQL 看,涉及 6 张表,这 6 张表 t_order、t_order_file、t_file、t_set、t_set_security_policy、t_security_policy 的数据量各是多少呢,方便的话,是否可以每张表给一条示例数据