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;