1 引言
在数据库国产化替换的过程中,国产数据库在减“O”、替“O”的工作上有很大的挑战,在稳定、性能指标外,兼容度也是客户非常关注的点。
如果应用系统过度依赖Oracle,设计上使用了大量Oracle的内置函数、大量的存储过程,这是替换过程中极其头疼的一件事。
临时表(TEMPORARY TABLE)用来保存中间数据,通常是会话级或事务级,下面看一下国产数据库在临时表上支持的情况。
2 临时表定义
临时表仅存储了在事务或会话期间存在的数据。临时表中的数据是会话的私有数据,每个会话只能查看和修改自己的数据。
在必须使用到结果缓存的应用系统中,临时表尤为重要。
例如在一个基于Web的航空公司订票系统中,客户可以通过Web应用程序创建多个可选行程。每个行程将由临时表中信息来展示。应用程序对形成的更新修改会直接记录到临时表中,当客户决定最终行程方案后,应用程序会将该行程信息写入到指定的永久表中。
临时表通过“CREATE GLOBAL TEMPORARY TABLE”语句进行创建,ON COMMIT子句指示临时表中的数据是基于事务的(默认)还是基于会话的。
- ON COMMIT DELETE ROWS
创建临时表默认的选项。临时表中的数据仅对当前事务有效,COMMIT完成后,临时表对应的临时段的内容将会被自动清空(TRUNCATE)。
- ON COMMIT PRESERVE ROWS
临时表中的数据仅对当前会话有效,当会话结束后,临时表对应的临时段的内容将会被自动清空(TRUNCATE)。
以上两种策略的选择都不会影响临时表的元数据信息,会一致存储在数据字典中,因此需要对临时表的生命周期做合理配置,避免无用临时表信息存储在数据字典中。
3 国产数据库对临时表的支持
在找到的10家国产数据库资料中,临时表的支持情况统计如下,按照产品首字母进行排序。
4 实操验证
首先通过Oracle 11g的实操来具体了解临时表的使用和特点,然后再通过Goldilocks 20c来对比验证。
4.1 Oracle 11g
事务级临时表
[oracle@tank ~]$ sqlplus tank/tank
SQL*Plus: Release 11.2.0.4.0 Production on Mon Feb 13 08:25:49 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
TANK@tank> CREATE GLOBAL TEMPORARY TABLE T_TMP_TRAN
(
ID INT PRIMARY KEY,
NAME VARCHAR(32)
)
ON COMMIT DELETE ROWS; 2 3 4 5 6
Table created.
TANK@tank> INSERT INTO T_TMP_TRAN VALUES(1,'TABLE T_TMP_TRAN');
1 row created.
TANK@tank> SELECT * FROM T_TMP_TRAN;
ID NAME
---------- --------------------------------
1 TABLE T_TMP_TRAN
TANK@tank> COMMIT;
Commit complete.
TANK@tank> SELECT * FROM T_TMP_TRAN;
no rows selected
TANK@tank>
会话级临时表
TANK@tank> CREATE GLOBAL TEMPORARY TABLE T_TMP_SESS
(
ID INT PRIMARY KEY,
NAME VARCHAR(32)
)
ON COMMIT PRESERVE ROWS; 2 3 4 5 6
Table created.
TANK@tank> INSERT INTO T_TMP_SESS VALUES(1,'T_TMP_SESS');
1 row created.
TANK@tank> SELECT * FROM T_TMP_SESS;
ID NAME
---------- --------------------------------
1 T_TMP_SESS
TANK@tank> COMMIT;
TANK@tank> SELECT * FROM T_TMP_SESS;
ID NAME
---------- --------------------------------
1 T_TMP_SESS
--建立新的会话连接验证
TANK@tank> connect tank/tank
Connected.
TANK@tank> SELECT * FROM T_TMP_SESS;
no rows selected
4.2 Goldilocks 20c
事务级临时表
[sunje@tank ~]$ gsql tank tank
Copyright © 2010 SUNJESOFT Inc. All rights reserved.
Release 20c 20.1.7 revision(31987)
Connected to GOLDILOCKS Database.
gSQL> CREATE GLOBAL TEMPORARY TABLE T_TMP_TRAN
(
ID INT PRIMARY KEY,
NAME VARCHAR(32)
)
ON COMMIT DELETE ROWS; 2 3 4 5 6
Table created.
gSQL> INSERT INTO T_TMP_TRAN VALUES(1,'TABLE T_TMP_TRAN');
1 row created.
gSQL> SELECT * FROM T_TMP_TRAN;
ID NAME
-- ----------------
1 TABLE T_TMP_TRAN
1 row selected.
gSQL> COMMIT;
Commit complete.
gSQL> SELECT * FROM T_TMP_TRAN;
no rows selected.
会话级临时表
gSQL> CREATE GLOBAL TEMPORARY TABLE T_TMP_SESS
(
ID INT PRIMARY KEY,
NAME VARCHAR(32)
)
ON COMMIT PRESERVE ROWS; 2 3 4 5 6
Table created.
gSQL> INSERT INTO T_TMP_SESS VALUES(1,'T_TMP_SESS');
1 row created.
gSQL> SELECT * FROM T_TMP_SESS;
ID NAME
-- ----------
1 T_TMP_SESS
1 row selected.
gSQL> COMMIT;
Commit complete.
gSQL> SELECT * FROM T_TMP_SESS;
ID NAME
-- ----------
1 T_TMP_SESS
1 row selected.
--建立新的会话连接验证
gSQL> connect tank tank
gSQL> SELECT * FROM T_TMP_SESS;
no rows selected.
gSQL>
从临时表的语法和支持级别上来看,Goldilocks 20c和Oracle 11g一致。
参考资料
Oracle Concepts - Temporary Tables
https://docs.oracle.com/cd/E11882_01/server.112/e40540/tablecls.htm#CNCPT1138
Oracle Database Administrator’s Guide - Creating a Temporary Table
https://docs.oracle.com/cd/E11882_01/server.112/e25494/tables.htm#ADMIN11633
ORACLE临时表总结
https://www.cnblogs.com/kerrycode/p/3285936.html