解读数仓中的数据对象及相关关系

news2024/12/24 9:18:40
摘要:为实现不同的功能,GaussDB(DWS)提供了不同的数据对象类型,包括索引、行存表、列存表及其辅助表等。这些数据对象在特定的条件下实现不同的功能,为数据库的快速高效提供了保证,本文对部分数据对象进行介绍。

本文分享自华为云社区《GaussDB(DWS)之数据对象及相互关系总结》,作者:我的橘子呢 。

为实现不同的功能,GaussDB(DWS)提供了不同的数据对象类型,包括索引、行存表、列存表及其辅助表等。这些数据对象在特定的条件下实现不同的功能,为数据库的快速高效提供了保证,本文对部分数据对象进行介绍。

1.索引(index)

索引是关系型数据库中对某一列或者多个列的值进行预排序的数据结构。如果数据库的记录非常多,通过建立索引可以获得非常快的查询速度,当对某一列建立索引之后,通过该列进行相关查询时数据库系统就不必扫描整个表,而是直接通过索引定位到符合条件的记录,在一定程度上能够大幅提升查询得速度。

假如需要执行如下的语句进行查询:

SELECT name FROM test_1 WHERE number =10;

一般情况下数据库需要对每一行进行遍历查询,直到找到所有满足条件number=10的元组信息。当数据库的记录很多,而满足where条件的记录又很少时,顺序扫描的性能就会很差。这时如果在表test_1的number属性上建立索引,用于快速定位需要匹配的元组信息,数据库只需要根据索引的数据结构进行搜索,由于常用的索引结构有B-Tree、Hash、GiSt、GIN等,这些索引结构的查询都是快速高效的,因此可以在少数几步内完成查询,大大提高了查询效率。

对表test_1的number属性建立索引语句如下:

CREATE INDEX numberIndex ON test_1(number);

由于GaussDB里的所有索引都是“从属索引”,索引在物理文件上与原来的表文件分离,执行上述创建索引语句后,系统会生成relname为numberIndex的索引类型。表和索引都是数据库对象,在pg_class里会有该索引的记录,有与之相对应的oid,同时在pg_index表里会记录索引及其对应主表的信息。对应属性信息如图1所示。

图1 pg_index部分属性

2.toast表

toast(The Oversized-Atttibute Storage Techhnique)即超尺寸字段存储技巧,是数据库提供的一种存储大数据的机制。只有一些具有变长表现形式的数据类型才会支持toast,比如TEXT类型。由于在GaussDB(DWS)的行存储方式中,一条数据的所有列组合在一起称之为一个tuple,多个tuple组成一个page。page是数据在文件存储中的基本单位,其大小是固定的且只能在编译器指定,之后无法修改,默认发大小为8KB,当某行数据很大超过page的大小时,数据库系统就会启动toast,对数据进行压缩和切片。实际数据以行外存储的形式存储在另外一张表中,这张表就是toast表。

当一张表的任何一个属性是可以toast的,则这张表会有一张关联的toast表,在pg_class里表的reltoastrelid属性里记录了该toast表的oid,如果没有关联的toast表,reltoastrelid=0。那么如何判断一张表的属性是否是可以toast的呢?我们可以在表的Storage选项中查看对应属性的存储策略。有以下四种不同的存储策略:

  • PLAIN:避免压缩或者行外存储;此外,它禁止为变长类型使用单字节的头。 这只对那些不能TOAST的数据类型的列才有可能。
  • EXTENDED:允许压缩和行外存储。 这是大多数TOAST数据类型的缺省策略。首先会尝试对数据进行压缩, 如果行仍然太大,则进行行外存储。
  • EXTERNAL:允许行外存储,但是不许压缩。 使用EXTERNAL,将使那些数据类型为text和bytea的字段上的子字符串操作更快 (代价是增加了存储空间),因为这些操作是经过优化的:如果行外数据没有压缩,那么它们只会获取需要的部分。
  • MAIN:允许压缩,但不允许行外存储。 实际上,在这样的字段上仍然会进行行外存储, 但只是作为没有办法把数据行变得更小以使之足以放置在一个页面中的最后选择。

