
数仓优化数仓搭建表优化数据集成优化冷热表元数据管理监测每天的数据数仓搭建1.建立数据字典根据数据字典建立字段避免数据业务字段表不对应然后把所有字段在那些表全部提出来梳理业务然后理解字段意思2.数据建模ods dwd 主键模型表存储内热表分介质存储冷表存历史数据表数据量比较大根据日期分批次抽多时间段抽根据资源使用情况合理错开峰值优先级高的表的先抽取3.数据治理写个表监控所有任务的数据抽取情况然后通过前端可视化显示4.权限管控分库存储历史数据只给读的权限5.优化存储提高查询效率增量抽取频繁的insert into 会产生很多碎片数据每过一个月或者更长时间可以清空表插入到一张新表在改名这样可以优化百分之的效率存储空间.布隆索引优化等值查询类似条码7.DWD DWS不允许sql关联里面有like复杂的逻辑直接在上有表加个处理后的字段casw when条件的表条件数据直接落在一个with as的临时表里面这样子数据集就优化下来8.两套环境先在测试环境测试任务确定没有问题在放生产比如长度问题参数传递问题不然报错影响下一次解决9.kettle任务中数据先到临时表再到目标表我们用的是批量加载插件他是先把数据转为csv文件然后每次满100W写入一次然后1000W数据写入第二次任务报错了那就有一部分数据进去了如果没有临时表直接删除目标表可能导致误删除正常开发是应该只有读权限额所以临时表当过度最初我们的任务是在第一个作业里面执行所有的清空表操作包括临时表和维度表有些任务在后面就导致这部分数据有空窗期半小时没数据影响早上报表使用所以得把清空临时表的操作跟到单任务的后面先清空临时表然后数据进去然后临时表数据进入目标表因为同库数据只有10秒左右空窗期如果是要求时效性更高的就删目标表临时表改名目标表维表全量10.kettle任务只能监察大任务报错商用版的也无法识别里面的小任务报错我们就把每天的日志写入日志表然后我们用python脚本监测日志里面是否出现error,然后出现就报警我们python脚本是半小时执行一次读日志表里当天任务出现error的然后推送任务名字到钉钉上面调用机器人接口11.精度丢失问题我i们这里用的主键模型时间只取到时分秒但是我们的数据有毫秒我们有些字段没有主键是拼接的主键时间在里面取到毫秒他们主键就一样导致后面那条数据把前面那条数据覆盖了源数据又被删除了差点就生产事故表优化单表数据量太大可以根据业务分表比如根据化成段集成段装配段数据集成优化布置多个任务每个任务抽别抽取一个月的数据冷热表把历史数据放在冷表里面压缩一下元数据管理你现在每天运维 Kettle 任务可能经常遇到这些问题其实都是元数据没管好你遇到的痛点 背后缺失的元数据1.这个表是谁建的干嘛用的 业务元数据缺失建数仓文档excel文档表数据来源数据格式中文名字2.改了一个表字段下游好多任务报错 数据血缘缺失画数据血缘图梳理血缘关系3.某个任务每天凌晨 3 点跑不知道依赖谁 调度依赖元数据缺失分层分为4层然后通过转换配置依赖关系4.数据对不上不知道哪个版本是对的 指标口径没统一文档记录所有sql把任务逻辑记录在sql里在表名注释5.某个任务突然慢了不知道根因 操作元数据运行日志没打通写监测脚本把数据都存到一张表里面记录任务的开始时间结束时间来源数量结果数量流处理csv文件批量加载所以可能出现数据加载到一半报错的情况所以加个临时表任务启动先清空临时表记录任务的状态日志任务完成的时间进行监控监测每天的数据–按天聚合 hanaselectto_date(test_date_time),count(1)FROM wip.parametric_measureWHERE TEST_DATE_TIME ‘2025-12-24’group byto_date(test_date_time)order byto_date(test_date_time)–按小时聚合 hanaSELECTSERIES_ROUND(ASSEMBLED_DATE, ‘INTERVAL 1 HOUR’) AS hour_time,COUNT(1) AS record_countFROM wip.Z_REPORT_ASSY_DATAWHERE ASSEMBLED_DATE ‘2026-01-31’ and ASSEMBLED_DATE ‘2026-02-01’GROUP BY SERIES_ROUND(ASSEMBLED_DATE, ‘INTERVAL 1 HOUR’)ORDER BY SERIES_ROUND(ASSEMBLED_DATE, ‘INTERVAL 1 HOUR’)–按天聚合 dorisselectdate(test_date_time),count(1)FROM ods_chuz_mes_parametric_measure_gj_diWHERE TEST_DATE_TIME ‘2025-12-24’group bydate(test_date_time)order bydate(test_date_time)–按小时聚合 dorisSELECTDATE_FORMAT(ASSEMBLED_DATE, ‘%Y-%m-%d %H:00:00’) AS hour_time,COUNT(1) AS record_countFROM ods_chuz_mes_z_report_assy_data_gj_diWHERE ASSEMBLED_DATE ‘2026-01-31’ AND ASSEMBLED_DATE ‘2026-02-01’GROUP BY DATE_FORMAT(ASSEMBLED_DATE, ‘%Y-%m-%d %H:00:00’)ORDER BY DATE_FORMAT(ASSEMBLED_DATE, ‘%Y-%m-%d %H:00:00’);–查询2表的数据差异selecta.handle,a.dd,a.CREATED_DATE_TIME,a.MODIFIED_DATE_TIMEfrom (SELECTa.handle,b.handle as dd,a.CREATED_DATE_TIME,a.MODIFIED_DATE_TIMEFROM ods_chuz_mes_z_report_transaction_detil_gj_di aleft join ods_chuz_mes_z_report_transaction_detil_gj_temp_di bon a.handle b.handleand a.CREATED_DATE_TIME b.CREATED_DATE_TIMEWHERE(a.CREATED_DATE_TIME ‘2026-04-12 23:00:00.0’AND a.CREATED_DATE_TIME ‘2026-04-13 23:00:00.0’)or(a.MODIFIED_DATE_TIME ‘2026-04-12 23:00:00.0’anda.MODIFIED_DATE_TIME ‘2026-04-13 23:00:00.0’)) awhere a.dd is null