三表join查询优化

各位大佬们好!

数据库新人求助!今天查询数据库遇到一个三表join的问题:

假设是a,b,c三个表,大致的SQL是:

select c.* from a,b,c where b.xxx=c.xxx and c.yyyy='1' and a.uid = b.uid;

其中a.uid是主键,其余均有索引。

执行计划是a,b先hash join 然后结果跟c hash join。
实际排查发现如果b和c先hash join后,实际数据只有50条, 为此我用

select/+*ordered*/ c.* from b,c,a where b.xxx=c.xxx and c.yyyy='1' and a.uid = b.uid;

指定了顺序,执行计划变成了 b与c hash join 再和a hash。

现在的问题是,这一次执行计划中,b与c先hash join的结果,执行计划estimate row是1000万行,与实际情况有严重偏差。然后最后结果并没有效率提升。

请问这种情况下,我应该怎么办?

谢谢大佬们解惑!

试试 /+ USE_NL(c b)/

建议发一下相关信息

  • 三个表表结构以及数据量

  • 连接列的NDV 值(number of distinct values)

  • 原执行计划和加hint后的详细执行计划,用 explain extended
    参考文章 https://mp.weixin.qq.com/s/HSVBI5vHvyHwc5jX0AbKAQ

  • 集群之前做过一次大合并,这样表和列的统计信息才比较准。