GBase 8a 用户创建临时表Temporary的内部实现命名规则

GBase 8a支持创建Temporary表,允许不同的session使用相同的临时表名字而不会冲突。这些表在session关闭时会自动销毁。但如果使用了连接池,还是会有冲突,所以还是建议用户自行销毁临时表。或者在使用前删除可能存在的临时表。

临时表语法

create temporary table TABLE_NAME 表定义
create temporary table TABLE_NAME like 另一个表
create temporary table TABLE_NAME as select 。。。

其中TABLE_NAME是临时表名字。

注意,请一定避免和物理表重合,否则虽然看上去名字相同,但临时表的优先级比物理表高,会导致不可预期的结果

样例

临时表是可以正常加载的。

创建普通临时表

gbase> create temporary table tmp_v1 (id int, name varchar(100));
Query OK, 0 rows affected (Elapsed: 00:00:00.26)

gbase> load data infile 'sftp://gbase:gbase1234@10.0.2.201/home/gbase/t1.txt' into table tmp_v1;
Query OK, 0 rows affected (Elapsed: 00:00:13.49)
Task 5111818 finished, Loaded 1000001 records, Skipped 0 records

gbase> show create table tmp_v1;
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                                                        |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tmp_v1 | CREATE TEMPORARY TABLE "tmp_v1" (
  "id" int(11) DEFAULT NULL,
  "name" varchar(100) DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)

使用like创建temporary临时表

gbase> create temporary table tmp_zxq1 like tt;
Query OK, 0 rows affected (Elapsed: 00:00:00.33)

使用create as 创建结果集的temporary表

gbase> create temporary table tmp_zxq2 as select * from t1 limit 10;
Query OK, 10 rows affected (Elapsed: 00:00:00.40)

创建引起混淆的和物理表相同名字的temporary临时表

原始表t1有10001行,创建的t1临时表只有10行。后面t1到底是哪个? 临时表优先,会引起结果集不符合预期。

gbase> create temporary table t1 as select * from t1 limit 10;
Query OK, 10 rows affected (Elapsed: 00:00:00.40)

gbase> show create table t1;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                    |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t1    | CREATE TEMPORARY TABLE "t1" (
  "id" int(11) DEFAULT NULL,
  "name" varchar(100) DEFAULT NULL
) ENGINE=EXPRESS DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)

gbase> select count(*) from t1;
+----------+
| count(*) |
+----------+
|       10 |
+----------+
1 row in set (Elapsed: 00:00:00.01)

数据库内部实现

数据库是在gclusterdb库下面创建如下命名的表,来实现temporary的临时表的,通过nodeid和sessionid 已经创建临时表的递增顺序,避免了临时表的重复现象。

  • gcs是临时表
  • 3372351498 是调度节点的nodeid
  • 24 是连接的session id
  • 0,1,2,3,4,5 是创建的第几个。
gbase> show tables like 'gcs%';
+-----------------------------+
| Tables_in_gclusterdb (gcs%) |
+-----------------------------+
| gcs_3372351498_24_0         |
| gcs_3372351498_24_1         |
| gcs_3372351498_24_3         |
| gcs_3372351498_24_4         |
| gcs_3372351498_24_5         |
+-----------------------------+
5 rows in set (Elapsed: 00:00:00.00)