暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

OpenGauss/MogDB 临时表

许玉晨 2024-02-29
670

Mogdb支持全局临时表和本地临时表,创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。如果指定GLOBAL关键字,MogDB会创建全局临时表,否则MogDB会创建本地临时表。

  • 全局临时表
    全局临时表的元数据对所有会话可见,会话结束后元数据继续存在。
    全局临时表有两种模式:
    一种是基于会话级别的(ON COMMIT PRESERVE ROWS),当会话结束时自动清空用户数据;
    一种是基于事务级别的(ON COMMIT DELETE ROWS),当执行commit或rollback时自动清空用户数据。
    表时如果没有指定ON COMMIT选项,则缺省为会话级别。

  • 本地临时表
    本地临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。

限制

  • 列存表不支持创建全局临时表
  • Ustore存储引擎不支持全局临时表。

语法

CreateTable ::= CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name ({ column_name data_type [ CHARACTER SET | CHARSET charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table [ like_option [...] ] } [, ... ]) [ AUTO_INCREMENT [ = ] value ] [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ] [ COMMENT =? 'text' ];

示例

会话1

创建临时表

CREATE GLOBAL TEMPORARY TABLE global_temp_table ( id INT, name VARCHAR(50) ) ON COMMIT PRESERVE ROWS; CREATE TEMPORARY TABLE local_temp_table ( id INT, name VARCHAR(50) ) ON COMMIT PRESERVE ROWS;

会话1中查看临时表是否存在

MogDB=# SELECT table_name MogDB-# FROM information_schema.tables MogDB-# WHERE table_name = 'global_temp_table'; table_name ------------------- global_temp_table (1 row) MogDB=# SELECT table_name MogDB-# FROM information_schema.tables MogDB-# WHERE table_name = 'local_temp_table'; table_name ------------------ local_temp_table --存在 (1 row)

全局临时表和本地临时表都存在。

会话2

开启会话2,查询临时表是否存在

MogDB=# SELECT table_name MogDB-# FROM information_schema.tables MogDB-# WHERE table_name = 'global_temp_table'; table_name ------------------- global_temp_table (1 row) MogDB=# SELECT table_name MogDB-# FROM information_schema.tables MogDB-# WHERE table_name = 'local_temp_table'; table_name ------------ (0 rows)

全局临时表存在,本地临时表不存在。

其他注意事项:

  • 本地临时表通过每个会话独立的以pg_temp开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp,pg_toast_temp开头的schema。
  • 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg_temp_开头的schema,则此表会被创建为临时表。
  • ALTER/DROP全局临时表和索引,如果其它会话正在使用它,禁止操作(ALTER INDEX index_name REBUILD除外)。
  • 全局临时表的DDL只会影响当前会话的用户数据和索引。例如truncate、reindex、analyze只对当前会话有效。
  • 全局临时表功能可以通过设置GUC参数max_active_global_temporary_table控制是否启用。如果max_active_global_temporary_table=0,关闭全局临时表功能。
  • 临时表只对当前会话可见,因此不支持与\parallel on并行执行一起使用。
  • 临时表不支持主备切换。
  • 全局临时表不响应自动清理,在长链接场景使用时尽量使用on commit delete rows的全局临时表,或定期手动执行vacuum,否则可能导致clog日志不回收。

参考文档:
https://docs.mogdb.io/zh/mogdb/v5.0/CREATE-TABLE#%E7%A4%BA%E4%BE%8B

最后修改时间:2024-02-29 14:47:34
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论