Doris数仓开发规范

文章目录

  • 一、字符集规范
  • 二、建表规范
  • 三、数据变更规范
  • 四、数据查询规范
  • 结尾


一、字符集规范

【强制】数据库字符集指定utf-8,并且只支持utf-8。


二、建表规范

【建议】库名统一使用小写方式,中间用下划线(_)分割,长度62字节内

【建议】表名称大小写敏感,统一使用小写方式,中间用下划线(_)分割,长度64字节内

【强制】确保每个tablet大小为1-3G之间。
举例:假设表内单分区数据量在100G,按天分区,bucket数量100个。

【强烈建议】不要使用Auto Bucket ,按照自己的数据量来进行分区分桶,这样你的导入及查询性能都会得到很好的效果,Auto Bucket 会造成 tablet 数量过多,造成大量小文件的问题。

【强制】 5 亿以上的数据必须设置分区分桶策略
1.没有办法分区的,数据又缓慢增长的:单个tablet数据量保持在1-3G;比如5亿数据大小在20G,bucket数量给20个
2.没有办法分区的,数据又较快增长的,没办法按照时间动态分区,可以适当放大一下你的bucket数量,按照你的数据保存周期(180天)数据总量,来估算你的bucket数量应该是多少,建议还是单个bucket大小在1-3G。
3.一个是对分桶字段进行加盐处理,业务上查询的时候也是要同样的加盐策略,这样能利用到分桶数据剪裁能力
4.另外一个是数据随机分桶,这种缺点是没办法利用数据分桶剪裁能力,数据分布会很均匀
5.避免数据倾斜的问题
100M以内:1 buckets
100M-1G :3-5 个 Buckets
大于1G-3G :5-7个 buckets
3-5G :7-10 个 buckets
6.维度表:缓慢增长的,可以使用单分区,在分桶策略上使用常用查询条件(这个字段数据分步相对均衡)分桶
7.事实表

【建议】 1000w-2 亿以内数据为了方便可以不设置分区,直接用分桶策略。(不设置其实Doris内部会有个默认分区)
参考上面第二点

【强制】 2000kw 以内数据禁止使用动态分区(动态分区会自动创建分区,而小表用户客户关注不到,会创建出大量不使用分区分桶)
参考上面第二点

【强制】对于有大量历史分区数据,但是历史数据比较少,或者不均衡,或者查询概率的情况,使用如下方式将数据放在特殊分区。
对于历史数据,如果数据量比较小我们可以创建历史分区(比如年分区,月分区),将所有历史数据放到对应分区里
创建历史分区方式
例如:FROM (“2000-01-01”) TO (“2022-01-01”) INTERVAL 1 YEAR
具体参考:https://doris.apache.org/zh-CN/docs/sql-manual/sql-reference/Data-Definition-Statements/Create/CREATE-TABLE#partition_info

(PARTITION p00010101_1899 VALUES [('0001-01-01'), ('1900-01-01')),PARTITION p19000101 VALUES [('1900-01-01'), ('1900-01-02')),
...PARTITION p19000104_1999 VALUES [('1900-01-04'), ('2000-01-01')),FROM ("2000-01-01") TO ("2022-01-01") INTERVAL 1 YEAR,PARTITION p30001231 VALUES [('3000-12-31'), ('3001-01-01')),PARTITION p99991231 VALUES [('9999-12-31'), (MAXVALUE))
)

【强制】如果分桶字段存在30%以上的数据倾斜,则禁止使用Hash分桶策略,改使用random分桶策略
参考上面第二点事实表部分

【建议】前缀索引的第一个字段一定是最长查询的字段,并且需要是高基字段。这里面选取分区分桶外最长查询且高基数的列
1.分桶字段注意事项:这个一般是数据分布比较均衡的,也是经常使用的字段,最好是高基数字段
2.Int(4)+ Int(4) + varchar(50),前缀索引长度只有28
3.Int(4) + varchar(50) + Int(4),前缀索引长度只有24
4.varchar(10) + varchar(50) ,前缀索引长度只有30
5.前缀索引(36位):第一个字段查询性能最好,前缀索引碰见varchar类型的字段,会自动截断前20个字符
6.最常用的查询字段如果能放到前缀索引里尽可能放到前前缀索引里,如果不能,可以放到分桶字段里
good case :UNIQUE KEY(user_id, age) user_id最长被查询,且数据分布比较散

