千家信息网

PostgreSQL任意字段数组合AND\OR条件分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"PostgreSQL任意字段数组合AND\OR条件分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"PostgreSQL任意字段数
千家信息网最后更新 2026年11月02日PostgreSQL任意字段数组合AND\OR条件分析

这篇文章主要讲解了"PostgreSQL任意字段数组合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增加了多列统计信息)

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)。

感谢各位的阅读,以上就是"PostgreSQL任意字段数组合AND\OR条件分析"的内容了,经过本文的学习后,相信大家对PostgreSQL任意字段数组合AND\OR条件分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

字段 单个 空间 条件 组合 分析 算法 查询 测试 生成 实际 数据 需求 学习 一致 个数 内容 范围 业务 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 广州百单互联网科技有限公司 国智互联网科技 互联网扶贫科技 重庆互联网络科技 紫鲸互联网科技 狮子座互联网科技培训 互联网高科技股票 青海省互联网新科技 开启互联网科技时代小说 互联网科技公司需要的职位 阿里互联网科技公司 科技与互联网哪个更好 江阴互联网智能科技产品进口 互联网5g黑科技有哪些 速维有品互联网信息科技(苏州)有限公司 浙南科技城互联网大厦建设工程 滨湖区互联网智能科技产品有哪些 互联网科技年终奖 广西泛欧互联网科技有限公司 广东猪兼强互联网科技有限公司 互联网科技产业 科技平台互联网 互联网金融科技平台 西安互联网科技公司 山东吉时兔互联网科技有限公司 允成互联网科技有限公司融资 烟台灵鸽互联网科技有限公司 上海创道互联网络科技有限公司 安徽九吞吴互联网科技有限公司
0