PolarDB PostgreSQL版(兼容Oracle)支持全局臨時表特性,同時保留PostgreSQL社區版local temporary table的用法。
語法
CREATE GLOBAL TEMPORARY|TEMP TABLE table-name
{ column-definition [ , column-definition ] * }
[ ON COMMIT {DELETE | PRESERVE} ROWS ]
- 支持ON COMMIT DELETE ROWS子句,即當前事務提交后清空臨時表中的數據。
- 支持ON COMMIT PRESERVE ROWS子句,即當前事務提交后保留臨時表中的數據。
- 不支持ON COMMIT DROP子句。
- 如果不指定ON COMMIT子句,則缺省行為和ON COMMIT DELETE ROWS一致。
描述
- 數據庫內所有會話(連接)共享全局臨時表的表定義,當一個會話創建了一個全局臨時表時,其他會話也能使用。
- 全局臨時表的數據在會話間獨立,即會話A寫入到全局臨時表X中的數據對會話B不可見。
- 當一個會話退出時,會清空該會話中全局臨時表中的數據和底層存儲。
- 支持全局臨時表和其他表進行join,也支持在全局臨時表上創建索引(當前版本僅支持創建btree索引)和全局臨時表上的索引掃描。同時,全局臨時表在表上和列上的統計信息也是在會話間獨立的,這是為了讓全局臨時表相關的查詢獲得更優的查詢計劃。
- 全局臨時表支持手動進行vacuum 和analyze,用于清理垃圾數據和收集統計信息。
示例
create global temp table gtt1(a int primary key, b text); # 創建全局臨時表gtt1,缺省on commit delete rows,即當前事務提交時刪除表中所有數據。
create global temporary table gtt2(a int primary key, b text) on commit delete rows; #創建全局臨時表gtt2,指定on commit delete rows,即當前事務提交時刪除表中所有數據。
create global temp table gtt3(a int primary key, b text) on commit PRESERVE rows; #創建全局臨時表gtt3,指定on commit preserve rows,即當前事務提交時保留表中所有數據。
運維
PolarDB提供了一組函數,用于對全局臨時表進行日常的運維工作。
- polar_gtt_attached_pid用于查看一個全局臨時表正在被哪些會話使用。您可以使用該函數結合其他函數進行運維工作。
- polar_gtt_att_statistic用于查看對應一張全局臨時表列上的統計信息。
- polar_gtt_relstats用于查看對應一張全局臨時表的表級統計信息。
這些函數是以插件形式存在的,因此在使用之前,需要創建插件。
create extension polar_gtt;
如果您要刪除一個全局臨時表,則需要保證除了當前會話,沒有別的會話正在使用這張表。
具體操作流程如下:
- 使用函數polar_gtt_attached_pid查詢對應的全局臨時表正在被哪些會話使用。
- 使用函數pg_backend_pid() 確定當前會話的pid。
- 使用函數pg_terminate_backend(pid) 剔除掉非當前會話。
- 使用函數drop table刪除這個臨時表。