2023-08-01 21:07:11 来源:博客园
前言
设计一张指标表,用于存储大屏上面要展示的各种指标项。指标数据由其他多个第三方通过API调用存入。
① 指标项很多,而且数据需要是增量的,比如:统计类的数值、近n年,月,日的折线图、柱状图和饼图等
② 每项指标又有行政区划的划分,比如:省,市,区县,街道等
(相关资料图)
所以,这张表的数据量可能会很大,因此考虑PostgreSQL的表划分
环境
软件环境 | 版本 |
---|---|
数据库环境 | PostgreSQL 9.6 |
表划分的三种形式
范围划分表被根据一个关键列或一组列划分为"范围",不同的分区的范围之间没有重叠。例如,我们可以根据日期范围划分,或者根据特定业务对象的标识符划分。
列表划分通过显式地列出每一个分区中出现的键值来划分表。
哈希划分(11版本才支持)
这里只说范围划分
的方式
实现划分
要建立一个划分的表,可以这样做:
创建"主"表,所有的分区都将继承它。这个表将不会包含任何数据。不要在这个表上定义任何检查约束,除非准备将它们应用到所有分区。同样也不需要定义任何索引或者唯一约束。
创建一些继承于主表的"子"表。通常,这些表不会在从主表继承的列集中增加任何列。我们将这些子表认为是分区,尽管它们在各方面来看普通的PostgreSQL表(或者可能是外部表)。
为分区表增加表约束以定义每个分区中允许的键值。如:
-- 表名sub_table_y2023m08, 代表这张分区表用于存2023年08月份的数据CREATE TABLE sub_table_y2023m08 ( CHECK ( logdate >= "2023-08-01" AND logdate < "2023-09-01" ) -- logdate为表中的某个日期字段)
创建主表
-- 指标表(主表)create table indicator( push_time timestamp(6), pusher varchar(255), category_path_code varchar(255), biz_date_time timestamp(6), org_index_code_path varchar(255), dimension_code varchar(255) default "def", indicator_code varchar(255), indicator_value varchar(255), indicator_value2 varchar(255), create_time timestamp(6));-- 复合主键alter table indicator add primary key (indicator_code, biz_date_time, org_index_code_path, dimension_code);-- 字段注释comment on column indicator.push_time is "数据推送时间";comment on column indicator.pusher is "推送方";comment on column indicator.category_path_code is "菜单路径编码";comment on column indicator.biz_date_time is "业务数据日期时间";comment on column indicator.org_index_code_path is "组织编码路径(用@隔开,格式: 1.@省编码@; 2.@省编码@市编码@; 3.@省编码@市编码@区县编码@; 4.@省编码@市编码@区县编码@街道编码@)";comment on column indicator.dimension_code is "维度编码,默认def";comment on column indicator.indicator_code is "指标编码";comment on column indicator.indicator_value is "指标值";comment on column indicator.indicator_value2 is "指标值2";comment on column indicator.create_time is "创建时间";
触发器自动创建分表
我们希望在向指标表中插入数据时,数据能被重定向到合适的分区表。我们可以通过为主表附加一个合适的触发器函数来实现这一点。
比如:根据
biz_date_time
字段,每个月创建一张分区表。
创建触发器函数
-- 创建触发器函数(新增数据时,插入到指定分表中,若分表不存在则创建)CREATE OR REPLACE FUNCTION auto_insert_sub_indicator_table() RETURNS trigger AS$BODY$DECLARE time_column_name text ;-- 父表中用于分区的时间字段的名称(推送时间) curMM varchar(6);-- "YYYYMM"字串,用做分区子表的后缀 isExist boolean;-- 分区子表,是否已存在 startTime text; endTime text; strSQL text; dimensionCodeDefValue varchar(3); -- (读者可忽略) -- 如果表名使用很多,也可以声明一个变量表示字表名称BEGIN -- 调用前,必须首先初始化(时间字段名):time_column_name [直接从调用参数中获取!!] -- 没有显示的声明参数,使用TG_ARGV[0]获取参数 time_column_name := TG_ARGV[0]; -- 判断对应分区表 是否已经存在?EXECUTE "SELECT $1."||time_column_name INTO strSQL USING NEW;curMM := to_char( strSQL::timestamp , "YYYYMM" );select count(*) INTO isExist from pg_class where relname = (TG_RELNAME||"_"||curMM);-- 若不存在, 则插入前需先创建子分区IF ( isExist = false ) THEN -- 创建子分区表,写明约束。TG_RELNAME为主表的名字,分表将继承主表的所有字段,但不会继承主键和索引等,需要手动创建。 startTime := curMM||"01 00:00:00.000"; endTime := to_char( startTime::timestamp + interval "1 month", "YYYY-MM-DD HH24:MI:SS.MS"); strSQL := "CREATE TABLE IF NOT EXISTS "||TG_RELNAME||"_"||curMM|| " ( CHECK("||time_column_name||">="""|| startTime ||""" AND " ||time_column_name||"< """|| endTime ||""" ) ) INHERITS ("||TG_RELNAME||") ;";EXECUTE strSQL; -- 创建主键,id主键只能保证单个表的唯一,多个子表可能会存在相同的主键。这里为子表创建复合主键 strSQL := "ALTER TABLE "||TG_RELNAME||"_"||curMM||" ADD PRIMARY KEY(indicator_code, biz_date_time, org_index_code_path, dimension_code) "; EXECUTE strSQL; -- 修改dimension_code字段的默认值(读者可忽略) strSQL := "ALTER TABLE "||TG_RELNAME||"_"||curMM||" ALTER COLUMN dimension_code set DEFAULT " || quote_literal("def") || " "; EXECUTE strSQL; -- 创建索引(使用分表的字段),可选。 TODO: 现在先只为业务数据日期时间添加索引,后面有需要再加 strSQL := "CREATE INDEX "||TG_RELNAME||"_"||curMM||"_INDEX_"||time_column_name||" ON " ||TG_RELNAME||"_"||curMM||" ("||time_column_name||");"; EXECUTE strSQL; -- 还可自定义其他语句,注意对应表名 END IF; -- 插入数据到子分区(主键冲突时更新数据,否则新增数据)! strSQL := "INSERT INTO "||TG_RELNAME||"_"||curMM||" SELECT $1.*" || " on conflict (indicator_code, biz_date_time, org_index_code_path, dimension_code) " || " do update set " || " push_time = EXCLUDED.push_time," || " pusher = EXCLUDED.pusher," || " category_path_code = EXCLUDED.category_path_code," || " biz_date_time = EXCLUDED.biz_date_time," || " org_index_code_path = EXCLUDED.org_index_code_path," || " dimension_code = EXCLUDED.dimension_code," || " indicator_code = EXCLUDED.indicator_code," || " indicator_value = EXCLUDED.indicator_value," || " indicator_value2 = EXCLUDED.indicator_value2";EXECUTE strSQL USING NEW;RETURN NULL;END$BODY$LANGUAGE plpgsql;
为主表创建触发器
CREATE TRIGGER insert_indicator_table_trigger BEFORE INSERT ON indicatorFOR EACH ROWEXECUTE PROCEDURE auto_insert_sub_indicator_table("biz_date_time"); -- 根据业务数据日期时间(每月分组)
批量新增指标数据
新增时只需要插入主表就可以了
insert into indicator (push_time,pusher,category_path_code,biz_date_time,org_index_code_path,dimension_code, indicator_code,indicator_value,indicator_value2,create_time) values ( #{indicator.pushTime,jdbcType=TIMESTAMP}, #{indicator.pusher,jdbcType=VARCHAR}, #{indicator.categoryPathCode,jdbcType=VARCHAR}, #{indicator.bizDateTime,jdbcType=TIMESTAMP}, #{indicator.orgIndexCodePath,jdbcType=VARCHAR}, #{indicator.dimensionCode,jdbcType=VARCHAR}, #{indicator.indicatorCode,jdbcType=VARCHAR}, #{indicator.indicatorValue,jdbcType=VARCHAR}, #{indicator.indicatorValue2,jdbcType=VARCHAR}, now() ) on conflict (indicator_code, biz_date_time, org_index_code_path, dimension_code) do update set push_time = EXCLUDED.push_time, pusher = EXCLUDED.pusher, category_path_code = EXCLUDED.category_path_code, biz_date_time = EXCLUDED.biz_date_time, org_index_code_path = EXCLUDED.org_index_code_path, dimension_code = EXCLUDED.dimension_code, indicator_code = EXCLUDED.indicator_code, indicator_value = EXCLUDED.indicator_value, indicator_value2 = EXCLUDED.indicator_value2
新增对应的年月后,自动创建分区表
查询
查询时只需要查主表就可以了
例如:
- 查询某个指标最新的数据
参考:
- PostgreSQL 9.6.0 手册
- postgresql使用触发器分表
标签:
- 加快虚拟仿真实训基地建设 启动职业学校信息化建设试点很必要
- “双减”后如何在满足学生多样需求方面做“加法”?
- 处于生理活跃期且心理发展不成熟 高校开设公共卫生必修课很必要
- 价格低于相应蔬菜零售价 西安投放约1万吨政府储备蔬菜
- 深受年轻消费群体所青睐 国潮风商品成为年货新选择
知识
- 他把银行卡卖给骗子,“黑吃黑”“截胡”十万元
- “老司机”4S店试驾豪车 结果油门当刹车撞了
- 新开工改造城镇老旧小区5.34万个
- 发动巡河志愿者2万余名 “用心护好每一条河”
- 假客服的套路:伪装成大平台客服,层层布局引人上钩
人物
- PostgreSQL触发器按月分表
- 重要预警,请查收
- 一航班因技术原因进行预防性降落 机上载154名乘客
- 上海某公园4人遭雷劈?刀郎《罗刹海市》破吉尼斯记录?都是假的
- 连续6日净买入 宁德时代获深股通净买入60.86亿元
- 佛塑科技股东户数减少591户,户均持股6.7万元
- 2022年春节放假安排(2022年法定假日放假安排)
- 女研究生,来当兵了!
- 狂暴少帅大结局免费观看
- 涿州暴雨致一厂房内24人被困2楼近15小时,当地救援队:已记录信息,会安排前方进行救援
- 可爱!张雨霏大运会首秀戴熊猫泳帽
- 网传中国商人和导游在泰抢夺泰国人工作,我使馆回应
- 讯飞星火APP在苹果应用商店下架
- 熔岩巨兽吧(熔岩巨兽)
- 世纪恒通:7月31日融资买入307.8万元,融资融券余额3637.47万元
- 国家网信办查处典型案例:涉恶炒企业负面、炒作企业家个人隐私
- 临沂市人大常委会原党组副书记、副主任王君师严重违纪违法被开除党籍和公职
- 北京卫视《养生堂》大脑最爱的不是核桃,是它!它被誉为补脑第一菜。
- 退伍军人志愿服务 在行动
- 23号球衣是谁啊 谁知道23号球衣是谁不
- 久盛电气8月1日快速反弹
- 助学公益一受助对象被质疑筹款过高
- 8月1日生意社电石基准价为2950.00元/吨
- 天气早知道丨今日出门带伞!超强台风“卡努”何去何从?
- 深城交(301091):7月31日北向资金增持48.59万股
- 苏明玉摆脱原生家庭影响的三种能力
- 异世之双狼夺爱烙胤(异世之双狼夺爱)
- 前后轮胎花纹不一样对车有影响吗(轮胎前后花纹不一样对车有影响吗?)
- xv是什么阀门图解(xv是什么格式)
- 宝马4系敞篷版2022款 宝马4系有敞篷版车型吗
- 经典路虎揽胜Retomod结合了优雅的英式设计和美式肌肉
- 龙虎榜 | 新华医疗今日跌6.73% 机构合计净卖出9976.83万元
- 中国好声音梁博是谁的战队(中国好声音梁博的背景是)
- 学校检查手机怎么逃过金属探测器
- 广州三元里将打造三大文旅街区
- 花钱办入学?谨防招生季骗局!
- 天津2023年一级建造师准考证打印时间:9月6日-8日
- 墨玉在强光下是绿色吗
- 工行合肥分行不动产登记“一站式”服务新模式正式启动
- 张家港市后塍街道:探索“1+N”助农,赋能乡村振兴
- 专访焰火总设计师:空中看大运会焰火是巨型金芙蓉花
- 河北平泉:“小板凳”课堂让党的创新理论“声”入人心
- 固始民警张伟:把社区警务工作做到群众心坎里
- 找婚介所不同意发圈_找婚介所
- 《巨齿鲨2》制片人:在国际市场,不知道吴京是不尽责的
- 河北5市启动防汛防台风Ⅰ级应急响应
- 七年级下册地理期末考试试卷2022 七年级下册地理期末考试试卷
- 油市趋紧,油价势将创下自2022年初以来最大单月涨幅
- 甘肃省高档数控机床创新联合体召开一届一次理事会、专家委员会、秘书处工作会议
- 7月份非制造业采购经理指数公布 商务活动指数继续保持扩张
精彩阅读
- 长江篇丨打造经济“绿色引擎”——乌江流域绿色发展观察
- 马奎尔收到2000万镑报价 西汉姆惨遭曼联+球员共同嫌弃
- 高中英语教研组工作总结5篇_高中英语教研组工作计划
- 中央气象台7月31日06时继续发布强对流天气黄色预警
- 深圳坚持工业立市、制造业当家 上半年工业投资增长47.5% 经济发展的“压舱石” 高质量发展的“顶梁柱”
- 8月开门雨,1号预报
- 微信对方拍了拍自己是什么意思_快来看下
- 施工八大员包括哪些项目(施工八大员包括哪些)
- 民生证券:预计中期煤价中枢将平稳运行 板块配置正当时
- 电脑出现蓝屏0x0000000C怎么修复
- 上理夏日限定款“甜品”“特饮”,让人甜蜜一“夏”
- 济南十艺节(关于济南十艺节的基本详情介绍)
- 白玉坠配什么颜色链子
- ChinaJoy上的AI冲击波:游戏外包饭碗被砸 创意开发永不可替?
- 想起我和你牵手的画面是什么歌名(想起我和你牵手的画面是什么歌)
- iecee官网_iecee
- 300余支战队集结battle,河南省金融知识网络竞赛倒计时3.2.1
- 市气象台专家解读:本轮强降雨如何影响津城?
- 2人被查
- 财政部、应急管理部紧急预拨2.9亿元资金 重点支持福建等省做好防汛防台风等应急救灾工作
- 经济日报:完善特定短线交易监管制度
- 员工签到表模板下载(员工签到表模板)
- 一键越狱是什么意思(越狱是什么意思)
- pdf转doc的方法(有什么方法)
- 《三伏》无剧透评测:又一块值得回味的巧克力
- 豪迈科技:国外客户分布在世界各地 对公司就近建厂预期和要求强烈
- 一周基金大事来了
- 第三金!中国选手金哲典夺得成都大运会男子长拳金牌
- 8月,这些新规将影响你我生活
- 黄渤见导演是新人没经验,想帮他一把,结果却帮到了自己!
- 招商证券:为什么美国经济对FED加息不那么敏感?
- 如何缓解乳房胀痛?生完宝宝必知的常识!新手爸妈一定要学习!
- 新洋丰获批两项省级科研项目
- 河南平顶山宝丰县:7月30日24点前,所有车辆不贴条不罚款
- 笔记本内存也能有灯效 玖合推出8GB笔记本RGB灯条
- 七匹狼羽绒服算啥档次(七匹狼羽绒服)
- 青松建化(600425):7月28日北向资金减持30.62万股
- 前LPL解说Joke:JDG不再有完虐BLG的资本,WBG晋级S赛概率最低
- 台风“杜苏芮”29日晚进入河南 境内多地将现明显风雨天气
- (成都大运会)开幕式泰国籍火炬手:一生珍藏的美好回忆
- 朱天兵(对于朱天兵简单介绍)
- hd6770功耗对比图 hd6770功耗
- 水庆霞:我保守吗?不是说防线后退就是保守,欧洲队身体比亚洲强
- 张良点金:晚间原油现价或79.3入场做空!
- 枣庄市发改委主任刘中波介绍全市上半年固定资产投资情况
- 自导自演《日出》金星:站在巨人肩膀上打造高级感舞台剧|封面会客厅
- 洛阳开展督导检查 防范应对5号台风“杜苏芮”
- 税务部门为民营企业“减负担、添动力”:上半年新增减税降费超9200亿元 有力支持民营经济发展壮大
- ESG实践再下一城!第一创业荣获“美丽中国ESG研究联盟”成员单位称号
- 恒大汽车:已向联交所申请7月28日起复牌