在資料庫國產化替換的過程中,國產資料庫在減「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
connected to:
oracle database 11g enterprise edition release 11.2.0.4.0 - 64bit production
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
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
oracle database administrator』s guide - creating a temporary table
oracle臨時表總結
國產資料庫
資料庫臨時表
建立方法 方法一 createtable temptablename 或select 欄位1,欄位2,into temptablename from table 方法二 createtable tempdb mytemptable tidint 說明 1 臨時表其實是放在資料庫tempdb裡的乙個使...
資料庫表(臨時表)
oracle中的段 segment 是占用磁碟上儲存空間的乙個物件。儘管有多種型別,不過最常見的段型別如下 q 聚簇 cluster 這種段型別能儲存表。有兩種型別的聚簇 b 樹聚簇和雜湊聚簇。聚簇通常用於儲存多個表上的相關資料,將其 預聯結 儲存到同乙個資料庫塊上 還可以用於儲存乙個表的相關資訊。...
資料庫建立臨時表
表名前使用乙個 號,臨時表是區域性的,使用兩個 號,臨時表是全域性的,在斷開連線後sql會自動刪除臨時表 create table a id int,name varchar 50 insert into a id,name values 1,123 select from a drop table...