假如创建表语句如下:

CREATE TABLE test_t(id int,description text);

创建了一张test_t表,该表有id和description两个属性,分别属于int和text类型,查看该表的属性对应的Storage策略:

图2 test_t表相关信息

我们可以看出description属性的Storage策略为EXTENDED,是可以toast的,系统会为test_t表创建一张关联的toast表。

图3 test_t表对应toast表

通过查询pg_class,可以的看到表test_t关联的toast表的oid为52579,进一步以此oid为条件在pg_class里就会得到toast表的相关信息。

图4 toast表相关信息

下图为test_t表和其对应的toast表之间的关系,以及toast表一些基本属性的介绍。

图5 test_t与其toast表关系图

3.cudesc表

GaussDB(DWS)除了提供行存储方式外,还支持列存储方式。列存储方式在数据压缩、列批量数据的运算、大数据统计分析等场景中有着显著的优势。CU(Compress Unit)压缩单元是列存储的最小单位,每列默认60000行存储在一个CU中,CU生成后数据 固定不可更改。CUDesc本身是一张行存表,它用来辅助记录列存表的cu信息,该表的每一行描述一个CU,包括最大值最小值以及CU在文件中的偏移量和大小,连续多个行中各个不同的列的cu_id相同,可以认为就是把连续多个行截断拿出来,然后再根据不同的列,放到不同的cu中,这些CU所在的行数都是一致的,用一个cu_id表示,但是col_id不一样。同时还增加了一个col_id=-10的列,这个列为VCU,表示这些连续的行中,有哪些行已经是被删除了,用delete_map记录删除信息。如图6所示。

图6 cudesc表示意图

每张列存表都有一张对应的CUDesc表,CUDesc表的oid可以在pg_class中对应列存表元组的relcudescrelid属性中查到,所有CUDesc表默认存储在namespace oid = 100,name为cstore的namespace下。

4.delta表

在列存储方式中,无论是向列存表中插入1条还是60000条数据,都只会生成一个CU,在多次插入少量数据时,不能有效的利用列存压缩能力,导致数据膨胀影响查询的性能和磁盘使用率。CU只支持追加写的方式,也就是说,后面对这个CU中的数据做更新或删除都不会真正更改这个CU,删除是将老数据在字典中标记为作废,更新操作是标记老数据删除后,再写入一条新记录到新CU,原来的CU不会有任何的修改。

从这里我们可以看出,在对列存表进行多次更新/删除,或每次只插入很少量的数据后,会导致列存表空间膨胀,大量空间无法有效利用,这是因为列存表在设计上就是为了大批量数据导入以及海量数据按列存储/查询。Delta表正是为了解决这两个问题。在启用delta表后,单条或者小批量数据导入时,数据将进入delta表中,避免小CU的产生,delta表的增删改查与行存表一致。开启delta表后,将显著提升列存表单条导入的性能。

delta表同样是一张行存表,为了辅助列存表而存在。在创建列存表时系统会为该列存表创建一张对应的delta表,delta表的oid可以在pg_class中对应列存表元组的reldeltarelid属性中查到,所有delta表也默认存储在namespace oid = 100,name为cstore的namespace下。

创建一张列存表col_test,同时设置reloption属性enable_delta=true。在pg_class中查看该表对应的delta表oid。

图7 创建列存表并开启delta表

进一步根据该oid信息可以查到delta表的对应信息。

图8 查询delta表相关信息

可以指定reloption选项设置是否为该列存表开启delta表:

图9 开启/关闭delta表操作

5.分区表

分区表就是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表的定义不难理解,下面我们通过一个例子说明分区表的用法。

创建一张有id和name两个属性的分区表part_test,该表以id的大小进行分区,其中id<10的数据存储在分区location_1,10≤id<20的数据存储在分区location_2,所有id≥20的数据存储在分区location_3。

CREATE TABLE part_test(id int,name text) partition BY range(id) (partition locatition_1 values less than (10),partition locatition_2 values less than (20),partition locatition_3 values less than (maxvalue));

