TiDB优化器未对关联条件中“or”进行改写

还是应了那句话,只要想到的早晚会遇到,果然在目前生产上就遇到类似的问题了。在其它老牌数据库中迁移过来的存在较多这种关联字段中包含or条件的,在发帖子当时测试OB时候它的优化器就能做到改写。我们目前也只能通过人工改写的方式来进行优化,改写逻辑大体如下:
select a.c1,b.c2 from a,b where a.c1=b.c1 or a.c2=b.c2
改为方式为:

select a.pk,b.pk,a.c1,b.c2 from a,b where a.c1=b.c1
union
select a.pk,b.pk,a.c1,b.c2 from a,b where a.c2=b.c2

这里加上a.pk,b.pk主要用于避免union对重复数据去重,违反原来的语义。

如果表中没有主键就需要用隐式_tidb_rowid来代替(感谢@小龙虾爱上大龙虾 大佬的协助)。

1 个赞