#对象
本文档将对本产品中所包含的各类数据库对象进行说明。
# 表(Table)
表是数据库用来存放数据的一个集合,一般与实体对象一一对应,如人员表、部门表、公司表等。
一般按行(Row)和列(Column)这两个二维信息来组织表数据,如一张人员表可以按如下行列来组织信息:
姓名 | 性别 | 年龄 | 电话 | ... | |
---|---|---|---|---|---|
1 | 张三 | 男 | 20 | 130**** | ... |
2 | 李四 | 男 | 30 | 131**** | ... |
3 | ... | ... | ... | ... | ... |
其中姓名、性别、年龄、电话等为表的列字段,所有列字段的每一个值组合称为表的一条行记录。
以上为表的逻辑结构描述,从物理结构上看,YashanDB中所定义的表可为如下几类:
- HEAP Table:行存表,采用段页式结构,数据按行组织,无序存储,插入和更新快捷,并结合有序的索引实现对表数据的快速查询,保证数据库为在线交易业务服务。
- TAC Table(Transaction Analytics Columnar Table):列存表,采用段页式结构,数据按列组织,实时数据区和索引技术保障了快速的数据更新及查询,主打实时分析场景。
- LSC Table(Large-scale Storage Columnar Table):列存表,通过列存结构组织数据,支持冷热数据分离,高压缩比的对象存储,通过数据排序,稀疏索引,下推过滤等技术实现海量数据的高性能查询,同时支持数据写入实时数据区提升事务性能,支持实时数据区与稳态数据区的静默转换和融合查询,主打海量稳态数据的交互式分析场景。
# 索引(Index)
索引是一种物理的对数据库表中一列或多列的值进行排序的存储结构,它是某个表中一列或若干列值的集合,是指向表中物理标识这些值所在行的逻辑指针清单。
索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引的特点:
- 索引本身有序:可以让ORDER BY语句消除排序。
- 索引存储索引列值和ROWID:可以让联合索引消减索引回表。
- 索引树的高度较低:可以让IO尽量减少。
按不同场景,YashanDB实现了如下类型的索引:
# B+tree索引
B+tree索引:索引按B树结构来组织存储数据,最常用的索引。
# 函数索引
函数索引:基于表达式创建的索引。
# 列式索引
列式索引:索引按列存结构来组织存储数据。
# 全局索引和本地索引
全局索引:建立在整张表上的索引。
本地索引:分区索引,建立在表的每个分区上,索引分区键与表的分区键相同。
# 唯一索引和普通索引
唯一索引:索引列值不重复的索引,主键上索引必须为唯一索引。
普通索引:索引列值可以有重复值,如在创建索引时未指定UNIQUE关键字,即使列值不重复,创建的索引仍为普通索引。
# 单列索引和组合索引
单列索引:在表的一个列上创建的一个索引。
组合索引:在表的多个列上创建的一个索引。YashanDB中组合索引的使用规则如下(例如在a、b、c字段上创建了组合索引):
- WHERE语句中,按照a、b、c的顺序书写FILTER条件时,才能使用这个组合索引
- 如字段a上没有建立索引,WHERE语句中只有FILTER a条件时,可以使用这个组合索引
- 如字段a和b上没有建立组合索引,WHERE语句中有FILTER a AND FILTER b条件时,可以使用这个组合索引
- 如存在上述索引,优化器默认选择索引的优先级为:字段a上的索引>字段a和b上的组合索引>字段a、b、c上的组合索引。
# 自动创建索引和手动创建索引
自动创建索引:在表的列(组合)上创建PRIMARY KEY|UNIQUE约束项时,如该列(组合)上没有索引,YashanDB将为其自动创建唯一索引。
手动创建索引:依据表的业务特点和性能需要,使用CREATE INDEX语句手动创建索引。
# 访问约束(Access Constraint)
访问约束简称AC,是YashanDB基于有界计算理论而实现的用于查询加速的一种数据模型,通过在数据源上建立AC,实现大数据变小的模型变换,且通过预计算手段,对于只需要访问部分数据的查询,提前重组织数据,快速精确的定位所需数据,从而实现查询加速。
YashanDB将AC定义为{X->Y,N}
,其中N是界,X->Y是数据的访问模式。基于已知的X的值/范围,可以精确定位并获取其关联的Y值和个数,只需访问少数据流即可完成对海量数据的查询。
建立AC的实现原理为,系统根据模型定义对指定列的重复数据进行压缩去重。YashanDB支持在建立AC时按指定条件过滤原表的数据,且支持对指定的列执行聚集函数。
# 视图(View)
视图看上去非常象数据库的物理表,但是它并不占用物理空间,它的数据来源于一个或多个实际表中。对视图的使用,实际上是执行在定义视图时使用的SQL。
所以,视图并不具备物理表所拥有的存储属性,包括分区。
视图的作用:
- 将一张或多张物理表的一列或多列数据联合起来展现在用户面前,以便符合用户的使用习惯。
- 隐藏多表连接时数据的逻辑复杂性,和表之间的约束关系,对用户提供简单查询。
- 固化常用的子查询,如某个表经常需要进行分组统计后,再和其他表连接查询,则可以将分组统计这个子查询固化到一个视图中。
- 安全性,视图结合权限控制,可以让不同的用户访问到同一张物理表的不同列数据,或不同行数据。
# 序列(Sequence)
序列是一个序列号生成器,它可以自动产生一组等间隔的唯一整数数值。序列一般应用于自增列上,例如需要自动生成ID的主键字段。
序列是一个共享对象,多个用户共享同一组序列号。这样的好处是,当多用户要对同一张表的同一个字段插入数据时,序列免除了用户对其他用户的行为判断,自动为每个用户生成了不冲突的值。
# 同义词(Synonym)
同义词是某个数据库对象的一个别名,不占用物理空间。使用时被直接翻译成其指向的数据库对象的名字。
所以,同义词可以与其指向的数据库对象一样的方式使用,例如一个指向分区表对象的同义词,可以对其进行指定分区的查询,但对于定义在这张分区表的视图,则不可以进行指定分区的查询。
同义词的作用:
- 多用户协同开发中,屏蔽对象的名称及其属主。
- 简化对象名称。
- 为分布式数据库的远程对象提供位置透明性。
# 分区(Partition)
分区是依据特定逻辑将数据分类存储的物理表存储属性。
分区并没有将数据存储至新表中,而是将具有相同特征的数据分类存储至表中。使用时可以通过指定分区的方式直接获取具有相同特征的数据,从而减少系统的吞吐量。
分区的作用:
- 减少无效数据的访问,提高大规模数据下访问、操作性能。
- 便捷化数据管理操作。
按不同划分规则,YashanDB具有如下类型的分区:
# 范围分区
范围分区:根据分区键对数据进行范围划分,同属于一个范围内的数据存储在同一分区,分区之间具有单调递增性。
# 列表分区
列表分区:根据分区键和特征值将数据进行分类,命中特征值的数据存储在同一分区。
# 哈希分区
哈希分区:根据分区键进行哈希值计算,从而判断数据存储的分区。
# 存储过程(Procedure)
存储过程是一组完成特定功能的SQL语句集,创建一个存储过程时将其预先编译好并存储在数据库中,调用时向其传递参数后可直接执行。
存储过程作为独立的PL/SQL语句执行,不能在SQL语句中调用。
存储过程的作用:
提高数据库执行速度,存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般的SQL语句每执行一次就编译一次。
封装复杂的操作,对用户提供简单接口。
可以重复使用,免除经常书写同一语句。
安全性,可以将特殊操作封装起来,只对有权限的用户开放。
# 函数(Function)
函数是与存储过程类似的数据库对象,区别在于函数必须定义返回值,且只能作为表达式使用。
YashanDB支持如下两类函数:
内置函数
由YashanDB创建,可直接被用户使用的函数,详见内置函数。
自定义函数
与存储过程相同的创建方式,由用户自己定义的函数。
# 高级包(Package)
高级包是一系列存储过程、函数及变量的组合,类似于应用程序中的类,将对象封装并提供接口供调用。
YashanDB提供了内置高级包,封装系统功能提供给用户调用,详见PLSQL参考手册内置高级包。
自定义高级包是由用户自己定义的高级包,以满足业务开发需要。
# 定时任务(JOB)
定时任务通过预定义好的程序块、时间及频率等要素,让系统可以按计划自动执行用户需要的业务操作。
# 触发器(Trigger)
触发器类似于约束,当其能实现比约束更丰富复杂的逻辑处理,在表的数据被改变时自动触发程序块,实现数据检查、操作记录或业务处理等功能要求。