创建好part_test表后,我们所有的增删改查都是直接对part_test表操作的,对用户操作来说part_test表与普通表没有什么区别,但实际的存储方式却是严格按照分区的划分方式进行存储的,数据存储在各个分区上,part_test表作为一张逻辑表不保存数据。我们可以通过pg_partition这张系统表查询到一张分区表的分区信息。

图10 part_test表分区信息

分区表和分区的关系如图所示:

图11 分区表和分区关系图

6.各类表相关对象总结

点击关注,第一时间了解华为云新鲜技术~

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

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

相关文章

深聊性能测试,从入门到放弃之: Windows系统性能监控(一) 性能监视器介绍及使用。

性能监视器介绍及使用1、引言2、性能监视器2.1 打开方式2.2 基本介绍2.3 计数器介绍2.3.1 处理器性能计数器2.3.2 内存性能计数器2.3.3 网络性能计数器2.4 创建及使用2.4.1 用户自定义创建2.4.2 直接添加计数器3、总结1、引言 小屌丝&#xff1a;鱼哥&#xff0c;你有没有监控…

G1D28-hinge loss fuction-RAGA pre总结-DeBERTa-杂七杂八visiomathtypeexcel

一、hinge loss和交叉熵对比 (一 )hinge loss主要思想 让正确分类和错误分类的距离达到λ。λ用于控制两种分类样本之间的距离。 &#xff08;二&#xff09;对比学习 自监督学习的一种&#xff0c;不依赖标注数据进行学习。蛮有意思的&#xff0c;但是今天没时间了&#x…

逻辑学三大定律是什么?

逻辑思维三大定律: 同一律&#xff0c;矛盾律&#xff0c; 排中律。 同一律&#xff1a;A 是 A。 前后思维中&#xff0c;概念要同一。白马非马论违反同一律。商家的买一赠一&#xff0c;前后两个一不是同一个概念。违反同一律。矛盾律&#xff1a;A 是 B&#xff0c; A 不是B,…

【Android App】发送BLE广播及通过主从BLE实现聊天应用讲解及实战(附源码和演示 超详细)

需要源码请点赞关注收藏后评论区留言私信~~~ 一、发送BLE广播 调用蓝牙适配器的getBluetoothLeAdvertiser方法&#xff0c;获得BluetoothLeAdvertiser广播器对象。 广播器的主要方法说明如下&#xff1a; startAdvertising方法表示开始发送BLE广播&#xff0c; stopAdvertis…

springBoot开源MES生产制造执行系统源码带文字搭建教程

源码分享&#xff01;需要源码学习参考可私信。 技术框架&#xff1a;springBoot mybatis-plus shiro hutool layui swagger freemarker mysql8 echarts 运行环境&#xff1a;IntelliJ IDEA 2022 maven nginx 宝塔面板 系统功能 用户管理&#xff1a;用户是系统操…

用VS开发一款“飞机大战“单机游戏<C++>

显示界面如上图所示 自己找的背景和飞机素材,先将素材奉上. 接下来我先简单分析一下这个单机游戏的运行逻辑: 就像显示界面所显示的那样,我们想要实现的是自己的飞机在发射子弹(子弹在上图没显示),然后当子弹射到敌方飞机,这里设置了两种类型的飞机,如果读者想定义更多类型的…

基于51单片机农业大棚温控系统

资料编号&#xff1a;197 大棚种植温控系统概述&#xff1a; 本文介绍的是一个由单片机构成的温度控制系统&#xff0c;主要用来提供测温的解决方案&#xff0c;同时还能实时监控温度变化趋势&#xff0c;以及报警功能。它利用STC89C52RC单片机&#xff0c;DS18B20&#xff0c…

概率图模型:HMM(隐马),MEMM(最大熵),CRF(条件随机场)

1.概率图模型&#xff1a;HMM&#xff08;隐马&#xff09;,MEMM&#xff08;最大熵&#xff09;,CRF&#xff08;条件随机场&#xff09;概率&#xff1a;既然是一个图那么就是一个有圈有边的结构&#xff0c;圈代表随机向量&#xff0c;随机变量之间有边&#xff0c;边上有概…

