返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

CREATE TABLE...LIKE...
功能说明
复制table_name2 的表结构来创建表table_name1。
语法格式
CREATE TABLE [vc_name.][db_name.]table_name1 LIKE table_name2;
示例

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
952
示例1:创建随机分布表。
gbase> DROP TABLE IF EXISTS t5;
Query OK, 0 rows affected
gbase> CREATE TABLE t5(a int,b datetime);
Query OK, 0 rows affected
gbase> INSERT INTO t5 VALUES(1,NOW());
Query OK, 1 row affected
gbase> CREATE TABLE t6 LIKE t5;
Query OK, 0 rows affected
gbase> SHOW CREATE TABLE t6;
+-------+---------------------------------------------------------+
| Table | Create Table
|
+-------+---------------------------------------------------------+
| t6
| CREATE TABLE "t6" (
"a" int(11) DEFAULT NULL,
"b" datetime DEFAULT NULL
)
ENGINE=EXPRESS
DEFAULT
CHARSET=utf8
TABLESPACE='sys_tablespace' |
+-------+---------------------------------------------------------+
1 row in set
gbase> SELECT * FROM t6;
Empty set

集群接口驱动提供负载均衡
集群接口驱动可以有效实现对上层应用请求的负载进行均衡。
应用层发送请求给相
应节点,节点完成SQL 解析并生成执行计划,协调集群相关节点并发参与计算和
处理,提高了整个集群的并发度,充分发挥了集群性能。
多租户资源管理
GBase 8a MPP Cluster 可以通过虚拟集群技术实现租户间的物理或者逻辑资源的
隔离。

GBase 8a MPP Cluster 下每个节点内的资源管理
GBase 8a MPP Cluster 下每个节点可以对自身内部的CPU、内存、磁盘空间
和I/O 资源进行配置和管理,
其中CPU 可以实现对受控SQL 使用CPU 优先级
和百分比控制,以及SQL 并发数及并行度的管理;内存可以实现对受控SQL
算子buffer 使用上限的控制;I/O 可以实现对受控SQL 磁盘读写速率上限的控
制;以及对磁盘空间使用的管控。

GBase 8a MPP Cluster 虚拟集群的整体资源管控
在虚拟集群内,
通过资源管理和资源组实现了不同应用和用户的资源配额及查
询优先级的灵活配置,同时在完善的权限授权管理机制下,使得不同的应用和
任务可以同时运行在一个集群中,又相互隔离。
在线扩容
GBase 8a MPP Cluster 支持集群数据节点的在线扩容和在线缩容,执行效率更高,
对业务的影响更小。GBase 8a MPP Cluster 能够通过增加data 节点,对系统的计
算和存储能力进行扩容,并且可以灵活的对扩展过程中的状态进行管理与控制,支
持暂停、恢复、取消等等;系统支持在线扩容,扩容后性能近似线性提升,无需中
断当前系统的运行,且支持一次扩展多个节点;可支持实例级、库级和表级等多级
别的扩展方式。
GBase 8a MPP Cluster 具备在线扩容能力:

在线动态扩展集群节点;

在线动态扩展数据节点;

执行调度节点和数据计算节点可以按需独立扩展。

GBase 8a MPP Cluster 产品手册
2 产品概述
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
31

如果您想要将集合中的所有元素更新为相同的值,或如果该集合仅包含一个值,则您无需
使用游标。下图中的语句展示你可如何将集合检索至集合变量内,然后使用一个语句来更
新它。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 310 -
图: 检索并更新集合。
DEFINE s SET (INTEGER NOT NULL);

SELECT numbers INTO s FROM orders
WHERE order_num = 10;

UPDATE TABLE(s)(x) SET x = 0;

UPDATE orders SET numbers = s
WHERE order_num = 10;
此示例中的第一个 UPDATE 语句随同集合派生的表 s 使用名为 x 的派生的列,并将
值 0 赋给集合中的所有元素。第二个 UPDATE 语句在数据库中存储新的集合。

