PostgreSQL 任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据算法举例

简介: 标签 PostgreSQL , 构造测试数据 , 任意字段组合AND,OR查询 , 指定结果集大小 背景 在进行一些实际的POC测试时,需要根据业务提出的需求构造数据,比如按照任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据。
+关注继续查看

标签

PostgreSQL , 构造测试数据 , 任意字段组合AND,OR查询 , 指定结果集大小


背景

在进行一些实际的POC测试时,需要根据业务提出的需求构造数据,比如按照任意字段数组合 AND\OR 条件,指定返回结果条数,构造测试数据。

需求

表记录数A

表字段数B

1、N个字段等值OR,命中M条记录

(两个条件无法同时满足)

2、X个字段等值AND,命中Y条记录

字段取值空间如何计算?

构造算法

1、N个字段等值OR,命中M条记录

单个字段单个VALUE的记录数 = M/N

单个字段取值个数 = A/(M/N)

2、X个字段等值AND,命中Y条记录

(仅适用于完全离散分布,优化器里最难估算的也是多个字段AND的选择性,所以PG 10增加了多列统计信息)

《PostgreSQL 10 黑科技 - 自定义统计信息》

X个字段的总取值空间 = A/Y

单个字段的取值空间 = X_/(A/Y) (开X根)

例子

1、表记录数1000万

2、表字段数64

字段取值空间如何计算?

1、16个字段等值OR,命中1000条记录

单个字段取值个数 = 10000000/(1000/16.0) = 160000

1、建表,64字段,根据要求填入每个字段的取值范围

do language plpgsql $$  
declare  
  sql text := 'create table test1 (id int, ';  
begin  
  for i in 1..64 loop  
    sql := sql||' c'||i||' int default random()*160000,';  -- 单个字段取值空间  
  end loop;  
  sql := rtrim(sql,',');  
  sql := sql||')';  
  execute sql;  
end;  
$$;  

根据前面提供的需求,写入1000万记录

insert into test1 select generate_series(1,10000000);  

根据要求生成查询SQL,16个字段组合OR

do language plpgsql $$  
declare  
  sql text := 'select count(*) from test1 where ';  
begin  
  for i in 1..16 loop  
    sql := sql||' c'||i||' ='||(random()*160000)::int||' or';   -- 16个字段 or 查询   
  end loop;  
  sql := rtrim(sql,'or');  
  raise notice '%', sql;  
end;  
$$;  

生成SQL

select count(*) from test1 where    
c1 =143477 or c2 =153395 or c3 =102052 or c4 =151143 or c5 =129060 or   
c6 =87519 or c7 =148787 or c8 =123117 or c9 =126622 or c10 =118215 or   
c11 =134245 or c12 =53791 or c13 =151020 or c14 =53076 or c15 =143204 or c16 =51640 ;  

SQL实际返回数

 count   
-------  
   905  
(1 row)  

与算法预期基本一致(1000)。

2、16个字段等值AND,命中20条记录

单个字段的取值空间 = 16_/(10000000/20) = 2.27

1、根据算法,得到取值空间,创建测试表

do language plpgsql $$  
declare  
  sql text := 'create table test2 (id int, ';  
begin  
  for i in 1..64 loop  
    sql := sql||' c'||i||' int default random()*1,';  -- 单个字段取值空间  
  end loop;  
  sql := rtrim(sql,',');  
  sql := sql||')';  
  execute sql;  
end;  
$$;  

写入1000万数据

insert into test2 select generate_series(1,10000000);  

生成测试SQL,16个字段,OR查询

do language plpgsql $$  
declare  
  sql text := 'select count(*) from test2 where ';  
begin  
  for i in 1..16 loop  
    sql := sql||' c'||i||' ='||(random()*1)::int||' and';  -- 16个字段 and 查询   
  end loop;  
  sql := rtrim(sql,'and');  
  raise notice '%', sql;  
end;  
$$;  

生成SQL

select count(*) from test2 where  c1 =1 and c2 =0 and c3 =0 and c4 =1 and   
c5 =1 and c6 =1 and c7 =0 and c8 =1 and c9 =0 and c10 =0 and c11 =0 and   
c12 =0 and c13 =0 and c14 =0 and c15 =1 and c16 =0;  

SQL实际返回数

 count   
-------  
   154  
(1 row)  

与算法预期基本一致(取值范围作了取舍2.27,降到了2)。

扩展问题

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
4月前
|
关系型数据库 PostgreSQL
|
SQL 分布式计算 druid
2021 年数据库报告:PostgreSQL 成开发者首选 | Benchmark 测试陷“混战”
2021 年数据库报告:PostgreSQL 成开发者首选 | Benchmark 测试陷“混战”
170 0
2021 年数据库报告:PostgreSQL 成开发者首选 | Benchmark 测试陷“混战”
|
关系型数据库 分布式数据库 数据库
测试创建 PolarDB for PostgreSQL 数据库和连接数据库
测试创建 PolarDB for PostgreSQL 数据库和连接数据库
测试创建 PolarDB for PostgreSQL 数据库和连接数据库
|
存储 SQL Kubernetes
在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)
在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)
251 0
|
关系型数据库 OLAP PostgreSQL
AnalyticDB PostgreSQL 实例管理 测试3习题及答案
AnalyticDB PostgreSQL 实例管理 测试3习题及答案
132 0
|
SQL 存储 弹性计算
如何使用AnalyticDB for PostgreSQL 6.0 进行TPC-DS 1TB数据的测试
TPC-DS是事务处理性能委员会( Transaction ProcessingPerformance Council )制定的基准程序之一。TPC-DS测试涉及24张表,工作负载包含99个SQL,主要目的是评价特定查询的决策支持能力。
3886 0
如何使用AnalyticDB for PostgreSQL 6.0 进行TPC-DS 1TB数据的测试
|
SQL 弹性计算 关系型数据库
PostgreSQL rc,rr,ssi 隔离级别与性能对比 - 高隔离级别损耗性测试
标签 PostgreSQL , rc , rr , ssi , 隔离级别 , 性能 , 乐观锁 背景 https://www.postgresql.org/docs/11/mvcc.html PG支持到了最高级别的隔离级别SSI(serializable snapshot isolate)。 几种隔离级别的目标如下 1、读未提交,可以看到未提交的数据,脏读。 2、读已提交,只能看
1554 0
|
SQL 弹性计算 固态存储
如何使用AnalyticDB for PostgreSQL 6.0 进行TPC-H 1TB数据的测试
TPC-H 主要目的是评价特定查询的决策支持能力,该基准模拟了决策支持系统中的数据库操作,测试数据库系统复杂查询的响应时间。本文详细介绍了在阿里云AnalyticDB for PostgreSQL 6.0版,测试TPC-H benchmark 1TB数据的流程和测试结果
5726 0
如何使用AnalyticDB for PostgreSQL 6.0 进行TPC-H 1TB数据的测试
|
弹性计算 关系型数据库 测试技术
PostgreSQL 11 1Kw TPCC , 1亿 TPCB 7*24 强压耐久测试
标签 PostgreSQL , tpcc , tpcb 背景 TPCC, TPCB是工业标准的OLTP类型业务的数据库测试,包含大量的读、写、更新、删除操作。 7*24小时强压耐久测试,主要看数据库在长时间最大压力下的 性能、稳定性、可靠性。
1897 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会导致性能下降。
1729 0
相关产品
云数据库 Redis 版
云数据库 MongoDB 版
云数据库 RDS
推荐文章
更多