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;

如果您要刪除一個全局臨時表,則需要保證除了當前會話,沒有別的會話正在使用這張表。

具體操作流程如下:
  1. 使用函數polar_gtt_attached_pid查詢對應的全局臨時表正在被哪些會話使用。
  2. 使用函數pg_backend_pid() 確定當前會話的pid。
  3. 使用函數pg_terminate_backend(pid) 剔除掉非當前會話。
  4. 使用函數drop table刪除這個臨時表。