博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PostgreSQL 设计优化case - 多对多 转 一对多(数组)
阅读量:6238 次
发布时间:2019-06-22

本文共 838 字,大约阅读时间需要 2 分钟。

标签

PostgreSQL , 数组 , 多对多 , 一对多 , udf , JOIN


背景

某个系统存储了会员的标签,以及标签的描述信息。业务上需要通过会员ID得到会员的标签,再得到描述信息。

每个会员有若干标签,原来是这么存储的

1、会员标签表,人数5亿左右,每个人平均有几百个标签,1500亿行左右。

create table a(uid int8, tag int);

2、标签描述表。

几百上千条

create table b(tag int primary key, info text);

查询如下

SQL

select a.*,b.* from a join b using(tag) where a.uid=?;

问题

1、会员标签表,存在大量冗余数据,人数5亿,放大到了1500亿记录。

2、查询单个会员时,由于数据冗余的问题,涉及大量离散扫描。

背景知识参考

设计优化

使用数组类型,将多条合并为一条

create table a (uid int8 primary key, tag int[]);      create table b (tag int primary key, info text);

使用UDF获取标签描述

create or replace function get_desc(int[]) returns text[] as $$    select array_agg(info) from b where tag = any ($1);  -- 可以走索引  $$ language sql strict ;

查询如下

SQL

select uid,get_desc(tag) from a where uid=?;

优势

1、数据下降到5亿条,消除了多个UID的离散扫描。同时节约了空间。

2、消除JOIN,性能好。预计能到几十万QPS。

小结

利用好PG的特性,可以给业务上带来非常大的惊喜,比如成本压缩,性能提升。

转载地址:http://gykia.baihongyu.com/

你可能感兴趣的文章
Linq:int类型使用Contains方法
查看>>
欧拉角与万向节死锁
查看>>
SQL Server的三种分页方式
查看>>
OAuth2.0和企业内部统一登录,token验证方式,OAuth2.0的 Authorization code grant 和 Implicit grant区别...
查看>>
Python学习手册之Python介绍、基本语法(一)
查看>>
团队Alpha版本冲刺(四)
查看>>
【350】机器学习中的线性代数之矩阵求导
查看>>
第一次遇到刷新缓冲区延时
查看>>
摄像头的管理(camera) ---- HTML5+
查看>>
HDU 5294 Tricks Device(多校2015 最大流+最短路啊)
查看>>
bmh算法
查看>>
Maven仓库的布局
查看>>
PHP定界符<<<的使用方法
查看>>
LeetCode--176--第二高的薪水
查看>>
如何解决开机出现Missing operating system的故障
查看>>
【C#学习笔记】函数重载
查看>>
解除映射错误
查看>>
TOJ 假题之 Cow Brainiacs
查看>>
命令模式(Command Pattern)
查看>>
升级到Ubuntu 11.10遇到的问题
查看>>