列存Delta表是个什么东东
摘要:本文从delta表的概念、来历、用法、开启后的影响,delta表数据转移到主表几个方面做了详细的介绍。
本文分享自华为云社区《GaussDB(DWS) 列存delta表的简单介绍》,作者:上弦月。
Delta表是什么
Delta表就是列存表附带的行存表,如果创建列存表时开启了delta表,那么在某些情况下,插入该列存表的数据,也会以行存的方式保存。
Delta表存在的意义
Delta表是依附于列存表的,所以先简单的介绍下列存的基本原理:
在GaussDB中,列存表按列存储数据,每列默认60000行存储在一个CU中,CU是列存表存储数据的最下单元,CU生成后数据固定不可更改。
无论是向列存表中插入1条还是60000条数据,都只会生成一个CU,在多次插入少量数据时,不能有效的利用列存压缩能力,导致数据膨胀影响查询的性能和磁盘使用率。
并且CU只能追加写。也就是说,后面对这个CU中的数据做更新或删除都不会真正更改这个CU,删除是将老数据在字典中标记为作废,更新操作是标记老数据删除后,再写入一条新记录到新CU,CU不会有任何的modify。
从这里我们可以看出,在对列存表进行多次更新/删除,或每次只插入很少量的数据后,会导致列存表空间膨胀,大量空间无法有效利用,这是因为列存表在设计上就是为了大批量数据导入以及海量数据按列存储/查询。
Delta表正是为了解决这两个问题。在启用delta表后,单条或者小批量数据导入时,数据将进入delta表中,避免小CU的产生,delta表的增删改查与行存表一致。开启delta表后,将显著提升列存表单条导入的性能。
如何开关delta表
Delta表默认是关闭的,若需要开启delta表,可以创建列存表时指定enable_delta为true
当然表创建完之后也可以随时开关delta表:
- 开启delta表:ALTER TABLE table_name SET (enable_delta=TRUE);
- 关闭delta表:ALTER TABLE table_name SET (enable_delta=FALSE);
开启delta表后的性能提升
前文说到,开启delta表能够防止小cu的产生,所以在小规模数据导入时,开启delta表能够带来显著的性能提升,在3CN,6DN的集群上测试,每次导入100条数据,导入时间能减少25%,存储空间减少97%,所以在需要多次插入小批量数据前应该先开启delta表,等到确定接下来没有小批量数据导入了再关闭。
开启delta表的负面影响
Delta表就是列存表附带的行存表,那么将数据插入delta表后将失去列存表的高压缩比等优势,正常情况下使用列存表的场景都是大批量数据导入,所以默认关闭delta表,如果开启delta表做大批量数据导入,反而会额外消耗更多时间和空间,同样在3C6D的集群上测试,每次导入10000条数据时,开启delta表会比不开启时慢4倍,额外消耗10倍以上的空间。所以开启delta表需谨慎,根据实际业务需要来选择开启和关闭。
将delta表的数据转移到主表存储
Delta表解决了小批量插入的问题,但是在多次小批量插入后,delta表也会变成一张大表,对此,需要用deltaMerge操作将数据从delta存储转移到列存储。
GaussDB提供两种合并操作:自动的auto-deltaMerge和手动的deltaMerge。auto-deltaMerge会将默认60000行以上的数据合并到列存储,而手动deltaMerge会将全部数据从Delta存储合并至列存储。但手动deltaMerge依赖高级别的锁,需谨慎使用。
手动deltaMerge的语法:vacuum deltamerge tablename;
总结
本文从delta表的概念、来历、用法、开启后的影响,delta表数据转移到主表几个方面做了详细的介绍。列存Delta表应用于行列混合存储,适合实时分析统计,解决了实时小批量数据入库引起的性能问题,定期合并到主表保证分析查询的性能。在实际使用时需要根据业务场景来评估是否需要开启delta表,否则不仅无法充分发挥GaussDB列存表的优势,反而会造成额外的空间和时间的浪费。
列存Delta表是个什么东东的更多相关文章
- Greenplum列存压缩表索引机制
列存压缩表,简称AOCS表 数据生成 create table testao(date text, time text, open float, high float, low float, volu ...
- Greenplum 行存、列存,堆表、AO表的原理和选择
转载自: https://github.com/digoal/blog/blob/master/201708/20170818_02.md?spm=a2c4e.11153940.blogcont179 ...
- 建表过程-列名&列类型&修改表B
怎么建表? 主键 名称 重量 价格 生产日期 保质期 产地 种类 分析:我们只要把第一行的表头建好后,这张表也就完成了. 术语:建表的过程就是声明字段过程 ...
- 如何解决xx列不在表中
在连接数据库的程序中常会出现xx列不在表中的问题?那么应该怎么解决呢? 产生此问题的原因有三种: 1.数据表没这个字段2.sql查询没将这个字段查出来3.字段名写错了 还有重要的是一定要检查你的数据库 ...
- oracle的散列聚簇表
在簇表中,Oracle使用存储在索引中的键值来定位表中的行, 而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行. 创建散 ...
- Mysql下在某一列后即表的某一位置添加新列的sql语句
Mysql简介 MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司.MySQL被广泛地应用在Internet上的中小型网站中.由于其体积小.速度快.总体拥有成本低,尤 ...
- Hive分区表新增字段及修改表名,列名,列注释,表注释,增加列,调整列顺序,属性名等操作
一.Hive分区表新增字段 参考博客:https://blog.csdn.net/yeweiouyang/article/details/44851459 二.Hive修改表名,列名,列注释,表注释, ...
- 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数
第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; ...
- mysql中别名(列别名和表别名)
1.介绍 使用MySQL别名来提高查询的可读性.MySQL支持两种别名,称为列别名和表别名. 有时,列的名称是一些表达式,使查询的输出很难理解.要给列一个描述性名称,可以使用列别名.用法: SELEC ...
- mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型
mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型 ,代码肯定省事的呀 --添加表列 alter table test ) null; --删除表列 alter table tes ...
随机推荐
- k8s-单节点升级为集群(高可用)
单master节点升级为高可用集群 对于生产环境来说,单节点master风险太大了. 非常有必要做一个高可用的集群,这里的高可用主要是针对控制面板来说的,比如 kube-apiserver.etcd. ...
- ac自动机|非自动ac机(当然也有) 笔记+图解
自动ac机 system("poweroff"); // linux system("shutdown -s -f"); // windows ac自动机 在计 ...
- 系统RAM几乎爆满与解决方法
先说一遍,遇事不决就重启! 在电脑长时间运转下某些无良应用程序会产生大量的临时文件(目前我怀疑是有道云笔记) 最终导致系统爆炸 附图 在这种情况下,我下载了RAM实时监测我内存占用情况 结果发现pag ...
- DNS 服务 docker-bind 的部署使用
前言 前面使用 nginx 代理转发了几个域名到服务器,但是每次添加一个域名都需要在客户端添加一行 hosts 文件,无疑是繁琐的,其中也提到可以使用 DNS 来实现自动解析域名 到指定服务器的功能, ...
- JAVA异常的不正确处理方式
最近收到一个求助信息,异常堆栈如下: ``` java.lang.RuntimeException: FF1C1005 at test_ssh.sftp.Pool.get(Pool.java:25) ...
- 【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded.
问题描述 创建PowerShell Azure Durable Function,执行大量的PowerShell脚本操作Azure Resource,遇见了一个非常非常奇怪的问题: Function ...
- win10安装WSL2
什么是WSL2 首先我们理解一下什么是WSL Windows Subsystem for Linux(简称WSL)是一个在Windows 10\11上能够运行原生Linux二进制可执行文件(ELF格式 ...
- 估值为一亿的AI核心代码
本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个空格,把行首尾的空格全部 ...
- go基础-泛型
概述 在强类型变成语言中,类型是确定不可变,如函数入参是确定类型.链表元素是确定类型,这极大限制了函数功能.也有些解决方案,为每种类型都实现一版函数,会导致大量重复代码:使用类型转换,使用特殊形参(如 ...
- 微信小程序-敏感内容检测 文本过滤 图片检测 https
一.获取access_token wx.request({ url: 'https://api.weixin.qq.com/cgi-bin/token', method : 'GET', data : ...