匪夷所思的order by,对7条记录居然查询超时

ob:社区版 4.3.5.3

这个sql是有点复杂,其实这个时间点,满足条件的数据只有7条,按我们常规的理解,对这7条数据做排序,几乎不需要时间吧,可是居然会超时。

只执行内查询:

1秒不到,属于正常。

然后更想不到的是,把原始sql order by 里面的create_time去掉,也很快

但是只要把create_time加上去,必现超时。

不得不让人对ob的查询引擎感到疑惑啊,这种现象mysql上从来没遇到过。

附上sql文本:

ob-query-timeout-sql.txt (2.9 KB)

2 个赞

建表sql也麻烦提供一份
使用obdiag执行sql性能分析一下

SQL性能问题, 此处env中的trace_id对应gv$ob_sql_audit的trace_id

obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-hxx -Pxx -uxx -pxx -Dxx’, trace_id=‘xx’}”

1 个赞

是否建索引了?

1 个赞

t_order_create_sql.txt (4.5 KB)
obdiag_gather_pack_20250923152056.zip (505.8 KB)
obgather命令输出.txt (17.8 KB)

请看附件,谢谢!

1 个赞

create_time这个字段是不是没有索引?

加个 /+NO_REWRITE/ 试下看下执行计划

1 个赞

/+NO_USE_DAS(@“SEL$3” “s”@“SEL$3”) NO_USE_DAS(@“SEL$4” “s”@“SEL$4”)/ 语句中加上hint 在提供一下执行计划 explain extended


这个SQL主要慢在这里

1 个赞

有索引。

但是有没有索引,我都想不明白,内部sql查出来只有7行记录,然后对这7行做排序,有没有索引有影响吗?

加了这个,稳定在1秒一下。

这个查询引擎的运行逻辑真的让人看不懂了,感觉以前mysql学的理论用不上了,不知道该怎么优化sql

能按照我楼上发的 在提供一下执行计划么?

OB 跟MYSQL的优化器不太一样,多了查询改写的步骤,大部分情况查询改写会往好的方向进行改写,但是也有改写之后很差的情况

加了这个hint,执行时间在也1秒一下。

explain_extended.txt (122.9 KB)


主要是das本地或者远程拉取的时候等待的时间很长 加了hint以后不走das 应该就可以了 目前可以先饶过去 后期会逐渐优化的

1 个赞

加油哦,让大家对ob的信心更强

有执行计划吗,发出来看看呢

可以尝试创建索引