关联查询使用分布键关联 本页介绍天翼云TeleDB数据库关联查询使用分布键关联的最佳实践。 多表关联时,通过explain查看执行计划,查看SQL语句是否使用到分布键(前面已介绍),查看SQL关联是否使用到了分布键。 如果两表关联都使用到了分布键,那么两表关联可以在dn节点内完成,不需要在dn节点之间交互数据;如果其中一张表没有用分布键,那么两表关联不能在dn节点内完成,该表需要在dn节点之间交互数据;如果两张表都没有使用分布键,那么两张表都需要在dn节点之间交互数据。 两表关联时,应优先使用两表的分布键关联,尽量保证高频并发的SQL都用到了分布键关联;其次至少有一张表用到了分布键,也可以减少一次数据重分布;两张表都没有用到分布键的场景应尽量避免。同时,两表关联时如果只能有一个表带分布键,那么更大的表、或查询结果集更大的表优先使用到分布键,让小一点的表去重分布数据。 在执行计划中,如果DN之间有数据重分布,那么执行计划中会有这样的关键字Distribute results by S: f1,这里表示按f1进行数据重分布。 例如,teledb1的分布键为f2,teledb2的分布键为f1,下面的SQL,两表关联时teledb1没有用到分布键,两表关联不能在dn节点内完成,需要dn节点之间发起数据交互(重分布),teledb1在完成表扫描后发起了按f1字段重分布的动作,对应执行计划中的Distribute results by S: f1。 teledb explain select teledb1. from teledb1,teledb2 where teledb1.f1teledb2.f1 ; QUERY PLAN Remote Subquery Scan on all (dn001,dn002) (cost29.80..186.32 rows3872 width40) > Hash Join (cost29.80..186.32 rows3872 width40) Hash Cond: (teledb1.f1 teledb2.f1) > Remote Subquery Scan on all (dn001,dn002) (cost100.00..158.40 rows880 width40) Distribute results by S: f1 > Seq Scan on teledb1 (cost0.00..18.80 rows880 width40) > Hash (cost18.80..18.80 rows880 width4) > Seq Scan on teledb2 (cost0.00..18.80 rows880 width4) (8 rows) 例如下面的SQL,teledb1和teledb2关联时都用到了分布键,那么两表关联可以在dn节点内完成,不需要在dn节点之间交互数据。 teledb