更新 row 类型的集合
要更新 ROW 类型的集合,您可采用这些步骤:
1.
声明集合变量,其字段数据类型与该集合中的那些 ROW 类型相匹配。
2.
将集合变量的个别字段设置为 ROW 类型的正确数据值。
3.
对于每一 ROW 类型,请使用集合变量更新集合派生的表的全部行。
图 2 中的 manager 表有一名为 projects 的列,包含在下图展示其定义的 ROW 类型的
LIST。
图: ROW 类型的 LIST 定义。
projects LIST( ROW( pro_name VARCHAR(15),
pro_members SET(VARCHAR(20) NOT NULL) ) NOT NULL)
要访问 LIST 中的 ROW 类型,请声明游标,并将该 LIST 选择至集合变量内。然而,在
您检索 projects 列中每一 ROW 类型值之后,您不可个别地更
新 pro_name 或 pro_members 字段。相反,对于需要在集合中更新的每一 ROW 值,您必
须将整个 ROW 替换为来自包括新字段值的集合变量的值,如下图所示。
图: 访问 LIST 中的 ROW 类型。
CREATE PROCEDURE update_pro( mgr VARCHAR(30),
pro VARCHAR(15) )

DEFINE p LIST(ROW(a VARCHAR(15), b SET(VARCHAR(20)
NOT NULL) ) NOT NULL);
DEFINE r ROW(p_name VARCHAR(15), p_member SET(VARCHAR(20)
NOT NULL) );

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 311 -
LET r = ROW("project", "SET{'member'}");

SELECT projects INTO p FROM manager
WHERE mgr_name = mgr;

FOREACH cursor1 FOR
SELECT * INTO r FROM TABLE(p)
IF (r.p_name == 'Zephyr') THEN
LET r.p_name = pro;
UPDATE TABLE(p)(x) SET x = r
WHERE CURRENT OF cursor1;
EXIT FOREACH;
END IF;
END FOREACH

UPDATE manager SET projects = p
WHERE mgr_name = mgr;

END PROCEDURE;
在您可在 SPL 程序中使用 row 类型变量之前,
您必须使用 LSET 语句或 SELECT INTO
语句来初始化该行变量。前图的 FOREACH 循环中嵌套的 UPDATE 语句将 row 类型
的 pro_name 字段设置为变量 pro 中提供的值。
提示: 要更新 ROW 类型的 pro_members 字段中 SET 中的值,请声明游标,并使用带有派生
的列的 UPDATE 语句,如 更新集合元素 说明的那样。

更新嵌套的集合
如果您想要更新集合的集合,则必须声明游标来访问外层的集合,然后声明嵌套的游标来
访问内层的集合。
例如,
假设 manager 表有一附加的列 scores,
它包含一其元素类型为整数的 MULTISET 的
LIST,如下图所示。
图: 更新集合的集合。
scores LIST(MULTISET(INT NOT NULL) NOT NULL);
要更新 MULTISET 中的值,请声明在 LIST 中每一值间移动的游标,以及在 MULTISET
中 每一值间移动的嵌套的游标,如下图所示。
图: 更新 MULTISET 中的值。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 312 -
CREATE FUNCTION check_scores ( mgr VARCHAR(30) )
SPECIFIC NAME nested;
RETURNING INT;

DEFINE l LIST( MULTISET( INT NOT NULL ) NOT NULL );
DEFINE m MULTISET( INT NOT NULL );
DEFINE n INT;
DEFINE c INT;

SELECT scores INTO l FROM manager
WHERE mgr_name = mgr;

FOREACH list_cursor FOR
SELECT * FROM TABLE(l) INTO m;

FOREACH set_cursor FOR
SELECT * FROM TABLE(m) INTO n;
IF (n == 0) THEN
DELETE FROM TABLE(m)
WHERE CURRENT OF set_cursor;
ENDIF;
END FOREACH;
LET c = CARDINALITY(m);
RETURN c WITH RESUME;
END FOREACH

END FUNCTION
WITH LISTING IN '/tmp/nested.out';
该 SPL 函数将 scores 列中的每一 MULTISET 选择至 l 内,然后将 MULTISET 中的每一
值选择至 m 内。如果 m 中的值为 0,则函数从 MULTISET 删除它。在删除 0 的值之后,
该函数统计每一 MULTISET 中剩余的元素数,并返回一整数。
提示: 由于此函数为 LIST 中每一 MULTISET 返回一值,因此,当您执行该函数时,您必须
使用游标来括起 EXECUTE FUNCTION 语句。