Oracle的参数可以设置system和session级别,当设置了session级别的参数时,会覆盖值system级别。
KingbaseES除了该两个级别外,还有database级别、user/role级别、user/role+database组合级别。下面针对这几个级别的参数优先级问题,进行测试验证,测试以参数 idle_in_transaction_session_timeout 为例子。
查询默认配置
- [kingbase@singlekbdb data]$ grep idle_in_transaction_session_timeout kingbase.conf
- #idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
- system用户登录数据库查询,可以看到参数值的来源是default,未修改继承默认系统设置。
- test1=# select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
- name | setting | context | source
- -------------------------------------+---------+---------+---------
- idle_in_transaction_session_timeout | 0 | user | default
测试一:设置user级别参数,测试对比user级别和system级别的优先级。
- test1=# alter user u1 set idle_in_transaction_session_timeout=10;
- ALTER ROLE
- test1=# \c - u1
- 您现在已经连接到数据库 "test1",用户 "u1".
- test1=> select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
- name | setting | context | source
- -------------------------------------+---------+---------+--------
- idle_in_transaction_session_timeout | 10 | user | user
- (1 行记录)
- 登录u1用户,看到参数值已变更为10,参数值来源是是user级别,所以user级别的优先于system级别。
测试二、设置database级别参数
- test1=# alter database test1 set idle_in_transaction_session_timeout = 20;
- ALTER DATABASE
- test1=# \c -
- 您现在已经连接到数据库 "test1",用户 "system".
- test1=# select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
- name | setting | context | source
- -------------------------------------+---------+---------+----------
- idle_in_transaction_session_timeout | 20 | user | database
- test1=# \c - u1
- 您现在已经连接到数据库 "test1",用户 "u1".
- test1=> select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
- name | setting | context | source
- -------------------------------------+---------+---------+--------
- idle_in_transaction_session_timeout | 10 | user | user
- (1 行记录)
- 修改配置后system会话的值已变更为20,参数来源是database。 u1用户的会话还是保持之前的设置不变。
- 所以,database级别优先于system级别,而user级别优先于database级别。
测试三、设置user+database级别参数
- test1=> \c - system
- 您现在已经连接到数据库 "test1",用户 "system".
- test1=# alter user u1 in database test1 set idle_in_transaction_session_timeout=30;
- ALTER ROLE
- test1=# \c - u1
- 您现在已经连接到数据库 "test1",用户 "u1".
- test1=> select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
- name | setting | context | source
- -------------------------------------+---------+---------+---------------
- idle_in_transaction_session_timeout | 30 | user | database user
- (1 行记录)
- 用户u1登录test1的会话,参数idle_in_transaction_session_timeout使用了user+database组合级别的参数值:30。
- 所以,user+database组合级别优先于user级别。
- test1=> set idle_in_transaction_session_timeout=40;
- SET
- test1=> select name,setting,context,source from sys_settings where name ='idle_in_transaction_session_timeout';
- name | setting | context | source
- -------------------------------------+---------+---------+---------
- idle_in_transaction_session_timeout | 40 | user | session
- (1 行记录)
- 直接set session级别参数值,覆盖前面的所有级别。
总结
KingbaseES 参数级别的优先顺序为:
1.默认情况下,session会继承system级别参数值;
2.在设置了database级别参数的情况下,database级别的参数值优先于system级别;
3.在设置了user/role级别参数的情况下,user级别的参数值优先于database级别;
4.在设置了user+database级别参数的情况下,该组合级别的参数值优先于user级别;
5.在当前session给会话直接set parameter=value的情况下,该参数值最优先。