最新要闻
- TechInsights:2023年全球消费电子设备总收益将达到9470亿
- 国际锐评丨31页提中国!日本防卫白皮书想干什么?
- 山西钢厂产量稳居高位 资源悄然累库
- 北向资金今日净买入48.54亿元,药明康德、宁德时代、五粮液分别净买入7.95亿元、7.04亿元、4.47亿元
- 过把瘾!各国运动员们集体参观大熊猫直呼:完美!
- 人居环境持续改善 幸福生活持续“加码” ——居民代表走进“云间书房”共话基层治理
- 微视视频怎么下载 微视视频
- 爱你都是鬼话,就想冠冕堂皇的出轨,电影《秘恋之夏》
- 北京暴雨预警级别已调整,国图今天12时恢复开馆
- html是什么?html的介绍
- 北向资金净买入48.54亿元,连续6日净买入
- 气候与气候学 关于气候与气候学介绍
- 星途星纪元STERRA ET陪伴向上“星”生
- LPL夏季季后赛激战正酣 冒泡赛资格花落谁家?
- 国产5G芯+高刷屏 今天的699元新机性价比称王了
- iPhone 6GB内存不能看了 安卓厂商卷到极致:普及24GB内存
广告
手机

汇丰控股(HSBC.US)CEO:与平安分拆之争已经结束

