如何理解两表关联查询,不同变量相同执行计划内相同算子内的差异

编辑6.log (1.8 KB)

实际运行了一遍,结果和执行计划预估基本一致(27177550,27098336)

分析了一下,有一种可能:

由于有 limit 50 的限制,第一个条件在 join 的时候很快就满足了这个 limit 50 的限制,所以剩下的计算被丢弃了。第二个条件却很难满足 limit 50 的限制。

证明可以看第二个条件 b.client = ‘vsdshanghaigo’ 的 explain analyze:
IndexJoin_58 这个只返回了 0 条数据,说明整个执行过程没有满足 limit 50 要的 50 行,导致了它扫描完了所有数据。

编辑7.log (6.9 KB)

我去掉了时间排序和limit 发现执行计划还是很异常

vsdshanghaigo 有2567808记录扫描2664201条
contract 有20247014条记录扫描325696条

contract | 20247014

IndexScan_39 | 325729.91 | cop | table:b, index:client, range:[“contract”,“contract”], keep order:false | proc max:686ms, min:158ms, p80:611ms, p95:636ms, rows:20249811, iters:19872, tasks:21 | N/A

vsdshanghaigo | 2567808

IndexScan_39 | 2654096.60 | cop | table:b, index:client, range:[“vcreditshandai”,“vcreditshandai”], keep order:false | proc max:515ms, min:191ms, p80:515ms, p95:515ms, rows:2567953, iters:2526, tasks:4 | N/A

那执行计划的count是什么含义?

执行计划的 count 是统计信息和代价模型的估算值

是预估值吗?为什么在使用contract的时候差距那么大呢?

数据量过大后,估算值会有些偏差,总体来说没有差上很多个数量级的话,planner 都能选中一个合理的执行计划。

理解了,非常感谢。:grinning:

:+1:

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