返回首页

gbase数据、南大通用产品文档:GBase8srfmtdec() 函数

更新日期:2024年09月11日

rfmtdec() 函数使用格式化掩码来将 decimal 值转换为字符串。

语法
mint rfmtdec(dec_val, fmtstring, outbuf)
dec_t *dec_val;
char *fmtstring;

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 865 -

char *outbuf;
dec_val
指向要格式化的 decimal 值的指针。
fmtstring
指向包含要用于 dec_val 值的格式化掩码的字符缓冲区的指针。
outbuf
指向接收 dec_val 值的格式化的字符串的字符缓冲区的指针。

用法
rfmtdec() 函数的 fmtstring 参数指向数值格式化掩码,其包含描述如何
格式化 decimal 值的字符。

当您使用 rfmtdec() 来格式化 MONEY 值时,该函数使用 DBMONEY 环境变量指
定的货币符号。
如果您未设置此环境变量,
则 rfmtdec() 使用客户机语言环境定义的货币符
号。缺省的语言环境 US English 定义货币符号,就如同您将 DBMONEY 设置为 “$,.”
一样。

当您使用有多字节代码集的非缺省的语言环境时,
rfmtdec() 支持格式字符串中的多字
节字符。
返回代码
0
转换成功。
-1211
程序用尽内存(内存分配错误)。
-1217
格式字符串太大。

示例
demo 目录在文件 rfmtdec.ec 中包含此样例程序。
/*
* rfmtdec.ec *
The following program applies a series of format specifications to each of a series of
DECIMAL numbers and displays each result.
*/

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 866 -


#include

EXEC SQL include decimal;

char *strings[] =
{
"210203.204",
"4894",
"443.334899312",
"-12344455",
0
};

char *formats[] =
{
"**###########",
"$$$$$$$$$$.##",
"(&&,&&&,&&&.)",
"<,<<<,<<<,<<<",
"$*********.**",
0
};

char result[41];

