Redshift为何提供两种临时表创建方式?二者如何选型?
Redshift 两种临时表创建方式的背景与选用建议
在Redshift中创建临时表目前支持两种完全等效的写法:
- 标准关键字写法:在
CREATE TABLE语句中加入TEMPORARY(可简写为TEMP)参数,语法如下:
CREATE TEMPORARY TABLE tbl...
- 特殊前缀写法:直接在表名开头加
#号标识,不需要额外加临时表关键字,语法如下:
CREATE TABLE #tbl...
设计背景
#前缀的写法确实是出于向后兼容的考量做的特殊适配。这个语法最早是SQL Server的专属临时表规则,Redshift上线早期为了降低企业从SQL Server迁移数仓作业的改造成本,专门在引擎层兼容了这个写法,官方只在红色重要提示块里做了功能说明,没有把它作为主推的标准语法。
实际行为差异
目前Redshift对两种写法创建的临时表没有做任何功能区分:二者都是会话级生命周期,会话断开后自动删除,仅对当前创建会话可见,存储逻辑、查询性能、权限规则完全一致,不存在谁优先级更高的区别。
选用建议
- 新开发的SQL逻辑优先使用
TEMPORARY关键字的写法:这是符合ANSI SQL标准的通用语法,跨数据库/数仓引擎的可读性更强,不会让不熟悉Redshift兼容特性的开发者产生困惑,也是官方文档示例默认使用的写法。 #前缀写法只建议在迁移存量SQL Server脚本时临时过渡使用,不要在新业务里主动写:这个属于非标准的兼容语法,后续如果做跨引擎迁移(比如切换到其他数仓产品)会产生额外的改造工作量,也容易和特殊命名的普通表产生识别混淆。
官方重要提示:如果指定的表名以'#'开头,该表将被创建为临时表。
内容的提问来源于stack exchange,提问作者LondonRob
相关产品推荐
相关产品推荐

