PostgreSQL pgbench : 冒号处理

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , pgbench , 变量 , 常量带冒号

--

背景

pgbench 的自定义测试脚本中,冒号有特殊的含义,可以用于变量名的前面,表示这个位置使用变?刻婊弧?

        /*----------  
         * Join arguments with whitespace separators. Arguments starting with  
         * exactly one colon are treated as variables:  
         *      name - append a string "name"  
         *      :var - append a variable named 'var'  
         *      ::name - append a string ":name"  
         *----------  
         */  
        for (i = 0; i < argc; i++)  
        {  
                char       *arg;  
                int                     arglen;  
  
                if (argv[i][0] != ':')  
                {  
                        arg = argv[i];          /* a string literal */  
                }  
                else if (argv[i][1] == ':')  
                {  
                        arg = argv[i] + 1;      /* a string literal starting 
with colons */  
                }  
                else if ((arg = getVariable(st, argv[i] + 1)) == NULL)  
                {  
                        fprintf(stderr, "%s: undefined variable \"%s\"\n",  
                                        argv[0], argv[i]);  
                        return false;  
                }  
  
                arglen = strlen(arg);  
                if (len + arglen + (i > 0 ? 1 : 0) >= SHELL_COMMAND_SIZE - 1)  
                {  
                        fprintf(stderr, "%s: shell command is too long\n", 
argv[0]);  
                        return false;  
                }  
  
                if (i > 0)  
                        command[len++] = ' ';  
                memcpy(command + len, arg, arglen);  
                len += arglen;  
        }  

例如,

1、以下ab为变量名,:ab表示这个地方用变量替换。

vi test.sql  
  
\set ab random(1,100000)  
select * from tbl where id=:ab;  

2、如果要输入一个冒号开头的常量,可以输入两个冒号。

::name表示:name常量。  

3、如果在字符中间输入,两个冒号,直接输入两个冒号即可。

4、

如果要在字符串中间使用冒号,怎么写呢?

vi test.sql  
  
select * from tbl where ts > '2017-01-01 10:10:10';  

这样不行,会将:10和:10都翻译成变量10的值。

这样也不行,字符串中两个冒号就是两个冒号,不会变成一个。

vi test.sql  
  
select * from tbl where ts > '2017-01-01 10::10::10';  

冒号作为字符串中的内容

1、使用-D参数,适合所有无法正常解析customer script的场景。

使用pgbench -D参数,输入的变量,不需要过customer script的parser ,所以可以避免问题。

vi test.sql  
  
select now() > :a::timestamp;  
  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 56 -j 56 -T 120 -D a="1999-1-
1 10:1:1"  

达到的效果是

select now() > '1999-1-1 10:1:1'::timestamp;  

2、使用格式化函数,适合某些场景。

前面那条SQL可以改成

vi test.sql  
  
select now() > to_timestamp('2017-01-01 10::10::10','yyyy-mm-dd hh24::mi::ss')
;  
  
pgbench -M prepared -n -r -P 1 -f ./test.sql -c 56 -j 56 -T 120  

参考

https://www.postgresql.org/docs/10/static/pgbench.html

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
关系型数据库 测试技术 数据库
PostgreSQL数据库压力测试工具pgbench简单应用
PG数据库提供了一款轻量级的压力测试工具叫pgbench,其实就是一个编译好后的扩展性的可执行文件。
2703 0
|
5月前
|
SQL 关系型数据库 测试技术
postgresql|数据库|数据库测试工具pgbench之使用
postgresql|数据库|数据库测试工具pgbench之使用
95 0
|
SQL 关系型数据库 测试技术
PostgreSQL pgbench tpcb 海量数据库测试 - 分区表测试优化
标签 PostgreSQL , pgbench , tpcb 背景 pgbench是PG的一款测试工具,内置的测试CASE为tpcb测试。同时支持用户自己写测试CASE。 大量自定义CASE参考 https://github.com/digoal/blog/blob/master/201711/readme.md 当我们使用tpcb测试CASE时,如果生成的数据量过于庞大,例如我最近在生成1万亿的CASE,可以考虑使用分区表,但是目前PG内置分区表的性能在分区非常多时,使用PREPARED STATEMENT会导致性能下降。
1853 0
|
SQL 关系型数据库 测试技术
PostgreSQL pgbench tpcb 数据生成与SQL部分源码解读
标签 PostgreSQL , pgbench , tpcb 背景 pgbench是PG的一款测试工具,内置的测试CASE为tpcb测试。同时支持用户自己写测试CASE。 大量自定义CASE参考 https://github.com/digoal/blog/blob/master/201711/readme.md 本文为pgbench 内置tpcb的解读。
1623 0
|
物联网 关系型数据库 数据库
|
关系型数据库 测试技术 PostgreSQL

相关产品

  • 云原生数据库 PolarDB