返回首页

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

更新日期:2024年09月11日

跨引擎SELECT 允许在一条SELECT 语句中,
使用不同引擎的表进行关联查询、

条件查询等,
其语法遵循GBase8a 引擎的SELECT 语法,
本章仅对引入HIVE 引擎
后,新增的语法,以及由于跨引擎查询而消减的语法进行说明。如下是几个跨引擎
SELECT 的示例。
示例中用到的表及数据:
CREATE TABLE h1(a INT, b INT, c INT) ENGINE='HIVE';
CREATE TABLE t1(a INT, b INT, c INT) ENGINE='EXPRESS';

INSERT INTO h1 VALUES(1, 2, 1), (2, 3, 2), (3, 3, 3);
INSERT INTO t1 VALUES(1, 2, 1), (2, 3, 2), (4, 3, 3);
示例:跨引擎SELECT 示例,跨引擎JOIN:
gbase> SELECT t1.b, h1.c FROM t1, h1 WHERE t1.a = h1.a;
+------+------+
| b | c |
+------+------+
| 3 | 2 |
| 2 | 1 |
+------+------+
2 rows in set
示例:跨引擎SELECT 示例,跨引擎条件:
gbase> SELECT t1.c FROM t1 WHERE t1.a in (SELECT a from h1 WHERE h1.b > 1);
+------+
| c |
+------+
| 1 |

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 780
| 3 |
+------+
2 rows in set

gbase> SELECT h1.c FROM h1 WHERE h1.a in (SELECT a from t1 WHERE t1.b > 1);
+------+
| c |
+------+
| 2 |
| 1 |
+------+
2 rows in set

运行 onspaces 实用程序命令管理您的存储空间。


GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 398 -
元素
用途
关键注意事项
-V
显示软件版本号及序列号
请参阅获取实用程序的版本
信息
-version
显示构件版本、
主机、
操作系统、
编号、
日期及 GLS
版本
请参阅获取实用程序的版本
信息

可使用命名管道(也称为先进先出,FIFO)数据文件,来从非标准设备(如磁带机)装入
和卸载到非标准设备。
与普通的操作系统文件不同,命名管道没有 2 GB 大小限制。操作系统打开并检查命名管
道的文件末尾,其方法与普通文件不同。
使用命名管道装入数据
可使用命名管道从外部表装入数据。
要使用命名管道从外部表装入数据,请执行以下步骤:
1. 在 SQL 中 CREATE EXTERNAL TABLE 语句的 DATAFILES 子句内,
指定命名
管道。
2. 创建在 DATAFILES 子句中指定的命名管道。
使用操作系统命令创建命名管道。
使用带 -p 选项的 mknod UNIX™ 命令创建命名管道。要避免在 UNIX 上出现妨
碍管道打开的问题,请为管道读程序和管道写程序启动单独的 UNIX 进程,或使
用 O_NDELAY 标志集来打开管道。
3. 使用读取命名管道的程序打开命名管道。
4. 执行 SQL 中的 INSERT 语句。
INSERT INTO employee SELECT * FROM emp_ext;
重要: 如果在执行 INSERT 语句之前不创建和打开命名管道,INSERT 将成功执行,但是不
装入任何行。

FIFO 虚拟处理器
数据库服务器使用 FIFO 虚拟处理器 (VP) 来读写命名管道上的外部表。
缺省 FIFO 虚拟处理器数为 1。
数据库服务器为您在 CREATE EXTERNAL TABLE 语句的 DATAFILES 子句中指定的
每个命名管道使用一个 FIFO VP。例如,假设您使用以下 SQL 语句定义外部表:
CREATE EXTERNAL TABLE ext_items
SAMEAS items
USING (
DATAFILES("PIPE:/tmp/pipe1",
"PIPE:/tmp/pipe2",
"PIPE:/tmp/pipe3"
));
如果对 FIFO VP 使用缺省值 1,数据库在读取完 pipe1 中的所有数据之前不会从 pipe2
读取,在读取完 pipe2 中的所有数据之前不会从 pipe3 读取。


GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 264 -
使用命名管道卸载数据
可使用命名管道将数据从数据库卸载到外部表。
要使用命名管道将数据卸载到外部表,请执行以下步骤:
1. 在 SQL 的 CREATE EXTERNAL TABLE 语句或 SELECT INTO EXTERNAL 语
句的 DATAFILES 子句中,指定命名管道。
DATAFILES ("PIPE:/usr/local/TAPE")
2. 创建在 DATAFILES 子句中指定的命名管道。使用操作系统命令创建命名管道。
3. 使用写入命名管道的程序打开命名管道。
4. 将数据卸载到命名管道。
CREATE EXTERNAL TABLE emp_ext
( name CHAR(18) EXTERNAL CHAR(20),
hiredate DATE EXTERNAL CHAR(10),
address VARCHAR(40) EXTERNAL CHAR(40),
empno INTEGER EXTERNAL CHAR(6) )
USING (
FORMAT 'FIXED',
DATAFILES
("PIPE:/usr/local/TAPE")
);

INSERT INTO emp_ext SELECT * FROM employee;
重要: 如果在执行 SELECT 或 INSERT 语句之前不创建和打开命名管道,卸载将失败,并生
成 ENXIO 错误消息(没有这样的设备或地址)。

使用 PIPE 选项将数据从一个实例复制到另一个
可使用命名管道将数据从一个 GBase 8s 实例复制到另一个,而无需将数据写入中间文件。

可使用命名管道将数据从一个 GBase 8s 实例卸载,然后装入另一个实例,而无需将数据
写入中间文件。也可使用命名管道将数据从一个表复制到同一个 GBase 8s 实例上的另一
个表。 在以下示例中,数据将从一个实例上的源表复制到第二个实例上的目标表。
必须首先根据所用硬件平台使用以下命令之一创建命名管道。在本示例中,命名管道称为
pipe1。
% mkfifo /work/pipe1
% mknod /work/pipe1
执行以下步骤,将数据从源实例上的表复制到同一台计算机上目标实例中的表。
1.
在源实例上创建源表。在本示例中,源表称为 source_data_table:
CREATE TABLE source_data_table
(
empid CHAR(5),
empname VARCHAR(40),

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 265 -
empaddr VARCHAR(100)
);
2.
在源实例上创建外部表。在本示例中,外部表称为 ext_table:
CREATE EXTERNAL TABLE ext_table
(
empid CHAR(5),
empname VARCHAR(40),
empaddr VARCHAR(100)
)
USING
(DATAFILES
(
'PIPE:/work/pipe1'
)
);
3.
在目标实例上创建目标表。在本示例中,目标表称为 destin_data_table:
CREATE TABLE destin_data_table
(
empid CHAR(5),
empname VARCHAR(40),
empaddr VARCHAR(100)
);
4.
在目标实例上创建外部表。在本示例中,外部表称为 ext_table:
CREATE EXTERNAL TABLE ext_table
(
empid CHAR(5),
empname VARCHAR(40),
empaddr VARCHAR(100)
)
USING
(DATAFILES
(
'PIPE:/work/pipe1_1'
)
);
5.
从 UNIX™ shell 运行以下命令。该命令将数据从 /work/pipe1 重定向到
/work/pipe1_1
cat /work/pipe1 > /work/pipe1_1
6.
在目标实例上运行以下命令,以将数据从命名管道定向到目标表:
INSERT INTO destin_data_table SELECT * FROM ext_table;

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 266 -
7.
在源实例上运行以下命令,以将数据假脱机到命名管道:
INSERT INTO ext_table SELECT * FROM source_data_table;
可使用多个管道,方法是在 DATAFILES 子句中插入多个 PIPE 语句,并为每个语句
创建一个命名管道。