更新时间:2024-06-03 GMT+08:00

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;