
# 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执行查询语句
  
 
#### 示例
```
--查询当前集群的节点名称。
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;
```
