通过explain查看执行计划,查看SQL语句是否使用到分布键,DN下发DN情况可通过Node/s: 关键字来查看。
如果使用到了分布键,那么SQL只会下发到分布键对应的某个DN节点;如果没有用到分布键,那么SQL会下发到所有DN节点;没有带分布键的SQL,因为下发到了所有DN节点,消耗了更多的连接资源、计算资源,应尽量避免。
某个表的SQL语句可能有不同的where条件,在SQL优化时,应尽量确保高频并发的SQL语句是带了分布键条件。
例如,teledb_1表的分布键f2,下面的SQL where条件为f1=1,没有带分布键条件,那么SQL将下发到所有DN节点执行。
teledb=# explain select * from teledb_1 where f1=1;
QUERY PLAN
--------------------------------------------------------------------------------
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001, dn002
-> Gather (cost=1000.00..7827.20 rows=1 width=14)
Workers Planned: 2
-> Parallel Seq Scan on teledb_1 (cost=0.00..6827.10 rows=1 width=14)
Filter: (f1 = 1)
(6 rows)
下面的SQL,where条件为f2=1,带了分布键条件,SQL只下发到了f2=1所在的DN节点dn001。
teledb=# explain select * from teledb_1 where f2=1;
QUERY PLAN
--------------------------------------------------------------------------------
Remote Fast Query Execution (cost=0.00..0.00 rows=0 width=0)
Node/s: dn001
-> Gather (cost=1000.00..7827.20 rows=1 width=14)
Workers Planned: 2
-> Parallel Seq Scan on teledb_1 (cost=0.00..6827.10 rows=1 width=14)
Filter: (f2 = 1)
(6 rows)