on commit delete rows:指定臨時表是事務級的,每次事務提交或回滾之後,表中所有資料都被刪除;
on commit preserve rows:指定臨時表是會話級的,會話結束時才清空表,並釋放臨時 b 樹。
接下來我們來做系列測試
[root@dm1 bin]# ./disql ljb/dameng123@localhost:5237
伺服器[localhost:5237]:處於普通開啟狀態
disql v7.6.0.96-build(2018.09.19-97292)ent
connected to: dm 7.1.6.96
構建基於會話的全域性臨時表
sql> --drop table ljb_tmp_session;
2 create global temporary table ljb_tmp_session on commit preserve rows as select * from dba_objects where 1=2;
操作已執行
sql> select table_name,temporary,duration from user_tables where table_name=『ljb_tmp_session』;
行號 table_name temporary duration
1 ljb_tmp_session y sys$session
構建基於事務的全域性臨時表
sql> --drop table ljb_tmp_transaction;
2 create global temporary table ljb_tmp_transaction on commit delete rows as select * from dba_objects where 1=2;
操作已執行
sql> select table_name, temporary, duration from user_tables where table_name=『ljb_tmp_transaction』;
行號 table_name temporary duration
1 ljb_tmp_transaction y sys$transaction
插入資料
sql>
1 insert all
2 into ljb_tmp_transaction
3 into ljb_tmp_session
4 select * from dba_objects;
影響行數 2810
sql> select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),
2 (select count(*) transaction_cnt from ljb_tmp_transaction);
行號 session_cnt transaction_cnt
1 1405 1405
提交後,基於事務的表沒記錄了,基於session的,還有記錄
sql>
1 commit;
操作已執行
sql> select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),
2 (select count(*) transaction_cnt from ljb_tmp_transaction);
行號 session_cnt transaction_cnt
1 1405 0
退出session後,資料就都沒了
sql> exit
[root@dm1 bin]# ./disql ljb/dameng123@localhost:5237
伺服器[localhost:5237]:處於普通開啟狀態
disql v7.6.0.96-build(2018.09.19-97292)ent
connected to: dm 7.1.6.96
sql> select session_cnt,transaction_cnt from (select count(*) session_cnt from ljb_tmp_session),
2 (select count(*) transaction_cnt from ljb_tmp_transaction);
行號 session_cnt transaction_cnt
1 0 0
sql>
達夢的全域性臨時表和oracle的全域性臨時表基本沒有差異,可以有效的應用在介面程式和臨時數處理的場景。
以下是dm官方文件的描述部分
當處理複雜的查詢或事務時,由於在資料寫入永久表之前需要暫時儲存一些行資訊或需要儲存查詢的中間結果,可能需要一些表來臨時儲存這些資料。 dm 允許建立臨時表來儲存會話甚至事務中的資料。在會話或事務結束時,這些表上的資料將會被自動清除。臨時表中的資料不能像在其它永久表中的資料那樣進行備份,當事務結束或會話斷開時,資料就會被清空。 在臨時表建立過程中,不會像永久表和索引那樣自動分配資料段,而是僅當第一次執行 dml 語句時,才會為臨時表在臨時表空間中分配空間。並且,對於不同的會話,臨時表上的資料是獨享的,不會互相干擾,即會話 a 不能訪問會話 b 臨時表上的資料。對複雜查詢的傳統響應方式之一是使用乙個檢視,使複雜查詢更易於操作。但是,檢視在每次訪問時都需要執行,因而大大降低了效能。而通過 as select 子句建立的臨時表是將複雜查詢的結果通過臨時 b 樹記錄了下來,下次訪問不用重新執行查詢就可以獲得資料,且會話或事務結束後資料將自動刪除,是複雜查詢的乙個優秀的解決方案,且提高了效能。
dm 臨時表支援以下功能:
在臨時表中,會話可以像普通永久表一樣更新、插入和刪除資料;
臨時表的 dml 操作產生較少的 redo 日誌;
臨時表支援建索引,以提高查詢效能;
在乙個會話或事務結束後,資料將自動從臨時表中刪除;
不同使用者可以訪問相同的臨時表,每個使用者只能看到自己的資料;
臨時表的資料量很少,意味著更高效的查詢效率;
臨時表的表結構在資料刪除後仍然存在,便於以後的使用;
臨時表的許可權管理跟普通表一致。
on commit delete rows:指定臨時表是事務級的,每次事務提交或回滾之後,表中所有資料都被刪除;
on commit preserve rows:指定臨時表是會話級的,會話結束時才清空表,並釋放臨時 b 樹。
達夢資料庫知識總結鏈結貼
達夢資料庫臨時表的介紹及使用
什麼是臨時表,使用者做乙個操作查詢出幾百幾千條資料,我們可以把資料放在記憶體中。當有很多 使用者都這樣做,記憶體空間不足,這個時候就需要把資料儲存在磁碟上。dm 臨時表支援以下功能 在臨時表中,會話可以像普通永久表一樣更新 插入和刪除資料 臨時表的 dml 操作產生較少的 redo 日誌 臨時表支援...
達夢資料庫臨時表空間相關知識了解
臨時表空間是用來存放臨時表使用的,如果系統有大量臨時表資料建議把臨時表空間擴大。oracle 可以建立多個臨時表空間,支援手動建立臨時表空間和擴充套件。達夢 建立資料庫的時候建立臨時表空間。不能手動建立,但是可以通過更改dm.ini引數設定臨時表空間大小,產生極少的 redolog日誌。查詢臨時表空...
達夢資料庫外部表
外部表,是指不存在於資料庫中的表。通過向達夢提供描述外部表的元資料,我們可以把乙個作業系統檔案當成乙個唯讀的資料庫表,就像這些資料儲存在乙個普通資料庫表中一樣來進行訪問。外部表是對資料庫表的延伸。建立簡單的達夢外部表的過程 1.假設外部資料在test.txt中 dmdba localhost cat...