更新时间:2024-11-12 GMT+08:00
分享

session级事务下推及相关参数

session_type

参数说明:指定当前会话的类型,大小写不敏感,根据用户实际取值生成执行计划。

参数类型:枚举类型

参数单位:

取值范围:

  • single_node:单节点会话,读写操作支持下推,根据GUC参数exec_target_node判断下推节点并生成执行计划。
  • global_read_only:跨节点只读会话,正常生成分布式计划,但禁止分布式写操作。
  • normal:默认会话,和原有行为保持一致,根据数据库原有逻辑执行计划。

默认值:normal

设置方式该参数属于USERSET类型参数,请参考表2中对应设置方法进行设置。注意该参数不支持使用gs_guc全局设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:在单节点会话模式下(即session_type设置为single_node)执行数据插入时,数据分布的正确性由应用层保证,如果指定了错误的节点可能会发生数据不一致问题。

exec_target_node

参数说明:指定当前会话的DML以及部分DDL(TRUNCATE、ALTER TABLE...TRUNCATE PARTITION...)语句执行的DN节点名,大小写敏感。如果DN节点名不合法,则在设置时报错。

仅GUC参数session_type设置为single_node时生效。

参数类型:字符串

参数单位:

取值范围:当前集群内的所有DN节点名,可以通过查询PGXC_NODE系统表获取所有DN节点名。

默认值:""

设置方式该参数属于USERSET类型参数,请参考表2中对应设置方法进行设置。注意该参数不支持使用gs_guc全局设置。

设置建议:推荐使用默认值。

设置不当的风险与影响:单节点会话模式下,若没有按照约束使用,可能导致数据不一致问题。

单节点会话模式具有如下约束:

  • router功能在此场景下不生效。
  • node_name hint指定的DN不生效,按exec_target_node下发。
  • 不支持涉及行级访问控制的语句。
  • 不支持分布式备机读。
  • 不支持高级包语句。
  • 不支持GPC,enable_global_plancache参数打开时执行PBE报错。
  • 在单节点会话模式下,使用PBE语句时,会导致计划类型直接选择GPlan。而如果已经生成计划后再指定单节点会话模式,则保持原有计划类型不变。

示例

gaussdb=# SET log_min_messages = debug2;
gaussdb=# SET logging_module = 'on(opt_choice)';
gaussdb=# CREATE TABLE t1(a int ,b int);
gaussdb=# PREPARE x(int) AS SELECT * FROM t1;
gaussdb=# EXPLAIN EXECUTE x(10);
NOTICE:  [Choosing C/G/A Plan]: GPlan, reason: Using pbe optimization.
NOTICE:  [Choosing C/G/A Plan]: CPlan, reason: First 5 times using CPlan.
                    QUERY PLAN                    
--------------------------------------------------
 Data Node Scan  (cost=0.00..0.00 rows=0 width=0)
   Node/s: All datanodes
(2 rows)
gaussdb=# DEALLOCATE x;

gaussdb=# PREPARE x(int) AS SELECT * FROM t1;
gaussdb=# SET session_type=single_node;
gaussdb=# SET exec_target_node=datanode1;
gaussdb=# EXPLAIN EXECUTE x(10);
NOTICE:  [Choosing C/G/A Plan]: GPlan, reason: Using pbe optimization.
NOTICE:  [Choosing C/G/A Plan]: GPlan, reason: Using pbe optimization.
                    QUERY PLAN                    
--------------------------------------------------
 Data Node Scan  (cost=0.00..0.00 rows=0 width=0)
   Node/s: datanode1
(2 rows)
gaussdb=# DEALLOCATE x;
gaussdb=# DROP TABLE t1;

相关文档