文档章节

PostgreSQL随机字符串函数C语言实现

有理想的猪
 有理想的猪
发布于 2017/09/05 16:19
字数 416
阅读 77
收藏 1

开发过程中进行很多测试,经常需要生成字符串,尝试之后选择了自己实现。

1、办法一
rpad('string ', 20000, 'x')
插入几万条之后会发现 toast 表没啥变化,因为这样子的字符串一压缩就剩不下什么了。
更多相关事宜请翻阅 TOAST 介绍

2、办法二,一个PL/pgSQL函数
来源:How do you create a random string that's suitable for a session ID in PostgreSQL?

flying=# insert into p
select pg_backend_pid(),s,'string '||random_string(20000) from (select generate_series(2000,8000,1) s) as g;
INSERT 0 6001
Time: 245627.624 ms (04:05.628)

这效率能不能接受呢

3、方法三,上边连接中提到的 string_agg
看起来似乎没有问题

批量执行

flying=# select s,(SELECT string_agg
(substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ceil (random() * 62)::integer, 1), '') FROM generate_series(1, 20))
flying-# from (select generate_series(2,8,1) s) as g;
 s |      string_agg
---+----------------------
 2 | WZoIDcEkOntinX4dC6uz
 3 | WZoIDcEkOntinX4dC6uz
 4 | WZoIDcEkOntinX4dC6uz
 5 | WZoIDcEkOntinX4dC6uz
 6 | WZoIDcEkOntinX4dC6uz
 7 | WZoIDcEkOntinX4dC6uz
 8 | WZoIDcEkOntinX4dC6uz
(7 rows)

Time: 1.069 ms

发生了什么?不过有些场景也可以接受

4、方法四,C语言实现

执行

flying=# insert into p
select pg_backend_pid(),s,'string '||random_string(20000) from (select generate_series(2000,8000,1) s) as g;
INSERT 0 6001
Time: 6774.829 ms (00:06.775)

这是一个可接受的时间

代码(未经严格测试,仅供参考)

PG_FUNCTION_INFO_V1(random_string);
Datum
random_string(PG_FUNCTION_ARGS)
{
	int32 length = PG_GETARG_INT32(0);
	int32 i;
	const char chars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
	char *result;

	if (length < 0)
		PG_RETURN_NULL();

	if (length == 0)
		PG_RETURN_TEXT_P(cstring_to_text(""));

	result = palloc(length + 1);
	if (result == NULL)
		ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY),
					errmsg("out of memory")));

	for (i=0; i<length; i++)
	{
		result[i] = chars[random()%(sizeof(chars)-1)];
	}
	result[i] = '\0';

	PG_RETURN_TEXT_P(cstring_to_text(result));
}

 

欢迎关注我司公众号:postgresdata-news 

--------------------------------------------
神州飞象(北京)数据科技有限公司
我们的力量源自最先进的开源数据库PostgreSQL
zongliang.quan@postgresdata.com

© 著作权归作者所有

共有 人打赏支持
有理想的猪
粉丝 136
博文 91
码字总数 32273
作品 0
红挢
高级程序员
私信 提问
科普一种可以将PG变成通用SQL引擎的技术

作者介绍 伊翼,网名“小wing”,野生PG爱好者,从事数据库相关工作已近十年,目前供职于全球最大的通讯设备供应商。 原标题:《当FDW遇上GO》 FDW(Foreign Data Wrapper)是PostgreSQL(下...

伊翼
2018/06/14
0
0
PostgreSQL 11 preview - pgbench 压测软件增强

标签 PostgreSQL , pgbench , 增强 , 11 背景 PostgreSQL 11 pgbench压测软件增强。 详细用法参考, pgbench非常强大,且性能非常好。 https://www.postgresql.org/docs/devel/static/pgbench...

德哥
2018/07/28
0
0
PostgreSQL数据类型-二进制数据和字符串数据类型与字符串函数

PostgreSQL支持3种字符串类型,分别是character varying(n)、character(n)和text,character varying(n)可以写成varchar(n),character(n)可以写成char(n),最大长度1GB,text最大长度无限制...

白豆腐徐长卿
2017/11/08
0
0
PostgreSQL Oracle 兼容性之 - 字符串分割

标签 PostgreSQL , Oracle , 字符串分割 背景 Oracle中字符串分割,比较麻烦,可能需要写PL/SQL来实现。 效果如下 PostgreSQL 字符串分割 PostgreSQL 的字符串处理功能非常强大,已经内置了蛮...

德哥
2018/05/06
0
0
数据库案例集锦 - 开发者的《如来神掌》

标签 PostgreSQL , PG DBA cookbook , PG Oracle兼容性 , PG 架构师 cookbook , PG 开发者 cookbook , PG 应用案例 背景 「剑魔独孤求败,纵横江湖三十馀载,杀尽仇寇,败尽英雄,天下更无抗...

德哥
2017/06/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php-fpm配置文件详解

php-fpm配置文件详解 php-fpm配置文件路径: /usr/local/php-fpm/etc/php-fpm.conf ,还包含了一个配置文件路径下的所有以.conf结尾的配置文件(子配置文件)/usr/local/php-fpm/etc/php-fp...

李超小牛子
24分钟前
1
0
排序-堆排序

在说明堆排序的过程前得先了解什么是堆: 先看下图(来源于java数据结构和算法(第二版)): 堆是个完全二叉树,并且父节点总是大于(小于)它的孩子,因此根节点永远是最大或者最小的元素。...

FAT_mt
53分钟前
1
0
matlab-自控原理 秩判据 能观性 已知线性定常系统的A和C矩阵

  matlab : R2018a 64bit     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   code clearclc% x'=A*x......

志成就
今天
1
0
不改一行代码定位线上性能问题

背景 最近时运不佳,几乎天天被线上问题骚扰。前几天刚解决了一个 HashSet 的并发问题,周六又来了一个性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫...

编程SHA
今天
5
0
Go 示例测试实现原理剖析

简介 示例测试相对于单元测试和性能测试来说,其实现机制比较简单。它没有复杂的数据结构,也不需要额外的流程控制,其核心工作原理在于收集测试过程中的打印日志,然后与期望字符串做比较,...

恋恋美食
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部