类似爱情歌词萧亚轩(类似爱情歌曲介绍)
- 汇丰控股(HSBC.US)CEO:与平安分拆之争已经结束
- 类似爱情歌词萧亚轩(类似爱情歌曲介绍)
- 网约出租车没坐成却要333元? 陕西周至交通局:费用已取消
- “中国温泉之城,世界长寿贺州”文旅宣传片在姑婆山景区正式开拍
- 星云股份(300648.SZ):公司检测设备可应用于锂电池、钠电池的测试
- 博惠优选1期成立4年多亏损82%
家电
PostgreSQL触发器按月分表
前言
设计一张指标表,用于存储大屏上面要展示的各种指标项。指标数据由其他多个第三方通过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使用触发器分表
关键词:
-
-
-
-
PostgreSQL触发器按月分表
【成都大运会】吃着烧烤唱着歌 成都大运会外籍运动员感受成都夜生活
福星股份:公司房地产开发模式以城中村改造为主
青海省公路跨铁路“第一转”:转体桥完成65.3度“转身”
身价90亿的“国民女神”,撩不动年轻人
TechInsights:2023年全球消费电子设备总收益将达到9470亿
浙江出台促进个体经济发展43条政策举措
我州发布农田渍涝灾害风险预警
邢台市城际公交多条线路暂停发车
8月自然灾害风险总体偏高 注意防范这些灾害
七星彩第23088期易嘉惠胆码分析
沪指平盘报收 威士顿、星源卓镁等创历史新高
汇丰控股(HSBC.US)CEO:与平安分拆之争已经结束
首届乡村儿童艺术嘉年华落幕 为乡村美育播下种子
国际锐评丨31页提中国!日本防卫白皮书想干什么?
逆水寒手游让武侠游戏成为暑期焦点,这几款游戏不容错过!
工业硅震荡重心缓慢抬升 等待需求进一步验证
山西钢厂产量稳居高位 资源悄然累库
新岚图FREE 8月19日上市 续航超1200km即日开启预定
北向资金今日净买入48.54亿元,药明康德、宁德时代、五粮液分别净买入7.95亿元、7.04亿元、4.47亿元
佰维存储:预计上半年净亏损2.8亿元-3.2亿元
此次强降雨造成河北540703人受灾 因灾死亡9人
河南21支救援队驰援河北邢台!上百名队员携39艘冲锋舟同心抗洪
八一慰问武警官兵 共叙军警战友深情
林更新《中国新主播》足球主题花式“整活” 助力新主播公益行动
女子买房“高公摊”刷爆网络,合肥出大招:探索套内面积计价、试点现房销售
国华网安最新股东户数下降15.64%
主力资金动向 10亿元潜入通信业
合肥庐阳区37个老旧小区改造全面开工
镇远县2023年半年经济工作会议召开
义马市财政局:加强政府采购业务培训 提升政府采购工作质量
安徽巢湖:绿海“生金” 林下套种结硕果
过把瘾!各国运动员们集体参观大熊猫直呼:完美!
中国移动拟减持科大讯飞股份 或将套现近15亿元
不要当冤大头了,原装电池平替来了—斯莫格蓝闪电相机电池分享
广西壮族自治区天等县发布雷电黄色预警
人居环境持续改善 幸福生活持续“加码” ——居民代表走进“云间书房”共话基层治理
类似爱情歌词萧亚轩(类似爱情歌曲介绍)
安徽三元铜业科技有限公司(关于安徽三元铜业科技有限公司简述)
国家有关部门印发通知进一步促进脱贫人口持续增收
微视视频怎么下载 微视视频
两部门紧急预拨1.1亿元支持京津冀地区防汛救灾
黄金市场分析:黄金继续震荡 关注震荡后继续下行
淄博市周村区举办国学小名士中华经典诵读活动
煲汤料包 煲汤
能超多少吧友?德拉蒙德INS晒其出战野球局 撤步三分非常丝滑
网约出租车没坐成却要333元? 陕西周至交通局:费用已取消
爱你都是鬼话,就想冠冕堂皇的出轨,电影《秘恋之夏》
侨银股份于广东梅州丰顺新设环境卫生公司 注册资本100万元
英集芯副总徐朋曾跳槽四次 入职公司前曾收到过警示函如今年薪107.8万
最高投资60亿!又三项LED项目披露新进度
和墨玉很像的石头
北京暴雨预警级别已调整,国图今天12时恢复开馆
普冉股份预亏去年净利降7成 上市超募9亿中信证券保荐
【收盘】A股三大股指弱势震荡收跌:钢铁、电力走高,券商、汽车板块冲高回落
壁纸专辑 《原神》愚人众执行官少女(哥伦比娅)
贵州纳雍:种植红托竹荪 实现“点绿成金”
喜讯!惠安2023年首封北京大学录取通知书送达
自治区第十四届运动会群众比赛轮滑项目在高新区(新市区)开赛
永川区首次实现企业简易注销全程无纸化办理
青藏铁路复兴号日均上座率112%
“中国温泉之城,世界长寿贺州”文旅宣传片在姑婆山景区正式开拍
澳门7月份幸运博彩毛收入166.62亿澳门元 同比增40倍
哈尔滨市气象台发布地质灾害气象风险橙色预警
第十届吉林省市民文化节系列活动唱响新时代主题交响音乐会在长春上演
用电池供电的电磁炉“Chef”可为营地清洁烹饪减负
html是什么?html的介绍
从百万新增商家到日活大幅攀升 淘宝天猫正在带来更多增长红利
西安建筑科技大学建科学院赴宝鸡市“凤县革命纪念馆”开展参观调研活动
星云股份(300648.SZ):公司检测设备可应用于锂电池、钠电池的测试
安徽省巢湖市银屏市场监管所开展塑料污染治理专项检查
8月1日哈三联(002900)龙虎榜数据:游资量化打板上榜
互动| ?北京君正:公司存储产品可广泛应用于各类智能化等级的汽车中
美国超导美股盘前延续涨势 现涨近150%
四川宜宾医疗系统塌方性腐败:一个医生勇敢正义的自白
江淮汽车:已累计获得2.1亿元政府补贴
江苏华昌化工:老牌化工企业何以跨界氢能“新赛道”?
博惠优选1期成立4年多亏损82%
国铁集团:暑运日均开行旅客列车较2019年同期增14.2%
2023年普通高校在川招生本科二批次院校录取调档线出炉
北京强降雨14名失联人员已取得联系,确认都安全
“面向未来 就业无忧”引导毕业生找准职业方向
在美国申报上市获受理,恒瑞医药“双艾”组合出海迎来新进展
北向资金净买入48.54亿元,连续6日净买入
晨丰科技: 晨丰科技关于持股5%以上股东股份解除质押的公告
工作人员称涿州救援难度大,洪水已漫过一楼
冒险岛枫之传说神射手技能搭配攻略
8月金股策略出炉,机构偏好发生重大转变,“顺周期”成新热门词,AI已成“昨日黄花”?
富瑞:重申信义光能(00968)“跑输大市”评级 目标价降至5.67港元
气候与气候学 关于气候与气候学介绍
爱的罗曼斯吉他版_爱的罗曼斯
富力地产总裁张力回国后首次公开现身,此前在美国被控涉嫌行贿
大疆声明:从未设计制造过面向军事目的产品和设备
65 英寸 TCL QM8 Mini-LED 电视 具有视网膜灼烧亮度 2,000 尼特
我们何以不同?| 搜狐文化好书之选7月推荐
交大思诺:公司中标北京局集团公司列车运行监控装置(LKJ)招标采购项目
六味地黄丸,知柏地黄丸,麦味地黄丸,舒肝和胃丸,归芍地黄丸,附子理中丸,六君子丸,二妙丸,逍遥丸,归脾丸十大中成药,用对才管事。
Heliene将在明尼苏达州增加1.5GW/1GW TOPCon电池和组件产能
催收打电话到单位说我欠款逾期-催收打电话到单位说我欠款逾期是真的吗
一批罕见苹果收藏品开拍 苹果史上第二张支票被拍卖