EXECUTE DIRECT
功能描述
在指定的节点上执行SQL语句。一般情况下,SQL语句的执行是由集群负载自动分配到合适的节点上,EXECUTE DIRECT主要用于数据库维护和测试。
注意事项
- 当enable_nonsysadmin_execute_direct=off时,只有系统管理员和监控管理员才能执行EXECUTE DIRECT。
- 为了各个节点上数据的一致性,SQL语句仅支持SELECT,不允许执行事务语句、DDL、DML。
- 使用此类型语句在指定的DN执行stddev聚集计算时,返回结果集是以三元数组形式返回,如{3, 8, 30},表示count结果为3,sum结果为8,平方和为30。使用此类型语句在指定的DN执行AVG聚集计算时,返回结果集以二元组形式返回,如{4,2},表示count结果为4,sum结果为2。
- 当指定多个节点时,不支持agg函数,当query中包含agg函数时,会返回“EXECUTE DIRECT on multinode not support agg functions.”
- 由于CN节点不存储用户表数据,不允许指定CN节点执行用户表上的SELECT查询。
- 不允许执行嵌套的EXECUTE DIRECT语句,即执行的SQL语句不能同样是EXECUTE DIRECT语句,此时可直接执行最内层EXECUTE DIRECT语句代替。
- agg函数查询结果与直接在CN上查询不一致,会返回多个信息,不支持array_avg函数。
- 参数为nodeoid或者nodeoid list时,仅支持分布式下参数enable_direct_standby_datanodes成功设置时才生效。实现到指定DN节点查询,不支持无效或重复nodeoid,以及不支持nodeoid和nodename混合使用。
语法格式
EXECUTE DIRECT ON ( nodename [, ... ] ) query ;
EXECUTE DIRECT ON ( nodeoid [, ... ] ) query;
EXECUTE DIRECT ON { COORDINATORS | DATANODES | ALL } query;
参数说明
- nodename
节点名称。
取值范围:已存在的节点。
- nodeoid
节点oid。
取值范围:已存在的DN节点oid,查看PGXC_NODE系统表获取。
- query
要执行查询语句。
- COORDINATORS
在所有coordinator执行查询语句
- DATANODES
在所有datanode执行查询语句
- ALL
在所有coordinator和datanode执行查询语句
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
--查询当前集群的节点名称。 gaussdb=# SELECT node_name,oid FROM pgxc_node WHERE node_type IN ('C','D') ORDER BY 1; node_name | oid -------------------+------- cn_5001 | 15517 cn_5002 | 16387 cn_5003 | 16391 dn_6001_6002_6003 | 16384 dn_6004_6005_6006 | 16388 dn_6007_6008_6009 | 16392 (6 rows) --创建以range分布的表,并插入数据。 gaussdb=# CREATE TABLE tbl_range( id INT, name VARCHAR(20), province VARCHAR(60), --省 country VARCHAR(30) DEFAULT 'China' --国籍 )DISTRIBUTE BY RANGE(id)( SLICE s1 VALUES LESS THAN (100) DATANODE dn_6001_6002_6003, SLICE s2 VALUES LESS THAN (200) DATANODE dn_6004_6005_6006, SLICE s3 VALUES LESS THAN (MAXVALUE) DATANODE dn_6007_6008_6009 ); gaussdb=# INSERT INTO tbl_range VALUES (52,'Bob','Beijing','China'), (100,'Ben','Shanghai','China'), (150,'Scott','Guangzhou','China'), (300,'Jordan','Beijing','China'); --查询该表分布在dn_6007_6008_6009节点上的数据。 gaussdb=# EXECUTE DIRECT ON(dn_6007_6008_6009) 'SELECT * FROM tbl_range'; id | name | province | country -----+--------+----------+--------- 300 | Jordan | Beijing | China (1 row) --删除表tbl_range。 gaussdb=# DROP TABLE tbl_range; |