数字验证学习笔记——UVM学习2 覆盖方法

一、覆盖方法 覆盖机制可以将原来所属的类型替换为另外一个新的类型。 在覆盖之后&#xff0c;原本用来创建原属类型的请求&#xff0c;将由工厂来创建新的替换类型。 无需再修改原始代码&#xff0c;继而保证了原有代码的封装性。新的替换类型必须与被替换类型兼容&#xff…

OpenStack 学习之 OVN : L2网络 ( Logical switches 逻辑交换机)

OVN Manual install & Configuration Open vSwitch 官网 参考 OVN学习&#xff08;一&#xff09; OVN实战一之GNS3操作指南及OVN入门 简单理解和知识 按照 OVN Manual install & Configuration 分别叫做 Controller 节点和 Compute 节点 &#xff0c;其他一般叫做…

Android Studio 打一个正式签名的Apk

如何打一个带正式签名文件的app (给自己的劳动成果冠名) 1. 选择build -> generate signed bundle/apk 2. 这里有两个选择, bundle or apk, 我们选择apk 于是勾选 apk, 并点下一步 3. 来到选择证书文件的地方, 但是我们这是第一次做, 还没有证书文件, 所以选择新建一个证…

【Docker学习系列】Docker学习2-docker设置阿里云镜像加速器

在上一篇中&#xff0c;我们学会了在centos中安装docer。我们知道&#xff0c;镜像都是外网的&#xff0c;镜像一般都是比较大的&#xff0c;因为种种原因&#xff0c;我们知道&#xff0c;从外网下载比较慢的。所以&#xff0c;本文&#xff0c;凯哥就介绍怎么将docker的镜像拉…

keil5打开keil4工程无法编译的情况解决办法!!!!!!

目录 1.情况 1.keil5使用&#xff08;打开&#xff09;keil4文件工程的时候报错 2.解决办法 如果是kei5打开kei4工程文件出现 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 1.情况 1.keil5使用&#xff08;打开&#xff09;keil4文件工程的时候报错 --- Erro…

vscode插件开发

作为一个前端开发相信&#xff0c;大家对于vscode非常熟悉。vscode是微软开源的一款基于 Electron 开发的代码编辑器。并且vscode支持通过插件来扩展编辑器的功能&#xff0c;比如Prettier插件帮助我们快速格式化代码&#xff0c;ES7 React/Redux/React-Native snippets插件帮助…

Kotlin高仿微信-第31篇-支付-服务

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

hadoop集群中存在配置较低的数据节点应用如何应对磁盘数据溢满的问题之rebalance

现象 登录hdfs web ui发现集群中一个节点的负载远高于另外的节点 分析 一般情况下集群在数据盘配置一样&#xff0c;几乎使用不到rebalance&#xff0c;但是我们的集群中有一个比较小的数据节点&#xff0c;因此我们需要关注各节点数据分布情况&#xff0c;及时进行rebalan…

手撕一个图片色卡提取器,可自定义提取色卡数量!

在一些特殊的业务场景中&#xff0c;我们需要一次性提取一张图片中的色卡信息&#xff0c;并且需要使用十六进制的颜色表示方法进行展示。 今天得空做了一个小工具&#xff0c;用来自定义的提取某一张图片中的色卡信息&#xff0c;需要提取某张图片中的色卡可以自行选择。 实现…

Python基础之SQLite数据库

Python与SQLite数据库 一、概述 对于非常简单的应用而言&#xff0c;使用文件作为持久化存储通常就足够了&#xff0c;但是大多数复杂的数据驱动的应用则需要全功能的关系数据库。 SQLite 的目标则是介于两者之间的中小系统。它量级轻、速度快&#xff0c;没有服务器&#xf…

数学辅导微信小程序设计与实现的源码+文档

摘 要 网络的广泛应用给生活带来了十分的便利。所以把数学辅导管理与现在网络相结合&#xff0c;利用java技术建设数学辅导微信小程序&#xff0c;实现数学辅导的信息化。则对于进一步提高数学辅导管理发展&#xff0c;丰富数学辅导管理经验能起到不少的促进作用。 数学辅导微…