编程后端开发者

SQL中临时表(Temporary Tables)有什么特点,如何正确使用它们,以及它们与表变量(Table Variables)之间的区别是什么?

用 Hintsage AI 助手通过面试

回答。

临时表(Temporary Tables)和表变量(Table Variables)是两种不同的机制,用于在执行查询或过程期间存储临时数据。

临时表(例如,#TempTable 在 MS SQL 中):

  • 存储在临时数据库 tempdb 中。
  • 在当前会话或连接中可见。
  • 允许创建索引、约束,可以是事务的一部分。
  • 用于处理大量数据和复杂操作时。

表变量(例如,@MyTable):

  • 在 batch/procedure/函数内作用域。
  • 更常优化小数据集。
  • 不能创建完整的索引(除了 PRIMARY KEY/UNIQUE)。
  • 被阻塞的可能性较小,并且在事务中的参与方式不同。

示例:

-- 临时表 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 后问题消失。


故事

使用全局临时表进行报告之间的进程间交互。 未考虑到并行执行使行为不可预测——会话在同一数据上发生冲突。决定将全局表替换为每个会话的独立临时表。