赞
踩
在数据库国产化替换的过程中,国产数据库在减“O”、替“O”的工作上有很大的挑战,在稳定、性能指标外,兼容度也是客户非常关注的点。
如果应用系统过度依赖Oracle,设计上使用了大量Oracle的内置函数、大量的存储过程,这是替换过程中极其头疼的一件事。
临时表(TEMPORARY TABLE)用来保存中间数据,通常是会话级或事务级,下面看一下国产数据库在临时表上支持的情况。
临时表仅存储了在事务或会话期间存在的数据。临时表中的数据是会话的私有数据,每个会话只能查看和修改自己的数据。
在必须使用到结果缓存的应用系统中,临时表尤为重要。
例如在一个基于Web的航空公司订票系统中,客户可以通过Web应用程序创建多个可选行程。每个行程将由临时表中信息来展示。应用程序对形成的更新修改会直接记录到临时表中,当客户决定最终行程方案后,应用程序会将该行程信息写入到指定的永久表中。
临时表通过“CREATE GLOBAL TEMPORARY TABLE”语句进行创建,ON COMMIT子句指示临时表中的数据是基于事务的(默认)还是基于会话的。
创建临时表默认的选项。临时表中的数据仅对当前事务有效,COMMIT完成后,临时表对应的临时段的内容将会被自动清空(TRUNCATE)。
临时表中的数据仅对当前会话有效,当会话结束后,临时表对应的临时段的内容将会被自动清空(TRUNCATE)。
以上两种策略的选择都不会影响临时表的元数据信息,会一致存储在数据字典中,因此需要对临时表的生命周期做合理配置,避免无用临时表信息存储在数据字典中。
在找到的10家国产数据库资料中,临时表的支持情况统计如下,按照产品首字母进行排序。
首先通过Oracle 11g的实操来具体了解临时表的使用和特点,然后再通过Goldilocks 20c来对比验证。
事务级临时表
- [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
事务级临时表
- [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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。