bad case :UNIQUE KEY(age,user_id ) age是低基数列,且可能存在数据倾斜

【强制】表的副本数必须为3

【建议】前缀索引中的字段长度尽可能明确,因为Doris只有前36个字节能走前缀索引

【强制】除了UNIQUE KEY和aggregate key要构建key的情况,否则不要基数(例如user_type)小于50的字段建立任何索引。因为Doris内置了字典类型优化。
1.已经有了低基数优化了
2.Unique Key 是aggregate key 的一个特例,当aggregate key 的key 保持唯一其实就是Unqiue key 模型

【强制】BloomFilter索引必须在查询条件是in或者=,并且是高基(5000以上)列上构建。
1.首先BloomFilter适用于非前缀过滤。
2.查询会根据该列高频过滤,而且查询条件大多是 in 和 = 过滤。
3.不同于Bitmap, BloomFilter适用于高基数列。比如UserID。因为如果创建在低基数的列上,比如 “性别” 列,则每个Block几乎都会包含所有取值,导致BloomFilter索引失去意义。
4.数据基数在一半左右
5.类似身份证号这种基数特别高并且查询是等值(=)查询,使用Bitmap索引能极大加速
6.Bloomfilter 使用场景:

【强制】bitmap索引必须在一定基数范围内构建,太高或者太低的基数都不合适

  • TINYINT
  • SMALLINT
  • INT
  • BIGINT
  • CHAR
  • VARCHAR
  • DATE
  • DATETIME
  • LARGEINT
  • DECIMAL
  • BOOL
    bitmap 索引支持的数据类型如下:
    适用于低基数的列上,建议在100到100,000之间,如:职业、地市等。重复度过高则对比其他类型索引没有明显优势;重复度过低,则空间效率和性能会大大降低。特定类型的查询例如count、or、and 等逻辑操作因为只需要进行位运算
    这种索引更多的适合正交查询
    适用场景:
    Bitmap 索引支持类型:

【强制】亿级别以上数据,如果有模糊匹配,使用倒排索引或者是 NGram Bloomfilter

【建议】如果某个范围数据在分区分桶和前缀索引中都不好设计,可以考虑引入倒排索引加速。

【强制】单表物化视图不能超过6个
单笔物化视图是实时构建
在unique 模型上物化视图只能起到 Key 重新排序的作用,不能做数据的聚合,因为Unqiue模型的聚合模型是replace

【建议】建议使用JSON数据类型代替字符串类型存放JSON数据的使用方式


三、数据变更规范

【强制】应用程序不可以直接使用delete后者update语句变更数据,使用CDC的upsert方式来实现。
1.低频操作上使用,比如 Update 几分钟更新一次
2.如果使用 Delete 一定带上分区条件

【强制】DBA执行delete后者update语句时必须带分区条件

【强制】禁止使用INSERT INTO tbl1 VALUES ("1"), ("a");这种方式写入数据。

【建议】特殊大的ETL操作,简单单独在Session中设置超时时间

SELECT/*+ SET_VAR(query_timeout = 1*/ sleep(3);

类似这样通过Hint方式去设置Session 会话变量,不要设置全局的系统变量


四、数据查询规范

【强制】in 中条件超过 2000 后,必须修改为子查询

【强制】禁止使用REST API(Statement Execution Action)执行大量SQL查询,改接口仅仅用于集群维护。

【建议】一次insert into select 数据超过1亿条后,建议拆分为多个insert into select语句执行,分成多个批次来执行。
set parallel_fragment_exec_instance_num = 8 或者 16 建议是你CPU内核的一半
insert into new_tbl select * from old_tbl
如果真的是要这样执行,在集群资源相对空闲的时候可以通过调整并发度来加快的数据导入速度
2.0 以后版开启了Pipeline 就不需要设置并发度了

【强制】query查询条件返回结果在5w条以上,使用JDBC Catalog或者OUTFILE方式导出。不然大量FE上数据传输将占用FE资源,影响集群稳定性
如果你是交互式查询,建议使用分页方式(offset limit),分页要加Order by
如果是数据导出提供给第三方使用,建议使用 outfile 或者 export 方式

