向插件中添加guc参数

添加GUC参数vb_casesensitive,设置数据库的大小写敏感。
如为on,则大小写敏感,则与现行数据库实现一致,加双引号大小写敏感,不加双引号默认小写大小写不敏感;如为off,大小写不敏感,即不管是否使用双引号,均视为小写

  • guc参数设置
    guc相关参数在guc.cpp中初始化,调用InitializeGUCOptions函数。其中bool类型的参数在InitConfigureNamesBool中初始化。
    添加参数vb_casesensitive
// 在InitConfigureNamesBool函数,将参数加入到数组localConfigureNamesBool中
{{"vb_casesensitive",
  PGC_USERSET,  // 参数可被所有用户修改
  QUERY_TUNING,
  gettext_noop("case sensitive."),
  NULL},
  &u_sess->attr.attr_common.casesensitive,  // 绑定knl_session_attr_common的casesensitive成员
  false,  // 默认值为false
  NULL,
  NULL,
  NULL}

// 由于绑定的knl_session_attr_common的casesensitive成员,需要在knl_session_attr_common中增加该成员
bool casesensitive;

-- 语法解析中处理大小写
按需求,只要vb_casesensitive为off时,将对象名处理为小写。sql语句的执行需要先进行词法语法解析,可以在解析过程中去处理大小写。
gram.y中,名称如字段名表名等,都在ColId分支,type_function_name分支处理type,function的名称。在这两个分支中处理大小写。

// 在定义段增加函数定义
static char * dealwithCaseSensitive(char *name);

// 在代码段定义处理大小写的函数
static char *
dealwithCaseSensitive(char *name) {
    if (name == NULL)
        return name;
    if (!u_sess->attr.attr_common.casesensitive) { 
        // vb_casesensitive为off时,处理成小写
        int len = strlen(name);
        for (int i = 0; i < len; i++) {
            char ch = name[i];
            if (ch >= 'A' && ch <= 'Z') {
                ch += 'a' - 'A';
            }
            name[i] = ch;
        }
    }
    return name;
}

// 在规则段增加处理
ColId:      IDENT                                   { $$ = dealwithCaseSensitive(pstrdup($1)); }
            | unreserved_keyword                    { $$ = dealwithCaseSensitive(pstrdup($1)); }
            | col_name_keyword                      { $$ = dealwithCaseSensitive(pstrdup($1)); }
        ;

/* Type/function identifier --- names that can be type or function names.
 */
type_function_name: IDENT                           { $$ = dealwithCaseSensitive(pstrdup($1)); }
            | unreserved_keyword                    { $$ = dealwithCaseSensitive(pstrdup($1)); }
            | type_func_name_keyword                { $$ = dealwithCaseSensitive(pstrdup($1)); }
        ;

重新编译后,启动数据库,进入gsql命令行

postgres=# show vb_casesensitive;
 vb_casesensitive
------------------------
 off
(1 row)

postgres=# \d a
Did not find any relation named "a".
postgres=# create table "A"("ID" int);
CREATE TABLE
postgres=# \d a
      Table "public.a"
 Column |  Type   | Modifiers
--------+---------+-----------
 id     | integer |         

postgres=# 
在 openGauss 中,通过合理配置 GUC(Grand Unified Configuration)参数,可以有效优化网络性能,提升数据库在高并发、大规模连接场景下的稳定性与响应能力。 ### 网络连接配置优化 `listen_addresses` 参数用于指定数据库监听的 IP 地址,合理设置可以控制数据库对外服务的网络接口。若仅需本地访问,可设置为 `'localhost'`;若需支持远程访问,则可设置为 `'*'` 或具体的 IP 地址列表。 ```conf listen_addresses = '*' ``` `port` 参数用于设置数据库监听的端口号,默认为 `26000`,可根据实际网络环境进行调整以避免端口冲突或满足特定的网络策略要求。 ```conf port = 26000 ``` `max_connections` 控制数据库的最大并发连接数,设置过大会导致资源竞争,设置过小可能限制客户端访问。根据实际业务需求合理配置,有助于提升网络吞吐能力。 ```conf max_connections = 200 ``` ### 网络超时与空闲连接管理 `tcp_keepalives_idle` 设置 TCP 连接在无数据传输时保持活跃的空闲时间(单位为秒),防止连接因超时被断开。 ```conf tcp_keepalives_idle = 60 ``` `tcp_keepalives_interval` 设置 TCP 连接在发送 Keepalive 探测包之间的间隔时间(单位为秒),有助于及时发现断开的连接。 ```conf tcp_keepalives_interval = 10 ``` `tcp_keepalives_count` 设置 TCP 连接在断开前发送的 Keepalive 探测包的最大次数,避免因短暂网络波动导致连接中断。 ```conf tcp_keepalives_count = 5 ``` `idle_in_transaction_session_timeout` 控制事务中空闲会话的超时时间(单位为毫秒),适用于防止空闲事务占用网络连接。 ```conf idle_in_transaction_session_timeout = 60000 ``` ### NUMA 绑核优化网络中断处理 为了优化网络中断与业务处理的隔离性,openGauss 提供了 NUMA 绑核机制。`numa_distribute_mode` 控制 CPU 核心的分配模式,确保线程固定到具体的核上,从而提升网络中断处理效率。 ```conf numa_distribute_mode = 'node' ``` `numa_node_list` 指定 NUMA 节点列表,进一步细化绑核策略,避免网络中断与业务线程争抢 CPU 资源。 ```conf numa_node_list = '0,1' ``` ### 配置方式 可以通过多种方式配置上述参数: - **修改配置文件**:直接编辑 `postgresql.conf` 文件,调整所需参数值。 - **使用 `gs_guc` 工具**:通过命令行工具动态修改参数,例如: ```bash gs_guc set -N all -I all -c "listen_addresses='*'" ``` - **SQL 命令动态设置**:部分参数支持在会话级别通过 SQL 命令进行动态调整,例如: ```sql SET LOCAL tcp_keepalives_idle = 60; ``` 通过以上配置策略,可以有效提升 openGauss 在高并发网络环境下的性能表现,并增强系统的稳定性与资源利用率。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值