一、SQL语言基础知识
1、SQL语句根据其可实现功能,分为以下几类:
1.1 DDL语句:用来创建数据库以及定义其表结构、视图索引等。
关键词有CREATE、DROP、ALTER、RENAME等
1.2 DML语句:对数据库进行增加,更改,删除操作。
关键词有INSERT、UPDATE、DELETE等
1.3 DQL语句:对数据库进行增加,更改,删除操作。
用来对数据库进行查询操作,关键词SELECT
1.4 DCL语句:用于赋予权限以及回收权限等。
关键词GRANT、REVOKE等
1.5 其他:优化和动态管理数据库资源等。
关键词有SHOW、KILL等
2、标识符命名规则
数据库、表、列和别名等对象的名称都称为标识符。

备注:
- 除了上表中注明的限制,数据库、表和列明不应该以空格结尾;
- 如果标识符是一个限制词或包含特殊字符,必须用反引号 “ 引用它;
- 如果标识符长度超过最大长度限制,数据库、表、列、视图、存储过程的命令将报错,而别名将会截断至256个字符进行显示;
- 当库名、表名、列明为中文时,最大支持的汉字个数:库名48个汉字 | 表名21个汉字;
参数gcluster_extend-identi设置为1,即开启创建中文库名、表名、列明的功能(默认为0,不开启)
二、GBase 8a SQLy语法规范
1、用户变量
用户变量的生命周期是会话级的,对其他会话不可见。当用户退出时,此用户的所有用户变量都会自动释放。
- 用户变量以@开头,不区分大小写:@var_name;
- 通过SET语法来定义并未变量赋值:SET @var_name=expr[,@var_name=expr]…
- 通过SELECT语法查看用户变量的值:SELECT @var_name [,@var_name]…
注:
赋给每一个变量的expr值可以是实数、字符串或NULL。如果用户没有对变量初始化,那么它的值就是NULL.
三、GBase 8a 支持的数据类型
| 数据分类 | 数据类型 |
|---|---|
| 数值型 | INTEFER、TINYINT、SMALLINT、BIGINT、DECIMAL、NUMERIC、FLOAT、DOUBLE |
| 字符型 | CHAR、VARCHAR、TEXT |
| 日期和时间型 | DATE、TIME、DATETIME、TIMESTAMP |
| 二进制类型 | BLOB、LONGBLOB |
1、数值类型
- 有效的使用存储空间,尽量使用精确地类型;
- 严格的数值数据类型(TINYINT,SMALLINT,INT,BIGINT,DECIMAL),以及近似的sh数值数据类型(FLOAT、DOUBLE);
- DECIMAL(M,D),M是总位数(最大65位),D是小数点后的位数,默认是 DECIMAL(10,0);
| 类型名称 | 最小值 | 最大值 | 占用字节数 |
|---|---|---|---|
| TINYINT | -127 | 127 | 1 |
| SMALLINT | -32767 | 32767 | 2 |
| INT(INTEGER) | – | 4 | |
| BIGINT | – | 8 | |
| DECIMAL(M[,D]) | -(1E+M-1) | (1E+M-1)/(1E+D) | 动态计算 |
| FLOAT | -3.4E+38 | 3.4E+38 | 4 |
| DOUBLE | -1.23157E+308 | 1.23157E+308 | 8 |
2、字符类型
- 在实际项目不建议使用char和text类型,建议使用varchar数据类型;
- TEXT类型
不能指定DEFAULT值,仅兼容使用,推荐使用varchar类型;
| 类型名称 | 最大长度(字符) | 说明 |
|---|---|---|
| CAHR | 255 | 定长 |
| VARCAHR | 10922(utf8) 、16388(gbk) | 变长 |
| TEXT | 10922 | 变长 |
3、日期时间类型
- DATE:显示格式 YYY-MM-DD;
- TIME:显示格式 ‘HH:MI:SS’格式(或 HHH:MI:SS 格式);
- DATETIME:以‘YYYY-MM-DD HH:MI:SS.ffffff’ 格式显示,精确到微秒;
- TIMESTAMP:仅为了兼容使用,在实际项目中不建议使用,推荐使用DATETIME;
- 日期格式不同,需类型转换
– INSERT INTO EMP VALUES(7900,‘JAMES’,‘CLERK’,to_date('3-12-1981','dd-mm-yyyy'));
| 类型名称 | 最小值 | 最大值 | 格式 |
|---|---|---|---|
| DATE | 0001-01-01 | 9999-12-31 | YYYY-MM-DD |
| DATETIME | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59 | YYYY-MM-DD HH:MI:SS.ffffff |
| TIME | -838:59:59 | 838:59:59 | HHH:MI:SS |
| TIMESTAMP | 1970-01-01 08:00:01 | 2038-01-01 00:59:59 | YYYY-MM-DD HH:MI:SS |
4、二进制类型
- 创建表时,二进制类型列
不能有DEFAULT值; - 查询语句中,二进制类型列不建议用在过滤条件、group by、join条件中;
- 查询语句中,二进制类型列不支持OLAP函数;
- 二进制类型列不能
创建Hash索引和Hash分布列;
| 类型名称 | 最大长度(字符) |
|---|---|
| BLOB | 32K |
| LONGBLOB | 64M |
5、与其他数据库数据类型对应关系
表中列出的数据类型,当他们出现的时候不需要修改建表SQL语句,GBase 8a可以自动转化为所支持的的数据类型。

