摘要:高效使用数据库是一个合格的开发工程师的必备技能,如何使用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开发的五大要点相关推荐

  1. HighNewTech:2019年5月4日《巴菲特股东大会》—6小时20多个亮点50多个问答(划重点)

    High&NewTech:2019年5月4日<巴菲特股东大会>-6小时20多个亮点50多个问答(划重点) 导读        巴菲特股东大会,即伯克希尔·哈撒韦股东大会,每年于五月 ...

  2. 各类型土地利用图例_划重点!国土空间总体规划——土地利用

    四.土地利用 (一) ​土地利用是否协调匹配 国土空间规划的要素和资源,最终都要落到土地上,土地利用自然成为国土空间规划需要研究的关键问题.所谓土地利用,是指人类通过特定的行为,以土地作为劳动对象或手 ...

  3. 五大要点分析手游美术设计:如何在前5分钟抓住玩家眼球

    当问及高画质是否关系游戏成败时,游戏开发商的回答各异,有的认为画面效果至关重要,而有的则认为画面效果作用不大.但是,数据显示现在一款Facebook游戏开发消费的20%到30%投入在艺术画面效果上.再 ...

  4. python使用redis教程 敲黑板划重点

    WIN7 python使用Redis 目标: 连接池连接redis: redis基本命令: String类型的处理命令 hash类型的处理命令 list类型的处理命令 set类型的处理命令 有序set ...

  5. 给2020划重点:最火的10个关键词和28个书单

    导读:年终岁尾,辞旧迎新,相信这些天你已见过各式各样的总结和盘点.面对这样特殊的一年,每个人关注的重点都有所不同,今天数据叔就以这一年里我们推荐过的书为线索,给2020年划划重点. 2020年,你拔掉 ...

  6. 敲黑板 划重点 网络安全体系的9大知识点都在这里

    敲黑板 划重点 网络安全体系的9大知识点都在这里 首席数字官 2020-09-25 18:21:05 文丨赵博智 编辑丨秦丽 来源丨首席数字官 在新基建浪潮之下,云计算.大数据.物联网.人工智能为代表 ...

  7. outsystems刚做项目时的注意点-划重点

    outsystems的注意点-划重点 菜鸟程序员一个,一直想写博客来锻炼自己的.一直都没开动. 不过最近刚好在名古屋丰田里面做个项目,用了低代码开发软件outsystems.2019年4月开始接触的, ...

  8. JAVA虚拟机(JVM)划重点 第一章 走近Java

    本博客参考<深入理解Java虚拟机>(第二版)一书,提取重点知识,再加以个人的理解编写而成.转载请标明来源. JVM划重点 第一章 走近Java 概述 Java技术体系 展望Java技术的 ...

  9. 两会2023农业划重点 农民丰收节-万祥军:议案提案农业声音

    两会2023农业划重点 农民丰收节-万祥军:议案提案农业声音 新闻中国采编网 中国新闻采编网 中国企业家手机报 中国农民丰收节国际贸易促进会 中国农民丰收节-国稻种芯·中国水稻节 功能性农业农业大健康 ...

最新文章

  1. 深入浅出Service插件化原理
  2. elasticsearch报错expected <block end>, but found BlockMappingStart解决方法
  3. 两种写法的效果一样,那么到底哪一种更好呢?
  4. Error when loading the SDK:
  5. mybatis-逻辑翻页
  6. 面试中的这些坑,你踩过几个?
  7. mysql存储过程语法 if_mysql存储过程语法 if
  8. CentOS7 防火墙关闭
  9. 使用CodeIgniter输入类
  10. C++算法学习(力扣:1003. 检查替换后的词是否有效)
  11. java 设计模式学习笔记四 prototype模式
  12. latex标记html样式,latex标题字体大小和样式
  13. 译文:一个采用 Three.js 的 3D 动画场景制作:飞行者
  14. 陆游书法真迹,堪称书法大家!
  15. learning ddr tRP and tRP tRTP CL tRAS
  16. GNSS说第(七)讲---自适应动态导航定位(七)---抗差估计理论介绍
  17. DOS命令关机小程序
  18. VMware SDS之九: VMware软件定义存储鲜为人知的另一部分
  19. 函数计算机使用说明,SHARP-EL506P 函数计算器的使用说明
  20. XyplayerX4.0 影视解析源码+解析接口+安装步骤

热门文章

  1. HTML5 figure元素
  2. Bootstrap CSS 编码规范之属性声明顺序
  3. Git笔记(29) 搜索
  4. 全连接神经网络_二十九.全连接神经网络原理
  5. php如何处理查询请求,PHP如何处理Web请求流程
  6. powerbi python词云图_Python 练手项目: 抓取豆瓣陈情令评论,并制作词云图
  7. manacher(马拉车)算法详解
  8. windows下常用linux对应工具
  9. mysql5.6-5.7性能调优
  10. Repository(资源库)模式