TIDB 5.4.0 使用 limit 爆内存oom , 不使用 limit 则可以查询出结果

如下图所示, 加了 limit 10的时候,直接oom; 不加则 2s 出结果; 请问这是什么问题? 我看以前的版本也有同学提出 limit 出现性能问题, 但没有看到原因及解决方法,谢谢

1 个赞

show stats_healthy先看下这几个表的健康度,重新收集下统计信息试试

image

健康度 如图;
加 limit 10 就 40多s 后 oom; 不加 也要2s 出结果

测试一下这个参数呢?

好, 我等下测一下 ; 但是哪个高手可以来帮忙解释一下, 我调换了一下2个表的位置,执行计划多了红框那里的,然后0.16s 就出结果了

另外, 3个关联的表数据量差不多,都是400W 左右,谢谢

优化器问题,调整表顺序后影响执行计划的表选择顺序

我的5.4里 并不存在这个变量, 但执行 又会显示成功; 但没有效果

表的顺序不一样, 结果存在这么大的差异么? 这不应该啊

很正常,你第一次是 t1全索引扫描index full scan一遍然后回表查所有数据再驱动t6关联之后驱动t7关联,换位置后是t2走index range scan过滤后回表查询在驱动t2然后t1, 你可以看下每个步骤返回的数据量act-rows。 只是优化器没有选择最佳执行计划是个问题,你可以试试重新收集3个表的统计信息,然后看看不调换顺序能能否走出同样执行计划

2 个赞

全部重新收集统计信息后, 得到的执行计划全表扫, 虽然不oom了, 但没有换位置的好

换了表顺序,执行计划里没有tablefullscan 所以快

优化器还需完善

看着还是优化器bug

复杂查询的时候优化器经常不能选择最优,除了调整代码,analyze table 也管用吧?

analyze table是让统计信息是最新的 期望优化器能根据统计信息选出执行计划,如果可以的话可以用SPM绑定执行计划,就不需要修改代码了

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。