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字段,根据要求填入每个字段的取值范围
dolanguageplpgsql$$declaresqltext:='createtabletest1(idint,';beginforiin1..64loopsql:=sql||'c'||i||'intdefaultrandom()*160000,';--单个字段取值空间endloop;sql:=rtrim(sql,',');sql:=sql||')';executesql;end;$$;
根据前面提供的需求,写入1000万记录
insertintotest1selectgenerate_series(1,10000000);
根据要求生成查询SQL,16个字段组合OR
dolanguageplpgsql$$declaresqltext:='selectcount(*)fromtest1where';beginforiin1..16loopsql:=sql||'c'||i||'='||(random()*160000)::int||'or';--16个字段or查询endloop;sql:=rtrim(sql,'or');raisenotice'%',sql;end;$$;
生成SQL
selectcount(*)fromtest1wherec1=143477orc2=153395orc3=102052orc4=151143orc5=129060orc6=87519orc7=148787orc8=123117orc9=126622orc10=118215orc11=134245orc12=53791orc13=151020orc14=53076orc15=143204orc16=51640;
SQL实际返回数
count-------905(1row)
与算法预期基本一致(1000)。
2、16个字段等值AND,命中20条记录单个字段的取值空间 =16_/(10000000/20) = 2.27
1、根据算法,得到取值空间,创建测试表
dolanguageplpgsql$$declaresqltext:='createtabletest2(idint,';beginforiin1..64loopsql:=sql||'c'||i||'intdefaultrandom()*1,';--单个字段取值空间endloop;sql:=rtrim(sql,',');sql:=sql||')';executesql;end;$$;
写入1000万数据
insertintotest2selectgenerate_series(1,10000000);
生成测试SQL,16个字段,OR查询
dolanguageplpgsql$$declaresqltext:='selectcount(*)fromtest2where';beginforiin1..16loopsql:=sql||'c'||i||'='||(random()*1)::int||'and';--16个字段and查询endloop;sql:=rtrim(sql,'and');raisenotice'%',sql;end;$$;
生成SQL
selectcount(*)fromtest2wherec1=1andc2=0andc3=0andc4=1andc5=1andc6=1andc7=0andc8=1andc9=0andc10=0andc11=0andc12=0andc13=0andc14=0andc15=1andc16=0;
SQL实际返回数
count-------154(1row)
与算法预期基本一致(取值范围作了取舍2.27,降到了2)。
感谢各位的阅读,以上就是“PostgreSQL任意字段数组合AND\OR条件分析”的内容了,经过本文的学习后,相信大家对PostgreSQL任意字段数组合AND\OR条件分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。