SQL Server临时表生命周期由类型和会话状态决定:本地临时表(#)仅当前会话可见,会话断开时自动删除;全局临时表(##)在最后一个引用会话断开后清理;均存于tempdb且支持手动DROP。

SQL中的临时表生命周期取决于其类型(本地或全局)和会话状态,不是由用户显式销毁,而是由数据库引擎按规则自动清理。
本地临时表(以 # 开头)的生命周期
本地临时表只对当前会话可见,其存在周期严格绑定于该连接的生命周期:
- 创建后立即生效,仅当前会话可访问;
- 会话正常断开(如客户端关闭、显式执行 DISCONNECT 或连接超时)时,数据库自动删除该表及所有数据;
- 若在存储过程中创建,过程执行结束并不会自动删除——只要会话未断开,表依然存在;
- 可手动用 DROP TABLE #table_name 提前释放,但非必需。
全局临时表(以 ## 开头)的生命周期
全局临时表对所有会话可见,但其存活依赖于“最后一个引用它的会话”:
- 创建后,任何会话均可查询或修改(需权限);
- 当创建它的会话结束时,表不会立刻消失;
- 只有当最后一个持有该表引用(例如正在执行含该表的查询、游标未关闭、或有未提交的事务涉及该表)的会话断开后,系统才清理;
- 同样支持手动 DROP TABLE ##table_name,且执行后立即失效,其他会话再访问会报错。
临时表的物理存储与资源释放
临时表数据通常存于 tempdb 系统数据库中,其资源管理是隐式的:
- 表结构和数据页在 tempdb 中分配,不写入用户数据库日志;
- 即使会话异常中断(如网络断连、客户端崩溃),SQL Server 也会在检测到会话死亡后尽快回收对应 tempdb 空间;
- 频繁创建/删除大量临时表可能造成 tempdb 争用,建议复用临时表或改用表变量(小数据量场景)以降低开销。
不同数据库系统的差异提示
上述行为主要适用于 SQL Server。其他系统略有不同:
- MySQL 不支持 # 或 ## 语法,但提供 CREATE TEMPORARY TABLE,生命周期为“当前会话结束即删”;
- PostgreSQL 使用 CREATE TEMP TABLE,同样随会话结束自动清理,也支持 ON COMMIT DROP 实现在事务结束时删除;
- Oracle 没有真正意义的临时表,但有全局临时表(GLOBAL TEMPORARY TABLE),数据可按事务(ON COMMIT DELETE ROWS)或会话(ON COMMIT PRESERVE ROWS)生命周期管理。