四、GBase 8a Cluster DDL –数据库、表管理
1、DDL定义与分布式执行逻辑
- 数据库定义语言,用于定义和管理数据库中的所有对象的SQL语言;
- DDL操作影响数据库对象的元数据信息,一条DDL命令会在所有gcluster管理节点和gnode计算节点执行,所有节点保存元数据信息;
| 对象 | 对象含义 | 支持的DDL操作 |
|---|---|---|
| DATABASE | 数据库 | CREATE、DROP |
| TABLE | 表 | CREATE、ALTER、 DROP、TRUNCATE |
| VIEW | 视图 | CREATE、ALTER、 DROP |
| INDEX | 索引 | CREATE、ALTER、 DROP |
执行逻辑
发起管理节点会将DDL命令下发给gcluster管理节点和gnode计算节点,各节点更新元数据、更新系统表,然后返回结果给发起管理节点。

2、数据库管理
1.1 数据库(database)
- 按照一定的数据结构来组织、存储和管理数据的仓库;
- 数据库含有各种成分,包括表、视图、存储过程、自定义函数、索引等;
- 一个GBase 8a MPP系统中,可以有一个或多个数据库;
- 数据库物理存储是目录,保存在系统参数datadir指定目录下面;
- 数据库目录包括metadata(元数据)和sys_tablespace(默认表空间)子目录;
- gnode节点的sys_tablespace目录下存放具体的列数据文件;

创建数据库:
CREATE DATABASE [IF NOT EXISTS] database_name;
删除数据库:
DROP DATABASE [IF NOT EXISTS] database_name;
指定当前数据库:
USE database_name;
查询现有数据库:
show databases;
查询当前数据库:
select database();
3、表管理
表是关系型数据库中,存储数据的基本架构。表的管理包括创建表、表拷贝、修改表、清空表、删除表等。
在gbase 8a MPP系统中,表对外作为一个整体 内容以表分片在各个节点以列文件形式分布存储。
3.1 表数据有以下性质
- 每一列数据都是同类型的数据;
- 不同列有不同的属性名;
- 列是无序的,左右顺序无关;
- 行的次序可以变换,跟顺序无关;
3.2 数据模型设计

GBase 8a 集群适用的数据模型包括:
- 星型;
- 雪花型;
数据模型设计原则:
- 大表建成分布表,推荐建成hash分布表;
- 小表建成复制表;
- 频繁跟其他表做等值join连接的表(如维度表)建成复制表;
3.3 创建表的语法
创建表:
CREATE [TEMPORARY] TABLE [IF NOT EXITS][database_name.]table_name(column_definition [,column_definition],...) [table_options]
参数说明:
列定义:列名称 数据类型 [NOT NULL | NULL] [DEFAULT default_value] [COMPRESS (数值)] [COMMENT]
表选项:[REPLICATED | DISTRIBUTED BY (‘column_name’)] [COMPRESS (数值型,字符型)] [COMMENT]
- DEFAULT:指定数据列的默认值。默认值必须为一个常数,不能是一个函数或者一个表达式;
- COMMENT:指定数据列或表的备注说明。用法:comment ‘备注信息’。可以使用 SHOW CREATE TABLE table_name 和 SHOW FULL COLUMNS FROM table_name 语句来显示备注信息;
- COMPRESS:指定相关数据类型的压缩方式。数值型:0,1,5;字符型:0,3,5;
– 0:不压缩; 1:对数值型就行深度压缩;2:对字符型进行深度压缩;5:轻度压缩
– 表示压缩组合(0,0)、深度压缩(1,3)、轻度压缩(5,5)
3.4 分布表
- 分布表可以使数据按指定的策略分部存储在不同的主机上,从来实现分布式数据存储和分布式计算,解决大数据存储容量拓展和计算性能拓展的问题。
- 分布策略:采用hash分布、random分布策略存储数据;
默认创建的表是随机分布表,每个节点上只保留部分表数据;- Hash分布表能实现相同数据在同一节点上,实现本地化运算,
推荐大表建成hash分布表;
– 例一 随机分布表:
CREATE TABLE t1(a int, b varchar(10),KEY a_key(a) USING HASH GLOBAL);
– 例二 hash分布表:
CREATE TABLE student(stu_no varchar(10),stu_name varchar(200),stu_sex int) DISTRIBUTED BY ('stu_no')`;
3.5 hash分布数据均匀——分布列选择最重要
3.5.1 选择distributed by列字段的原则:
- 在多表 join 查询时,表中某列经常用于 JOIN 等值关联;
- 表中该列通常是等值查询的列,并且使用频率很高;
- 做 group by 操作时,分组字段;
- 表中重复值较少的列,尽量让数据均匀分布;
3.5.2 被选为distributed by列字段,有如下限制说明:
- 当前只支持
INT、BIGINT、varchar、decimal; - distributed by 列的值,不允许进行
update操作;
3.6 复制表
- 复制表将会存于各个节点上,且表的名字和数据完全一致;
- 需要使用REPLICATED关键字来创建复制表;
- 复制表不用拉表即可实现本地运算,效率高;
- 一般来说,小表(纬度表)可以被创建成复制表;
- 一些表频繁参与JOIN查询表也可以被创建成复制表;
– 举例:
CREATE TABLE t1(a int) `REPLICATED`;
3.7 临时表
使用关键词TEMPORARY,临时表被限制在当前连接中,当连接关闭时,临时表会自动的被删除。临时表可以使随机分布表、hash分布表、复制表中的任意一种类型。
- 举例:
CREATE `TEMPORARY` TABLE t1(a int) ;
注意事项:
- 临时表支持除ALTER之外的所有DDL及DML操作;
- 临时表不能被备份;
- 临时表支持在当前连接中使用查询结果导出语句导出表中数据;
3.8 表结构和表数据复制
create table t2 distributed by('fx') `as select` * from t1; create table t2 replicated `as select` * from t1; create table t2 `as select` * from t1; create table t2 `as select` * from t1 `limit 0`;
create table t2 `like` t1;
3.9 其他表操作语法
重命名表:
RENAME TABLE 原表名 TO 新表名; ALTER TABLE 元表名 RENAME 新表名;
清空表内容:
TRUNCATE TABLE t;
删除表:
DROP TABLE t1;
五、GBase 8a MPP Cluster DDL 视图和索引
1、视图管理
1.1 介绍
- 视图是由SELECT语句组成的查询定义的虚拟表。
- 视图跟表不同,表有实际的储存数据,而视图是虚拟表,本身实际上不存储数据。
- 视图就像一个窗口,引用视图时动态生成,数据来自当前或其他数据库的一个或多个表,或者其他视图。
- 对视图的查询操作跟表相同。
1.2 作用
简单性:简化用户对数据的理解,简化操作,被经常使用的查询可以被定义为视图。
安全性:通过视图用户只能查询他们所能见到的数据。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上。
1.3 限制
禁止对视图进行insert、update和delete操作。
1.4 视图操作语法
- 创建视图:
CREATE [OR REPLACE] VIEW [<视图名> [(<列名1>,<列名2>,...)]] AS SELECT...;
- 修改视图:
ALTER VIEW <视图名> [(<列名1>,<列名2>,...)] AS SELECT...;
- 删除视图:
DROP VIEW [IF EXISTS] <视图名>;
1.5 表和视图查看操作语法
表和视图的查看:
SHOW TABLES [FROM DB_NAME] [LIKE 'pattern']; DESC table_name; SHOW CREATE TABLE [database_name.]table_name; SHOW CREATE VIEW[database_name.]view_name;
示例:
show tables from test like 't%'; --显示以t字母开头的表和视图 desc t1; --查看t1表的字段信息 show create table t1; --查看t1表的建表语句 show create view v_t; --查看v_t视图的创建语句
2 、索引管理
2.1 介绍
- 数据库索引是为了提升查询定位效率而对表字段附加的一种标识,避免全表扫描;
- 索引文件单独存储,GBase 8a 支持三类索引:
– 智能索引:粗粒度,在DC满块时自动创建智能索引,所有列都有,对用户透明,无需用户手动维护。
– hash索引:提升等值查询的性能,需用户根据查询列手动创建,会影响数据入库性能。
– 全文检索:提升文本内容的查询效率,采用全单字索引方式,并且可以保证100%的查询召回率,需要用户手动创建,需特别安装支持全文检索的插件包才能使用全文检索功能。
2.2 hash索引
- hash索引:提高等值精确查询性能
– 默认创建GLOBAL的哈希索引,基于整列数据创建索引;
– 可以基于指定的DC窗口建立分段索引;
– hash索引文件为独立的文件存储; - 创建hash索引的语法有两种形式:
CREATE INDEX index_name ON [vc_name.][database_name.]table_name(column_name) [key_block_size=size_value] USING HASH [GLABOL | key_dc_size=num]; ALTER TABLE [table_name] ADD INDEX index_name(column_name) USING HASH [key_dc_size=num] [key_block_size=size_value]; 2.3 索引操作语法
- 查看INDEX名称:
–SHOW INDEXFROM [database_name.]table_name;
- 删除索引的2种语法:
–DROP INDEX
<索引名>
ON
<表名>
;
–ALTER TABLE[table_name]DROP INDEXindex_name;
表名>
索引名>
- 限制说明
–BLOB、TEXT列不能创建HASH索引;
– 该列数据量较大,但distinct值较少(即重复值较多),也不适合使用HASH索引;
– 创建索引时,只能指定单列,不能指定多列或创建联合索引;
– 创建索引会影响加载性能,需慎用;
六、GBase 8a MPP Cluster DML语句
1、DML定义与分布式执行逻辑
用于更新指定的数据,包括插入、修改和删除操作。
执行过程:
- 发起节点会将DML命令发给gnode计算节点,各计算节点执行DML命令、更新数据,然后返回结果给发起管理节点,DML操作会改变gnode节点的数据;
- 分布表主分片执行成功,然后链式转发同步到备份分片;

2、INSERT
2.1 原理
从DC尾块新增数据,不影响已入库数据。批量入库性能高于单条入库性能。
2.2 插入数据
INSERT语句向表中插入新的行,通常有两种形式:
(1)插入元组的语法:
INSERT [INTO] [database_name.]table_name [(column_name,...)] VALUES ({EXPR | DEFAULT},...),(...),...;
(2)插入查询结果操作语句:
INSERT [INTO] [database_name.]table_name [(column_name,...)] SELECT ...FROM [database_name.]table_name ...;
3、UPDATE
(1)语法格式:
UPDATE [database_name.]table_name `SET` col_name1=expr1[,col_name2=expr2 ...] [WHERE where_definition];
注意:不支持更新distributed by(哈希列)定义列的值。
- UPDATE:默认全列更新,更新条数较少时,性能较差。
- 快速UPDATE模式:
– 快速UPDATE模式,等价于DELETE+INSERT,即先删除符合更新条件的数据,然后再向表的末尾插入需更新的新数据;
– 快速UPDATE模式,用来提高列存储数据更新操作效率问题;
– 更新少量数据时,建议使用快速UPDATE模式;
– 使用SET gbase_fast_update=1;命令打开快速UPDATE模式(默认情况下是关闭的);
4、DELETE
4.1 原理
对删除数据 只标记删除标志,不实际删除数据。
4.2 语法格式
DELETE [FROM] [database_name.]table_name [tbl_alias] [WHERE where_definition];
4.3 空间回收
释放被删除数据文件所占的磁盘空间。
ALTER TABLE [vc_name.][database_name.]tbl_name SHRINK SPACE [FULL] | [FULL BLOCK_REUSE_RATIO=num];
参数说明:
- 文件级回收:
不指定FULL关键字时以文件为单位,只有当这个数据文件涉及的数据都被删除后,才能回收该文件所占用的磁盘空间; - 行级回收:指定
FULL关键字,则按删除的行进行空间回收;有效行的顺序跟回收前保持一致,效率较低; - 块级(DC)回收:指定
FULL BLOCK_REUSE_RATIO=num表示当每个数据包(DataCell)中有效数据占比低于该设置值时,DC进行空间回收。DC重新整合成新的数据文件,无法保证有效行的顺序跟回收前一致。
ALTER TABLE t1 SHRINK SPACE FULL BLOCK_REUSE_RATIO=30;
5、DML语句使用说明
| DML | 原理 | 说明 |
|---|---|---|
| INSERT | 从DC尾块新增数据,不影响已入库的数据;批量入库性能高于单挑入库性能; | 支持标准sql语法及拓展写法; |
| UPDATE | 全列更新;快速更新(delete+insert) ;参数gbase_fast_update控制 | 不支持更新distributed by 定义列的值;不支持多表数据的同时更新,但是可以进行多表关联操作,但是只能更新其中一张表的数据; |
| DELETE | 做删除标记不实际删除数据,使用ALTER TABLE…SHRINK SPACE释放空间 | 不支持多表批量删除,例如:DELETE FROM t1,t2; 支持多表关联删除,但是只能删除其中一张表的数据;例如;DELETE a FROM a,b WHERE a.sid=b.sid; |
七、GBase 8a MPP Cluster DQL语句
1、SELETE语句基础知识
1.1 语法格式:
SELECT [ ALL | DISTINCT ] <列表达式>,... FROM <表名>,... [ WHERE <条件表达式> ] [ GROUP BY <列名>,...[ HAVING <条件表达式> ] ] [ ORDER BY <列名> [ASC | DESC ],...] [ LIMIT { [offset,] row_count | row_count OFFSET offset} ] [ INTO OUTFILE 'file_name' <导出选项> ];
- 查询中用到的关键词主要包含六个,编写顺序依次为:
–select -> from -> where -> group by -> having ->order by
- SQL Select 语句完整执行顺序:
– from子句用于组装来自不同数据源的数据;
– where子句用于根据指定的条件对记录行进行筛选;
– group by子句用于将数据划分为多个分组;
– 使用聚集函数进行计算;
– having子句用于筛选分组;
– order by子句用于对结果集进行排序;
1.2 运算符
| 查询类别 | 运算符 |
|---|---|
| 算数 | +,-,*,/,div,%,mod |
| 比较 | =,>,>=,<,<=,!=,<> |
| 范围 | BETWEEN…AND…,NOT BETWEEN…AND… |
| 集合 | IN,NOT IN |
| 空值判断 | IS NULL,IS NOT NULL |
| 字符匹配 | LIKE,NOT LIKE,REGEXP,RELIKE |
| 逻辑运算 | NOT,!,AND,&&,OR,II,XOR |
2、JOIN表关联语句
- 若一个查询同时涉及两个及以上的表,则需要连接查询;
- 关系数据库的强大处理能力正是源于各种形式的连接查询,能够将不同表的数据按一定条件连接在一起;
- SQL提供的连接查询分为
内连接(inner join)和外连接(outer join)两大类型:
– 内连接将两个表连接在一起的条件称为连接谓词(Join Predicate)或连接条件
– 内连接只返回两个表中与连接谓词匹配的行,不匹配的行不会被输出
– 外连接可以将左表或右表中不匹配的行输出
– 外连接分为左外连接(left outer join)、右外连接(right outer join)和完全外连接(full outer join)



全连接等价于左外连接 UNION右外连接。
注:实际编写SQL中,尽量少用全连接,避免结果集过大导致性能变慢。
2.1 多表连接查询说明
- 多表关联时,基于代价进行优化,内关联跟表书写顺序无关;
- where条件从右往左顺序执行 ,建议把返回结果集小的表条件写到最后;
- 使用explain…在线查询SELETE语句执行计划;
3、UNION集合查询
3.1 应用
如果两个或多个SELECT语句的结构相似,则可以用UNION 或 UNION ALL把这些SELECT语句合并起来
3.2 UNION和UNION ALL的区别
- UNION:对连个结果集进行并集操作,不包括重复行;
- UNION ALL:对两个结果集进行并集操作,包括重复行,不进行排序;
- 如果结果集没重复数据,建议使用UNION ALL代替UNION,性能更好;
4、总结
编写高效SQL语句
- 避免生产环境使用
select *,减少投影列; - 数据量大时,
group by、order by会很费时,建议将hash分布列写在第一个位置; - 使用
where条件提前过滤数据,减少join的运算; - 使用
limit减少物化的结果集条数; - 在做多表查询时应注意字段名称的唯一性;如果不唯一,则要明确表名;
- 内连接比外连接效率高,连接查询所使用的字段最好是hash分布键;
- 注意笛卡尔积问题;
八、GBase 8a MPP Cluster常用系统函数
1、数学函数
round:按位四舍五入(个位为0位,往左为负往右为正,然后对此位四舍五入)

truncate:按位截取(以小数点为界:负数往左截取,正数往右截取)

2、日期时间函数
| 函数 | 功能 |
|---|---|
| NOW,SYSDATE,CURRENT | 当前日期与当前时间 |
| YEAR,MONTH,DAY,WEEKDAY | 取指定表达式中的年、月、日、星期 |
| LAST_DAY | 去月份日期的最后一天 |
| TO_DAYS | 返回日期date对应的天数(从年份0开始的天数) |
| DATE_FORMAT | 依照FORMAT字符串格式化日期值 |
| ADD_MONTHS、PERIOD_DIFF(P1,P2) | 取表达式几个月后的值、月份之差 ;返回值是日期时间类型 |
| DATE_ADD、DATE_SUB、DATEDIFF | 日期加法、减法、日期相差天数 |
注:
(1)建议使用now()函数
- sysdate()f返回的是此函数执行时的时间;
- now()返回的是SQL语句执行时的时间;

3、字符串处理函数
| 函数 | 功能 |
|---|---|
| LOWER,LCASE,UPPER | 转换字符串大小写 |
| REPLACE | 替换字符串中指定的字符串 |
| ASSCII | 取ASSCII值 |
| CONCAT,II | 字符串连接 |
| SUBSTRING,LEFT,RIGHT | 字符串截取 |
| INSTR | 取字符串位置 |
| NVL | 替换NULL值 |
| TRIM,LTRIM,RTRIM | 去除字符串中前后特定字符 |
| LENGTH,CHAR_LENGTH | 取字符串长度 |
注:
- length求字符串长度,其中中文字符每个字符占3个长度;
3.1 CASE用法
(1)格式1:
CASE value WHEN [compare-value] THEN result [ WHEN [compare-value] THEN result...] [ELSE result] END;
(2)格式2:
CASE WHEN [condition] THEN result [ WHEN [condition] THEN result...] [ELSE result] END;
4、数据转换函数
| 函数 | 功能 |
|---|---|
| CAST、CONVERT | 数据类型转换 |
| CONV | 不同数字进制间的转换 |
| TO_NUMBER | 字符串string转化成数值 |
| TO_CHAR | 日期转化为字符串 |
| TO_DATE | 字符串string格式化成format类型的日期 |
5、注意
函数尽量使用在值上,这样函数就会只执行一次,还能利用智能索引。
九、GBase 8a MPP Cluster DCL语句
DCL数据控制语言:是对数据访问权进行控制的指令,他可以控制特定用户对库、表、存储程序、用户自定义函数等数据库对象的控制权。由GRANT和REVOKE两个指令组成。
1、用户USER
用户用于登录数据库,新建用户默认只有登录数据库的权限。
(1)创建用户
create user admin identified by 'admin';
(2)修改用户名
rename user admin to new_user;
(3)修改密码
set passward for new_user=password('newadmin');
(4)删除用户
drop user new_user;
1.1 user支持如下几种方式的书写
- 任何主机:user@’%’
- 主机:user@‘localhost’
- 网段:user@‘192.168.0.0’
- ip地址:user@‘192.168.10.6’
- 不写主机与user@’%’等价:user
2、用户组 ROLE
(1)ROLE:
- 角色相当于用户组,把有相同权限的用户组成一个组,用于批量授权;
- 用户只需要修改组的权限,该组下所有用户的权限都将发生改变,便于对拥有相同权限用户进行管理;
(2)具体SQL语句:
- 创建用户组Role:
create role role1,role2;
- 删除用户组Role:
drop role role1;
3、权限管理——GRANT、REVOKE
- 为用户赋权:
grant select on db1.t1 to user1;
- 收回用户权限:
revoke select on db1.t1 to user1;
- 为用户组Role赋权:
grant all on db2.* to role1;
- 回收用户组Role权限
recoke all on db2.* to role1;
- 将用户组Role权限赋予用户:
grant role1 to user1 [with admin option]
- 向用户回收用户组Role权限:
revoke role1 from user1
3.1 特别说明
ALL是一个特殊权限,它是把GRANT OPTION之外的所有权限赋予指定用户。- 加载或导出数据需要FILE权限,权限需单独设置:
grant FILE on *.* to role1;
- 为用户赋予优先级权限:
grant usage on *.* to user_name with task_priority priority_value;
注:priority_value的取值范围为0~3。数字越大优先级越高,缺省为0。
- 查看用户或用户组权限:
show grants for user/role;
- 查看用户和组的关联信息:
select * from gbase.role_edges;
4、多VC下用户操作VC
- 多VC的虚拟集群环境下,用户和用户组是全局统一的。
- 为用户设置默认VC:
– 给用户设置DEFAULT_VC权限后,用户连接集群时就默认登录到该VC;
– 建议给每个用户都设置默认VC;
– 设置默认DEFAULT_VC的命令;
set default_vc for user = vc_name; - 切换当前VC语法:
use vc vc_name; 设置root用户的默认VC:
5、多VC下用户权限管理
(1)把访问多VC下的库/表/列…授权给USER。
授权方式如下:
GRANT ALL ON *.* TO USER1; GRANT ALL ON VC2.DB.* TO USER1; GRANT ALL ON VC2.DB.TABLE TO USER1;
REVOKE ALL ON *.* TO USER1; REVOKE ALL ON VC2.DB.* TO USER1; REVOKE ALL ON VC2.DB.TABLE TO USER1;
十、GBase 8a MPP Cluster DCL系统表
1、4个系统库
- 系统库在每个gcluster节点、gnode节点上都存在;
- 系统库里的系统表所查询到的信息大多是本地信息;
– Information_schema
– performance_schema
– gbase
– gclusterdb
(1) Information_schema库:
库内表为系统视图(MEMORY引擎表,只读),在查询时通过检索扫描相关文件获取集群的元数据信息,如库或表的名称、列的数据类型、访问权限、数据加载结果及状态信息、资源信息等;

(2)performance_schema库:
与Information_schema库相似,库内表为系统视图,区别在于performance_schema用于监控数据库本地运行时的信息,包括运行状态信息、磁盘、内存使用情况等;

(3)gbase库:
gbase库内的系统表为GsSYS引擎表,存储用户及权限、审计日志、函数/存储过程、UDF及引擎插件等信息;

(4)gclusterdb库:
gclusterdb库的系统表为express引擎表,主要为dual、数据重分布、kaflka-consumer流数据处理、temporary临时表对应的物理映射表等系统表(部分系统表在使用相关功能时才生成);

2、查询系统信息方法
- 查询VC虚拟集群
select * from information_schema.vc; -- 或者 show vcs;
- 查询数据库
select schema_name as `Database` from information_schema.schemata; -- 或者 show databases;
- 查询某个库所有表和视图
select table_name,table_type from information_schema.tables where table_schema='test'; -- 或者 show tables from test like 't%';
- 查询某个表中的列
select column_name,data_type,is_nullable,column_default from information_schema.columns where table_name='sales' and table_schema='test'; -- 或者 show columns from test.t;
- 查询存储过程和自定义函数
select routine_schema,routine_name,routine_type from information_schema.routines; -- 或者 show create procedure p_demo; //查看创建存储过程的语句
- 查询索引信息
select table_name,index_name,seq_in_index,column_name,index_type from information_schema.statistics where table_schema='test'; -- 或者 show index from test.t;
- 查询当前节点gcluster层磁盘空间使用信息
select * from performance_schema.disk_usage_info;
- 查询集群某节点的gcluster层和gnode层磁盘信息空间使用情况
select * from performance_schema.cluster_disk_usage_info where host='vm1';

(3)用户、用户组
gbase系统库示例:
- 查询数据库中的用户
select user from gbase.user;
- 查询数据库中的用户与用户组role的关联关系
select * from gbase.role_edges \G;
- 如何查看哪些表是复制表,哪些是hash分布表,分布键是哪列?
select dbname,tbname,isreplicate,hash_column from gbase.table_distribution where dbname='库名' and tbname like '表名'; show create table '表名';
- 如何判断分布表数据有没有倾斜?
select * from information_schema.cluster_table_segments where table_schema='库名' and table_name='表名';
cluster_table_segments:记录每个分片的数据占用磁盘空间信息

- 如何查询表的总条数
select count(*) from '表名'; select table_schema,table_name,table_rows/2,storage_size/2 from performance_schema.tables where table_schema='库名' and table_name='表名';
table_rows:为表所有分片的条数的和,当表分片有一个副本时,是表条数的2倍;当表分片有两个副本时,是表条数的3倍。

- 显示8a集群的系统变量值:
select * from information_schema.global_variables where variable_name like 'pattern'; show variables [ like 'pattern'];
- 设置系统变量值
set [global | session] <variablename> = value;
- 查询8a集群的默认压缩模式信息:
show global variables like '%compress%'; select * from information_schema.global_variables where variable_name like '%compress%';
(4)运行线程查询和管理
- 终止正在运行的线程(SQL语句):
kill [connection | query] thread_id;
- 暂停正在运行的线程:
pause thread_id;
- 继续已暂停的线程:
continue thread_id;
(6)当前系统信息等
- 使用系统函数,查看当前系统信息:
version(); --返回当前8a系统版本 vc(); --返回当前vc名字 database(); --返回当前数据库名字 user(); --返回当前用户名 charset(str); --返回字符串参数使用的字符集
- 使用use切换当前VC/数据库
use vc vc1; use test;
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216761.html原文链接:https://javaforall.net
