划重点!DWS开发的五大要点
摘要:高效使用数据库是一个合格的开发工程师的必备技能,如何使用DWS进行高效开发,提升应用效率,技术干货来喽~~~
高效使用数据库是一个合格的开发工程师的必备技能,如何使用DWS进行高效开发,提升应用效率,下面这5个要点可以指导你进行DWS开发。
一、怎么创建索引?
•在经常需要搜索查询的列上创建索引,可以加快搜索的速度。
•在作为主键的列上创建索引,强制该列的唯一性和组织表中数据的排列结构。
•在经常使用连接的列上创建索引,这些列主要是一些外键,可以加快连接的速度。
•在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。
•在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
•在经常使用WHERE子句的列上创建索引,加快条件的判断速度。
•为经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段建立索引。
二、怎么建立表结构?
建表的原则:
(1)、表数据均匀分布在各个DN上,以防止单个DN对应的存储设备空间不足造成集群有效容量下降。选择合适分布列,避免数据分布倾斜可以实现该点
(2)、表Scan压力均匀分散在各个DN上,以避免单DN的Scan压力过大,形成Scan的单节点瓶颈。分布列不选择基表上等值filter中的列可以实现该点
(3)、减少扫描数据数据量。通过分区的剪枝机制可以实现该点
(4)、尽量极少随机IO。通过聚簇/局部聚簇可以实现该点
(5)、尽量避免数据shuffle,减小网络压力。通过选择join-condition或者group by列为分布列可以最大程度的实现这点
怎么选择存储类型:
a) 行存表:点查询,返回记录少,基于索引的简单查询;增删改较多的表
b) 列存表:大表,统计分析类查询,group、join比较多的表
怎么选择分布方式:
a) 复制表:适用于记录较少的的维度表
b) 哈希表:数据量比较大的实事表
怎么选择分布列:
a) 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列
b) 在满足第一条原则的情况下尽量不要选取存在常量filter的列。例如,表dwcjk相关的部分查询中出现dwcjk的列zqdh存在常量的约束(例如zqdh=’000001’),那么就应当尽量不用zqdh做分布列
c) 在满足前两条原则的情况,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量
怎么使用PCK局部聚簇:
a) 受基表中的简单表达式约束。这种约束一般形如col op const,其中col为列名,op为操作符 =、>、>=、<=、<,const为常量值
b) 尽量采用选择度比较高(过滤掉更多数据)的简单表达式中的列
c) 尽量把选择度比较低的约束col放在Partial Cluster Key中的前面
d) 尽量把枚举类型的列放在Partial Cluster Key中的前面
三、怎么创建分区表?
分区表创建使用原则如下
1、 对于记录数小于100万的表,可以不使用分区表。
2、 对于记录数超过100万、低于500万的表,宜使用分区表。
3、 对于记录数超过500万且空间占用超过2GB的表,应使用分区表。
4、 分区表的单个分区记录数可超过500万,空间占用不宜超过2GB。
5、 暂不支持复合分区、二级分区。
6、 对于如下特殊场景,可不使用分区表:
A) 备份表或者老化表
此类数据表存放应用系统不再使用到的数据,在联机程序和批量程序均不访问此类数据,仅用于某些特殊场景下(例如生产问题排查、公/检/法查询等)使用,通过直接查询数据库的方式访问,相关数据应使用truncate或者drop来进行清理。
B) 交换分区表
此类数据表是存放分区表某个分区的数据,通过交换分区技术与分区表进行数据传递。
C) 采用分库分表设计的表
此类数据表已通过分库、分表策略进行了数据分割,可不使用分区表。
D) 批量处理中使用到的中间表、临时表,可不使用分区表。
E) 外公司产品中达到分区表条件的数据表,经评估如因外公司产品原因无法分区,应按应用维度提交规范例外,并随规范例外管理流程定期与外公司确认分区的可行性。
F) 对于存量应用达到分区条件的数据表,如应用规划废止,可不使用分区表。
7、 对于记录数超过100万且需要进行历史数据清理的表,宜通过业务发生日期等数据清理条件进行分区,通过分区truncate或exchange技术进行数据清理。
8、 分区的关键字应是where字句中的查询条件之一,分区的关键字不宜进行更新操作,避免数据因分区条件变化进行分区移动,导致性能下降。
9、 从数据的维护和使用效率情况看,除非是业务的特别需求,宜使用分区索引并设计为前缀分区索引。
10、 当表中的数据量很大时,应当对表进行分区,一般需要遵循以下原则:
− 应使用具有明显区间性的字段进行分区,比如日期、区域等字段上建立分区。
− 分区名称应当体现分区的数据特征。例如,关键字+区间特征。
− 将分区上边界的分区值定义为MAXVALUE,以防止可能出现的数据溢出。
典型的分区表定义如下:
CREATE TABLE staffS_p1
(
staff_ID NUMBER(6) not null,
FIRST_NAME VARCHAR2(20),
LAST_NAME VARCHAR2(25),
EMAIL VARCHAR2(25),
PHONE_NUMBER VARCHAR2(20),
HIRE_DATE DATE,
employment_ID VARCHAR2(10),
SALARY NUMBER(8,2),
COMMISSION_PCT NUMBER(4,2),
MANAGER_ID NUMBER(6),
section_ID NUMBER(4)
)
PARTITION BY RANGE (HIRE_DATE)
(
PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'),
PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'),
PARTITION HIRE_maxvalue VALUES LESS THAN (MAXVALUE)
);
四、怎么选择数据类型?
a) 尽量使用执行效率比较高的数据类型,一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高
b) 尽量使用短字段的数据类型,长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint
c) 使用一致的数据类型,表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销
d) 应尽量使用高效数据类型。选择数值类型时,在满足业务精度的情况下,选择数据类型的优先级从高到低依次为整数、浮点数、NUMREIC
e) 对于字符串数据,建议使用变长字符串数据类型,并指定最大长度。请务必确保指定的最大长度大于需要存储的最大字符数,避免超出最大长度时出现字符截断现象。除非明确知道数据类型为固定长度字符串,否则,不建议使用CHAR(n)、BPCHAR(n)、NCHAR(n)、CHARACTER(n)
f) 对于日期类型,时间精度要求大于等于1天的,可以使用varchar2存储;时间精度要求大于等于1秒的,宜使用date类型;时间精度要求小于1秒的,应使用timestamp类型
g) 在需要数据类型转换(不同数据类型进行比较或转换)时,应使用强制类型转换,以防隐式类型转换结果与预期不符
五、 sql开发经验总结
a) 使用union all代替union,union在合并两个集合时会执行去重操作,而union all则直接将两个结果集合并、不执行去重。执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认两个集合不存在重叠,可用union all替代union以便提升性能。
b) join列增加非空过滤条件,若join列上的NULL值较多,则可以加上is not null过滤条件,以实现数据的提前过滤,提高join效率
c) not in转not exists,not in语句需要使用nestloop anti join来实现,而not exists则可以通过hash anti join来实现。在join列不存在null值的情况下,not exists和not in等价。因此在确保没有null值时,可以通过将not in转换为not exists,通过生成hash join来提升查询效率
d) 避免对索引使用函数或表达式运算,对索引使用函数或表达式运算会停止使用索引转而执行全表扫描
e) 尽量避免在where子句中使用!=或<>操作符、null值判断、or连接、参数隐式转换
f) 对复杂SQL语句进行拆分,对于过于复杂并且不易通过以上方法调整性能的SQL可以考虑拆分的方法,把SQL中某一部分拆分成独立的SQL并把执行结果存入临时表
本文分享自华为云社区《DWS开发指导》,原文作者: 独孤求败马? 。
划重点!DWS开发的五大要点的更多相关文章
- Andrew Ng机器学习课程笔记--week11(图像识别&总结划重点)
一.内容概要 Photo OCR Problem Decription and pipeline(问题描述和流程图) Sliding Windows(滑动窗口) Getting Lots of Dat ...
- .NET日志记录之——log4net划重点篇
.NET日志记录之--log4net划重点篇 1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不 ...
- JS划重点——类和对象的不正经阐述
JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...
- 《阿里巴巴 Java 开发手册》划重点!
[强制]小数类型为 decimal,禁止使用 float 和 double. 说明:float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不 正确的结果.如果存储的数 ...
- java中高级开发知识准备要点
转载来源:https://www.cnblogs.com/JavaArchitect/p/10011253.html 在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实 ...
- Android开发-之五大布局
在html中大家都知道布局是什么意思了,简单来说就是将页面划分模块,比如html中的div.table等.那么Android中也是这样的.Android五大布局让界面更加美化,开发起来也更加方便.当然 ...
- S5P4418开发板使用要点
一.调试工具 1)USB 转串口驱动:用于驱动板子的串口板,电脑与板子进行调试串口通信2)量产软件 USB驱动安装:用于 NXUsbBurner_Ver1.0.6 软件镜像烧写(量产工具)3)调试工具 ...
- Android -- 贝塞尔实现水波纹动画(划重点!!)
1,昨天看到了一个挺好的ui效果,是使用贝塞尔曲线实现的,就和大家来分享分享,还有,在写博客的时候我经常会把自己在做某种效果时的一些问题给写出来,而不是像很多文章直接就给出了解决方法,这里给大家解释一 ...
- mysql 在windows下的安装,开发基础与要点
1:安装(windows下) 官网下载.msi文件 运行安装时只需要安装server就行了 在环境变量中配置到bin目录:e.g:C:\programFile\...mysql\bin 完成后进入wi ...
- MapReduce Tutorial(划重点)
Mapper Mapper的maps阶段将输入键值对经过计算得到中间结果键值对,框架会将中间结果按照key进行分组,然后传递给reducer以决定最终的输出.用户可以通过Job.setGrouping ...
随机推荐
- SP3377
题目简化和分析: 前言:这题目背景真奇怪. 我们可以将每种关系,看成一条边,如果出现奇数边环就不满足. 例如:\(a,b\) 异性 \(a,c\) 异性 \(b,c\)异性 这种情况是不满足的. 相当 ...
- 聊聊RNN&LSTM
RNN 用于解决输入数据为,序列到序列(时间序列)数据,不能在传统的前馈神经网络(FNN)很好应用的问题.时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物.现象等随时间的变化状态或程 ...
- arm架构docker安装nacos
前言 搞了个hk1box,装了armbian系统,想用这个当服务器调试微服务,需要安装nacos.尝试安装非docker版本的nacos,去github下载arm版本的并且放到linux下面,运行的时 ...
- 欧拉序求LCA
使用欧拉序 st 表 O(1) 求 LCA 欧拉序 st 表求 LCA 一开始是从某篇题解里看到的,后来百度了一下就会了( 这是一种预处理 O(nlogn) ,查询 O(1) 的优秀算法. 什么是欧拉 ...
- "拍牌神器"是怎样炼成的(三)---注册全局热键
要想在上海拍牌的超低中标率中把握机会.占得先机,您不仅需要事先准备好最优的竞拍策略,还要制定若干套应急预案,应对不时之需.既定策略交给计算机自动执行,没有问题.可是谁来召唤应急预案呢?使用全局热键应该 ...
- MyBatis核心流程
摘要 mybatis的核心流程,主要是对于主线的一个探索.目的是对于整个mybatis流程有个初步的印象 核心流程 核心流程搞懂:主线,涉及的模块不深究.再去基础支持层,再回来核心. /** * My ...
- 《流畅的Python》 读书笔记 第7章_函数装饰器和闭包
第7章 函数装饰器和闭包 装饰器这个名称可能更适合在编译器领域使用,因为它会遍历并注解句法树 函数装饰器用于在源码中"标记"函数,以某种方式增强函数的行为.这是一项强大的功能,但是 ...
- 一、Linux发展史
一.Linux发展史及红帽认证 红帽授权培训合作伙伴 木兰宽松许可证 1. Linux系统发展史 1. Unix发展历程 上世纪六十年代贝尔实验室(Bell).麻省理工学院(MIT)以及通用电气(GE ...
- (Good topic)快慢指针:链表的中间结点 (3.23leetcode每日打卡)
给定一个带有头结点 head 的非空单链表,返回链表的中间结点. 如果有两个中间结点,则返回第二个中间结点. 示例 1: 输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3, ...
- 🔥🔥Java开发者的Python快速进修指南:面向对象--高级篇
首先,让我来介绍一下今天的主题.今天我们将讨论封装.反射以及单例模式.除此之外,我们不再深入其他内容.关于封装功能,Python与Java大致相同,但写法略有不同,因为Python没有修饰符.而对于反 ...