main()
{
mint x;
mint s = 0, f;
dec_t num;

printf("RFMTDEC Sample ESQL Program running.\n\n");

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 867 -


while(strings[s])
{
/*
* Convert each string to DECIMAL
*/
printf("String = %s\n", strings[s]);
if (x = deccvasc(strings[s], strlen(strings[s]), #))
{
printf("Error %d in converting string [%s] to decimal\n",
x, strings[s]);
break;
}
f = 0;
while(formats[f])
{
/*
* Format DECIMAL num for each of formats[f]
*/
rfmtdec(#, formats[f], result);
/*
* Display result and bump to next format (f++)
*/
result[40] = '\0';
printf(" Format String = '%s'\t", formats[f++]);
printf("\tResult = '%s'\n", result);
}
++s; /* bump to next string */
printf("\n"); /* separate result groups */
}

printf("\nRFMTDEC Sample Program over.\n\n");
}

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 868 -


输出
RFMTDEC Sample ESQL Program running.

String = 210203.204
Format String = '**###########'
Result = '** 210203'
Format String = '$$$$$$$$$$.##'
Result = ' $210203.20'
Format String = '(&&,&&&,&&&.)'
Result = ' 000210,203. '
Format String = '<,<<<,<<<,<<<'
Result = '210,203'
Format String = ' $*********.**'
Result = '$***210203.20'

String = 4894
Format String = '**###########'
Result = ' ** 4894'
Format String = '$$$$$$$$$$.##'
Result = ' $4894.00'
Format String = '(&&,&&&,&&&.)'
Result = ' 000004,894. '
Format String = '<,<<<,<<<,<<<'
Result = '4,894'
Format String = ' $*********.**'
Result = '$*****4894.00'

String = 443.334899312
Format String = '**###########'
Result = ' ** 443'
Format String = '$$$$$$$$$$.##'
Result = ' $443.33'

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 869 -

Format String = '(&&,&&&,&&&.)'
Result = ' 0000000443. '
Format String = '<,<<<,<<<,<<<'
Result = ' 443'
Format String = ' $*********.**'
Result = '$******443.33'

String = -12344455
Format String = '**###########'
Result = ' ** 12344455'
Format String = '$$$$$$$$$$.##'
Result = ' $12344455.00'
Format String = '(&&,&&&,&&&.)'
Result = '(12,344,455.)'
Format String = '<,<<<,<<<,<<<'
Result = '12,344,455'
Format String = ' $*********.**'
Result = ' $*12344455.00'

RFMTDEC Sample Program over.

Ispell 词典模板支持词法词典,它可以把一个词的各种语言学形式规范化成相同的
词位。
比如,
一个Ispell 英语词典可以匹配搜索词bank 的词尾变化和词形变化,
如banking、
banked、banks、banks'和bank's 等。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
659
GBase 8c 不提供任何预定义的Ispell 类型词典或词典文件。
dict 文件和affix 文件支
持多种开源词典格式,包括Ispell、MySpell 和Hunspell 等。
操作步骤
步骤1 获取词典定义文件和词缀文件。
用户可以使用开源词典,直接获取的开源词典后缀名可能为.aff 和.dic,此时需要将
扩展名改为.affix 和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换
成UTF-8 编码,比如挪威语词典:
iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff
iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic
步骤2 创建Ispell 词典。
gbase=#CREATE TEXT SEARCH DICTIONARY norwegian_ispell (
TEMPLATE = ispell,
DictFile = nn_no,
AffFile = nn_no,
FilePath = 'file:///home/dicts'
);
其中,词典文件全名为nn_no.dict 和nn_no.affix,所在目录为当前连接数据库主节
点的/home/dicts/下。
关于创建词典的语法和更多参数,
请参见CREATE TEXT SEARCH
DICTIONARY。
步骤3 使用Ispell 词典进行复合词拆分。
gbase=#SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk');
ts_lexize
---------------------
{sjokolade,fabrikk}
(1 row)
MySpell 不支持复合词,
Hunspell 对复合词有较好的支持。
GBase 8c 仅支持Hunspell
中基本的复合词操作。通常情况下,Ispell 词典能够识别的词是一个有限集合,其后应
该配置一个更广义的词典,例如一个可以识别所有词的Snowball 词典。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
660

使用示例
X-Tuner 支持三种模式,
分别是获取参数诊断报告的recommend 模式、
训练强化学习模
型的train 模式、以及使用算法进行调优的tune 模式。上述三种模式可以通过命令行参数来
区别,通过配置文件来指定具体的细节。
配置数据库连接信息
三种模式连接数据库的配置项是相同的,
有两种方式:
一种是直接通过命令行输入详细
的连接信息,
另一种是通过JSON 格式的配置文件输入,
下面分别对两种指定数据库连接信
息的方法进行说明。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
376
(1)
通过命令行指定:
分别传递--db-name --db-user --port --host --host-user 参数,可选--host-ssh- port 参数,
例如:
gs_dbmind component xtuner recommend --db-name postgres --db-user gbase --port 5678
--host 192.168.1.100 --host-user gbase
(2)
通过JSON 格式的连接信息配置文件指定:
JSON 配置文件的示例如下,并假设文件名为connection.json:
{
"db_name": "postgres", # 数据库名
"db_user": "dba",
# 登录到数据库上的用户名"host": "127.0.0.1", # 数据库宿主
机的IP 地址"host_user": "dba",
# 登录到数据库宿主机的用户名"port": 5432,
#
数据库的侦听端口号"ssh_port": 22
# 数据库宿主机的SSH 侦听端口号
}
则可通过-f connection.json 传递。
为了防止密码泄露,
配置文件和命令行参数中默认都不包含密码信息,
用户在输入上述
连接信息后,
程序会采用交互式的方式要求用户输数据库密码以及操作系统登录用户的
密码。
recommend 模式使用示例
对recommend 模式生效的配置项为scenario,
若为auto,
则自动检测workload 类型。

行下述命令,获取诊断结果:
gs_dbmind component xtuner recommend -f connection.json
则可以生成诊断报告如下:

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
377
图11- 3 recommend 模式生成的报告示意图
在上述报告中,推荐了该环境上的数据库参数配置,并进行了风险提示。
报告同时生成
了当前workload 的特征信息,其中有几个特征是比较有参考意义的:

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
378

temp_file_size:产生的临时文件数量,如果该结果大于0,则表明系统使用了临
时文
件。
使用过多的临时文件会导致性能不佳,
如果可能的话,
需要提高work_mem 参数的
配置。

cache_hit_rate:shared_buffer 的缓存命中率,表明当前workload 使用缓存的效率。

read_write_ratio:数据库作业的读写比例。

search_modify_ratio:数据库作业的查询与修改数据的比例。

ap_index:表明当前workload 的AP 指数,取值范围是0 到10,该数值越大,表明越偏
向于数据分析与检索。

workload_type:根据数据库统计信息,推测当前负载类型,分为AP、TP 以及HTAP
三种类型。

checkpoint_avg_sync_time:数据库在checkpoint 时,平均每次同步刷新数据到
磁盘的
时长,单位是毫秒。

load_average:平均每个CPU 核心在1 分钟、5 分钟以及15 分钟内的负载。一般地,
该数值在1 左右表明当前硬件比较匹配workload、
在3 左右表明运行当前作业压力比较
大,大于5 则表示当前硬件环境运行该workload 压力过大(此时一般建议减少负载或
升级硬件)。

recommend 模式会读取数据库中的pg_stat_database 以及pg_stat_bgwriter 等系统表
中的信息,需要登录到数据库上的用户具有足够的权限(建议为管理员权限,
可通
过alter user username sysadmin;授予username 相应的权限)。

由于某些系统表会一直记录统计信息,
这可能会对负载特征识别造成干扰,
因此建
议最好先清空某些系统表的统计信息,运行一段时间的workload 后再使用
recommend 模式进行诊断,以便获得更准确的结果。清除统计信息的方法为:
select pg_stat_reset_shared('bgwriter');
select pg_stat_reset();
train 模式使用示例
该模式是用来训练深度强化学习模型的,与该模式有关的配置项为:

rl_algorithm:用于训练强化学习模型的算法,当前支持设置为ddpg.

rl_model_path:训练后生成的强化学习模型保存路径。

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
379

rl_steps:训练过程的最大迭代步数。

max_episode_steps:每个回合的最大步数。

scenario:明确指定的workload 类型,如果为auto 则为自动判断。在不同模式下,推荐
的调优参数列表也不一样。

tuning_list:用户指定需要调哪些参数,如果不指定,则根据workload 类型自动推荐应
该调的参数列表。如需指定,则tuning_list 表示调优列表文件的路径。一个调优列表配
置文件的文件内容示例如下:
{
"work_mem": { "default": 65536,
"min": 65536,
"max": 655360,
"type": "int", "restart": false
},
"shared_buffers": { "default": 32000,
"min": 16000,
"max": 64000,
"type": "int", "restart": true
},
"random_page_cost": { "default": 4.0,
"min": 1.0,
"max": 4.0,
"type": "float", "restart": false
},
"enable_nestloop": { "default": true, "type": "bool", "restart": false
}
}
待上述配置项配置完成后,可以通过下述命令启动训练:
gs_dbmind component xtuner train -f connection.json
训练完成后,会在配置项rl_model_path 指定的目录中生成模型文件。
tune 模式使用示例
tune 模式支持多种算法,
包括基于强化学习(Reinforcement Learning, RL)
的DDPG 算
法、基于全局搜索算法(Global OPtimization algorithm, GOP)算法的贝叶斯优化算法
(Bayesian Optimization)以及粒子群算法(Particle Swarm Optimization, PSO)。
与tune 模式相关的配置项为:

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
380

tune_strategy:指定选择哪种算法进行调优,支持rl(使用强化学习模型进行调优)、
gop(使用全局搜索算法)以及auto(自动选择)。若该参数设置为rl,则rl 相关的配
置项生效。
除前文提到过的train 模式下生效的配置项外,
test_episode
配置项也生效,
该配置项表明调优过程的最大回合数,
该参数直接影响了调优过程的执行时间
(一般地,
数值越大越耗时)。

gop_algorithm:选择何种全局搜索算法,支持bayes 以及pso。

max_iterations:最大迭代轮次,数值越高搜索时间越长,效果往往越好。

particle_nums:在PSO 算法上生效,表示粒子数。

scenario 与tuning_list 见上文train 模式中的描述。
待上述配置项配置完成后,可以通过下述命令启动调优:
gs_dbmind component xtuner tune -f connection.json
在使用tune 和train 模式前,用户需要先导入benchmark 所需数据并检查benchmark 能
否正常跑通。调优过程结束后,调优程序会自动恢复调优前的数据库参数配置。