MySQL 多表关连时优化器缺陷出现的错误Join order
众所周知,在多表关连SQL上MySQL 优化器相对其他如oracle,postgreSQL有一些缺陷,今天看到了一个现象开始Join order是正常的在某张表做了delete后,产生了错误的cost, 改变了join 顺序,而产生了笛卡尔积,导致SQL性能下降,简单记录。
提供综合数据库运维服务与优化方案(不限Oracle MySQL PG GaussDB GoldenDB OceanBase等), 微信/Tel:(+86)134-365-60330
众所周知,在多表关连SQL上MySQL 优化器相对其他如oracle,postgreSQL有一些缺陷,今天看到了一个现象开始Join order是正常的在某张表做了delete后,产生了错误的cost, 改变了join 顺序,而产生了笛卡尔积,导致SQL性能下降,简单记录。
在oracle多表关连中有SQL hint可以干预CBO产生的不合理的表join顺序,如ordered, leading等,但PostgreSQL和部分基于PG国产数据库如Highgo V9.5, 目前也还不支持SQL hint。当遇到SQL性能问题,明确某个join 顺序更好时,如何影响PG数据库优化器执行指定的执行计划呢?如果您真的需要SQL hint,在pg中可以安装 pg_hint_plan 扩展,但目前应该是因为highgo的oracle和pg的双兼容模式,如果实现pg_hint_plan在解析器上隔离上要复杂了些,所以暂未实现,又或者不想安装第三方扩展,在这种情况下,记录几个可以强制执行join ordered的替代方法。