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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




