
# session级事务下推及相关参数
 #### session_type
**参数说明：**指定当前会话的类型，大小写不敏感，根据用户实际取值生成执行计划。
**参数类型：**枚举类型
**参数单位：**无
**取值范围：**
- single_node：单节点会话，读写操作支持下推，根据GUC参数exec_target_node判断下推节点并生成执行计划。
- global_read_only：跨节点只读会话，正常生成分布式计划，但禁止分布式写操作。
- normal：默认会话，和原有行为保持一致，根据数据库原有逻辑执行计划。
**默认值：**normal
**设置方式** **：** 该参数属于USERSET类型参数，请参考[表2](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。注意该参数不支持使用gs_guc全局设置。
**设置建议：**推荐使用默认值。
**设置不当的风险与影响：**在单节点会话模式下（即session_type设置为single_node）执行数据插入时，数据分布的正确性由应用层保证，如果指定了错误的节点可能会发生数据不一致问题。
#### exec_target_node
**参数说明：**指定当前会话的DML以及部分DDL（TRUNCATE、ALTER TABLE...TRUNCATE PARTITION...）语句执行的DN节点名，大小写敏感。如果DN节点名不合法，则在设置时报错。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
仅GUC参数[session_type]设置为single_node时生效。
**参数类型：**字符串
**参数单位：**无
**取值范围：**当前集群内的所有DN节点名，可以通过查询PGXC_NODE系统表获取所有DN节点名。
**默认值：**""
**设置方式** **：** 该参数属于USERSET类型参数，请参考[表2](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0254.html#ZH-CN_TOPIC_0000002527826790__zh-cn_topic_0000002558055361_zh-cn_topic_0000002338364610_zh-cn_topic_0059777490_t290c8f15953843db8d8e53d867cd893d)中对应设置方法进行设置。注意该参数不支持使用gs_guc全局设置。
**设置建议：**推荐使用默认值。
**设置不当的风险与影响：**单节点会话模式下，若没有按照约束使用，可能导致数据不一致问题。
![](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
单节点会话模式具有如下约束：
- router功能在此场景下不生效。
- node_name hint指定的DN不生效，按exec_target_node下发。
- 不支持涉及行级访问控制的语句。
- 不支持分布式备机读。
- 不支持高级包语句。
- 不支持GPC，[enable_global_plancache](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0283.html#ZH-CN_TOPIC_0000002558946615__zh-cn_topic_0000002526896464_zh-cn_topic_0000002338523962_section1062361853620)参数打开时执行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;
```
