Postgresql臨時表(TEMPORARY TABLE)


一、簡介

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時不會移除生成的臨時文件,用於調試目的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM