临时表(Temporary Tables)和表变量(Table Variables)是两种不同的机制,用于在执行查询或过程期间存储临时数据。
临时表(例如,#TempTable 在 MS SQL 中):
表变量(例如,@MyTable):
示例:
-- 临时表 CREATE TABLE #Temp( Id INT, Name NVARCHAR(100) ); INSERT INTO #Temp VALUES (1, 'Test'); SELECT * FROM #Temp; -- 表变量 DECLARE @MyTable TABLE (Id INT, Name NVARCHAR(100)); INSERT INTO @MyTable VALUES (2, 'Sample'); SELECT * FROM @MyTable;
临时表 #TempTable 和全局临时表 ##GlobalTempTable 的生命周期和可见性有什么区别?
正确答案:
#TempTable 仅在当前会话中可见,在连接关闭或显式 DROP 时销毁。##GlobalTempTable 直到最后一个使用过该表的会话关闭之前,可供所有会话访问,或显式 DROP。它只有在最后一个使用它的连接关闭后才会消失。-- 全局临时表 CREATE TABLE ##GlobalTemp (Id INT);
故事
在处理大型报告的项目中,使用了表变量来临时存储数十万行。 结果:性能急剧下降,因为优化器高估了查询的成本,并开始使用不合适的计划。替换为 tempdb 中的临时表显著提高了时间。
故事
在一个过程中特意未删除临时表。 在同一会话中重复批量运行时出现错误:“对象已存在”。在创建之前添加 DROP TABLE 后问题消失。
故事
使用全局临时表进行报告之间的进程间交互。 未考虑到并行执行使行为不可预测——会话在同一数据上发生冲突。决定将全局表替换为每个会话的独立临时表。