10家國產資料庫臨時表的支援統計

2021-10-10 11:37:28 字數 4391 閱讀 9089

在資料庫國產化替換的過程中,國產資料庫在減「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...