【建议】query查询如果有大量的数据传输需求,建议部署observer节点并在该该节点执行查询(私有化部署)
建议的方式是 1 FE(Follower) + 多个 OBserver(FE)方式,读写分析,所有的写连接 Follower,所有的读连接Observer

【建议】尽量不要使用OR 作为 JOIN条件

【建议】大量数据排序(5亿以上)后返回部分数据,建议先减少数据范围在执行排序,否则大量排序会影响性能。

select * from kunpeng_risk_record krr where krr.event_occur_time_date between '2023-10-01 00:00:00' and '2023-10-25 23:59:59' and krr.partner_code = 'liveme' order by krr.sequence_id desc limit 20;

例如将 from table order by datatime desc limit 10 优化为from table where datatime=‘2023-10-20’ order by datatime desc limit 10

【强制】2个以上大于3亿的表 JOIN 使用 Colocate JOIN
Colocate Join 的使用参照:https://doris.apache.org/zh-CN/docs/query-acceleration/join-optimization/colocation-join

【强制】亿级别大表禁止使用select * 查询,查询时需要明确要查询的字段
1.SQL Block方式禁止这种操作
2.如果是高并发点查,建议开启行存
3. 表属性级别

"enable_unique_key_merge_on_write" = "true",
"store_row_column" = "true"      
be.conf
disable_storage_row_cache 是否开启行缓存, 默认不开启

4.使用PrepareStatement模板

【强制】亿级以上表数据查询必须带分区分桶条件


结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/593056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 车联网——CarPackageManagerService介绍(十一)

CarPackageManagerService 主要用于车上使用场景扩充了一些包管理相关的接口。包括黑白名单的机制,这主要是出于安全的考虑,车上的应用有更严格的限制。结合用户体验限制对运行在Android Automotive OS 上的应用有一个更好的约束。 一、简介 CarPackageManagerService 是 An…

力扣42. 接雨水

双指针法 思路: 将数组前后设置为 left、right 指针,相互靠近;在逼近的过程中记录两端最大的值 leftMax、rightMax,作为容器的左右边界;更新指针规则: 如果数组左边的值比右边的小,则更新 left…

使用GO开发的IDE简介

一、IDE介绍 Goland Goland是由JetBrains公司开发的商业IDE,专门为Go语言开发设计。JetBrains是一家知名的软件开发公司,以其强大的IDE产品如IntelliJ IDEA而闻名。 优点: 基于IntelliJ平台,因此拥有与IntelliJ IDEA相似的强大功能…

【Linux操作系统】探秘Linux奥秘:进程与任务管理的解密与实战

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS &…

4462 4.曙曙献爱心

#include<bits/stdc.h> using namespace std; int n,m,k; int a[1001]; int s[1001]; int f[1001][1001];//f[i][j]&#xff0c;i个警察&#xff0c;j个点&#xff0c;能管理的最大人数 int main(){cin>>n>>m>>k;for(int i1;i<n;i){cin>>a[i…

【快慢指针】26.删除有序数组中的重复项

题目 法1&#xff1a;快慢指针 基础解法&#xff0c;必须掌握&#xff01;&#xff01;&#xff01; class Solution {public int removeDuplicates(int[] nums) {if (nums.length < 2) {return nums.length;}int slow 0, fast 1;while (fast < nums.length) {if (n…

大数据StarRocks(一) StarRocks概述

1 StarRocks介绍 StarRocks是新一代极速全场景MPP(Massively Parallel Processing)数据库&#xff0c;它充分吸收关系型OLAP数据库和分布式存储系统在大数据时代的优秀研究成果&#xff0c;在业界实践的基础上&#xff0c;进一步改进优化、升级架构&#xff0c;并增添了众多全…

前端知识点(面试可看) —— HTML

摘要 马上就要毕业啦&#xff0c;没有参加2023年的秋招&#xff0c;准备在最近开始找全职或者实习工作&#xff0c;然后也马上过年了&#xff0c;总结和理一下自己的知识要点&#xff0c;参加2024年的春招。 页面缩放 meta viewport 如何去使用&#xff0c;怎么使用&#xf…

