全部產品
Search
文件中心

PolarDB:使用全域暫存資料表

更新時間:Jul 06, 2024

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刪除這個暫存資料表。