一、簡介
PostgreSQL中的臨時表分兩種,一種是會話級臨時表,一種是事務級臨時表。在會話級臨時表中,數據可以存在於整個會話的生命周期中,在事務級臨時表中的數據只能存在於事務的生命周期中。默認創建的是會話級別的臨時表。
1、不管是會話級還是事務級的臨時表,當會話結束后,臨時表會消失,這和Oracle數據庫不同。Oracle數據庫當會話結束后,數據消失,而表依然存在。
2、“ON COMMIT” 子句有三種形式,默認使用的是PRESERVE ROWS,即會話臨時表:
(1)ON COMMIT PRESERVE ROWS 表示臨時表的數據在事務結束后保留,默認值,表示會話級臨時表;
(2)ON COMMIT DELETE ROWS 表示臨時表的數據在事務結束后truncate掉,表示事務級臨時表,事務結束,刪除數據;
(3)ON COMMIT DROP 表示臨時表在事務結束后刪除,表示事務級臨時表,事務結束,刪除臨時表。
3、Oracle中的臨時表,創建后,雖然各個會話間的數據是互相隔離的,也就是一個會話看不到其他會話的數據,但定義是共用的。而Postgresql中的臨時表,創建后,不但不同會話間的數據是相互隔離的,就連臨時表的定義也是不同會話間相互隔離的,也就是一個會話創建的臨時表,不能被其他會話看到。
4、使用pg_basebackup備份時,不會備份TEMPORARY table和 UNLOGGED table。
二、知識點
PostgreSQL臨時表是schema下所生成的一個特殊的表,這個schema的名稱為“pg_temp_n”,其中n代表數字,不同的session數字不同。
一個會話創建的臨時表不能被其他會話訪問。
創建臨時表的關鍵字“temporary”可以縮寫為“temp”。
PostgreSQL為了與其他數據庫創建臨時表的語句保持兼容,還沒有“GLOBAL”和“LOCAL”關鍵字,但兩個關鍵字沒有用處。
三、示例
t開頭的便是臨時表。臨時表會位於一個特殊的schema下面,此例是pg_temp_3
四、總結
-
禁止創建同名的普通表和臨時表,會使現象十分費解
-
autovacuum不會處理臨時表,也就意味着不會去收集統計信息,因此假如有復雜查詢,需要查詢臨時表,需要手動analyze
-
臨時表大量創建銷毀也會導致系統表的膨脹
-
合理配置temp_file_limit,防止過多臨時文件
-
14以前的版本,postmaster啟動后會清理殘留tempfile,但crash時不會移除生成的臨時文件,用於調試目的