TypeScript 语法 + 工具封装

环境配置 安装 npm install typescript -g 查看版本 tsc --version 1.初识typescript 邂逅typescript&#xff0c;typescript的基本使用 新建ts 文件 &#xff08;记得导出&#xff09; typescript 定义时可指定 变量类型 在名称后面加引号 和 类型 格式为 let 名称: 类型 …

Java学习,一文掌握Java之SpringBoot框架学习文集(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Docker 安装Mysql

目录 Docker Mysql安装 ✨安装和配置mysql ✨远程连接mysql远程连接 MySQL 是世界上最流行的开源数据库。根据 DB-Engines的调查数据&#xff0c;MySQL 是第二受欢迎的数据库&#xff0c;仅次于 Oracle 数据库。MySQL在过去由于性能高、成本低、可靠性好&#xff0c;已经成…

Redis缓存保卫战:拒绝缓存击穿的进攻【redis问题 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis缓存保卫战&#xff1a;拒绝缓存击穿的进攻 前言缓存击穿的定义和原理为何会发生缓存击穿缓存击穿的危害防范缓存击穿结语: 前言 你是否曾经遇到过系统在高并发情况下出现严重性能问题&#xff…

2023.12.31力扣每日一题——一年中的第几天

2023.12.31 题目来源我的题解方法一 模拟 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1154 我的题解 方法一 模拟 如果月份大于2,&#xff0c;需要判断当年是否是闰年&#xff0c;如果是闰年2月份需要多算一天。 具体计算&#xff1a; 先计算月的贡献&#xff08;注…

微信养号指南:提高账号权重

在如今的社交媒体时代&#xff0c;微信成为了人们生活中必不可少的一部分。它不仅是一个即时通讯工具&#xff0c;更是一个方便快捷的社交平台。然而&#xff0c;要想让自己的微信号保持活跃并吸引更多的关注&#xff0c;需要一些技巧和策略。下面将为大家分享一些微信养号指南…

云卷云舒:基于业务逻辑关联度实现数据预加载

云卷云舒&#xff1a;算力网络云原生&#xff08;下&#xff09;&#xff1a;云数据库发展的新篇章-CSDN博客 一、现有技术的技术方案 在实现一个具有复杂业务逻辑的应用系统时&#xff0c;大多数情况下&#xff0c;编码过程中必定会包含着较多的数据访问方法&#xff08;java…

MES是什么?有了MES还要上ERP或MES吗?

MES是什么 MES是Manufacturing Execution System&#xff08;制造执行系统&#xff09;的简称&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统&#xff0c;负责承接ERP系统下达的生产计划&#xff0c;与ERP关系密切。MES能通过信息传递&#xff0c;做到生产追溯…

亚马逊、速卖通等跨境平台如何利用自养号测评提升销量

一、自然排名&#xff1a;链接成功的关键 自然排名的重要性不言而喻。一个链接的成功与否&#xff0c;关键在于其自然排名是否能够打上来。无论是搜索流量还是关联流量的自然排名&#xff0c;亦或是BSR排行榜&#xff0c;都应时刻关注这些自然排名的变化。 二、自然排名的位置…

Java使用camerax的例子

在github&#xff0c;自己看吧 https://github.com/7eau/CameraXDemo_Java camerax版本 def camerax_version "1.1.0-beta01" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:…

Unity 2022 版本 寻路 NavMesh

官方教程地址 https://docs.unity3d.com/Packages/com.unity.ai.navigation1.1/manual/index.html 首先装包 先给地图 和 阻挡 设置为静态 然后给地上行走的地方 添加组件 可以直接bake 然后会显示蓝色的可行走路径 player 添加插件 然后给角色添加脚本 using System.Co…

Keil调试STM32卡死在文件startup_stm32f10x_hd.s的B处

———————Keil调试卡死——————— &#x1f384;问题说明 在移植代码完成后调试时候程序卡死在startup_stm32f10x_hd.s文件的B处 &#x1f384;复现场景 &#x1f384;解决办法 经过查资料&#xff0c;发现是移植的时候&#xff0c;漏掉了终端函数&#xff0c;加上…