Sql server 2005 sql临时表@tmp vs#tmp

Sql server 2005 sql临时表@tmp vs#tmp,sql-server-2005,Sql Server 2005,SQL2005中@tmp和#tmp这两种类型的临时表之间有什么区别? 还有其他我不知道的类型吗 谢谢@tmp指的是存储在内存中的表类型的变量,而#tmp指的是TEMP数据库中的表。#tmp是一个TEMP表,其作用大部分类似于一个实际表。它可以有索引,可以有统计数据,参与事务,Optimizer将计算出正确的行估计 @tmp是一个表变量。没有索引,没有统计信息,没有事务感知,Optimizer总是假设正好是一行 否则,它们的作用域都是有限的(略有不同),在内存/缓存中,但上下文是tempdb,如果

SQL2005中@tmp和#tmp这两种类型的临时表之间有什么区别? 还有其他我不知道的类型吗


谢谢

@tmp
指的是存储在内存中的表类型的变量,而
#tmp
指的是
TEMP
数据库中的表。

#tmp
是一个TEMP表,其作用大部分类似于一个实际表。它可以有索引,可以有统计数据,参与事务,Optimizer将计算出正确的行估计

@tmp
是一个表变量。没有索引,没有统计信息,没有事务感知,Optimizer总是假设正好是一行

否则,它们的作用域都是有限的(略有不同),在内存/缓存中,但上下文是tempdb,如果太大,则会溢出到磁盘等

编辑:

关于表变量上的键。它们没有区别。没有统计信息,假设只有一行。它会将表扫描更改为相同的聚集索引扫描。检查任何查询计划和估计行

还有,读一下这个

我做的第一件事是在@ComputerStopProcess表变量上放置一个主键。这使表扫描变成了聚集索引扫描,但对性能没有任何影响


还有另外一种类型的“临时表”,我可以使用CTE,这就像创建临时表一样。

只是添加到现有答案上。实际上有3种类型的临时表。除了其他答案之外,您还可以创建全局临时表,如so
##globalTempTable

这些连接对所有sql server连接都是可见的,很少使用,但在注意它们确实存在时非常有用

这里有一篇关于标准和全局临时表之间差异的好文章 参见:

与临时表相比,表变量具有以下优势:

  • 正如SQL Server联机丛书“表”文章中提到的,表变量,如局部变量,有一个定义良好的作用域,在该作用域的末尾会自动清除它们
  • 与临时表相比,表变量导致更少的存储过程重新编译
  • 涉及表变量的事务仅在表变量更新期间有效。因此,表变量需要更少的锁定和日志资源。由于表变量的作用域有限,并且不是持久数据库的一部分,事务回滚不会影响它们
与临时表相比,以下是一些缺点:

  • 除了为主约束或唯一约束创建的系统索引外,不能对表变量创建非聚集索引。与具有非聚集索引的临时表相比,这可能会影响查询性能
  • 表变量不像临时表那样维护统计信息。不能通过自动创建或使用CREATESTATISTICS语句对表变量创建统计信息。因此,对于大型表上的复杂查询,缺少统计信息可能会阻止优化器确定查询的最佳计划,从而影响该查询的性能
  • 在初始DECLARE语句之后,无法更改表定义
  • 不能在INSERT EXEC或SELECT INTO语句中使用表变量
  • 表类型声明中的检查约束、默认值和计算列不能调用用户定义的函数
  • 如果表变量是在EXEC语句或sp_executesql存储过程之外创建的,则不能使用EXEC语句或sp_executesql存储过程运行引用表变量的动态SQL Server查询。由于表变量只能在其局部范围内引用,EXEC语句和sp_executesql存储过程将不在表变量的范围内。但是,您可以创建表变量并在EXEC语句或sp_executesql存储过程中执行所有处理,因为表变量的局部作用域位于EXEC语句或sp_executesql存储过程中
与临时表或永久表相比,表变量是确保性能更好的内存结构,因为它们是在物理磁盘上的数据库中维护的吗

  • 表变量不是仅内存结构由于表变量可能包含的数据超过内存容量,因此它必须在磁盘上有一个位置来存储数据。在tempdb数据库中创建的表变量与临时表类似。如果内存可用,则在内存(数据缓存)中创建和处理表变量和临时表
有关实际性能比较,另请参见:


您可以使用聚集索引声明@tmp表变量,但不能添加任何非聚集索引(或稍后更改)。它可能没有任何统计数据,但我不相信它仍然没有任何区别。看,你可以给我看一些例子,其中临时表的性能更好,我会给你看一些不同的例子,其中表变量的性能更好。对此,答案是“视情况而定”。但是您的断言“表变量上的索引没有帮助,因为它们没有统计信息”显然是错误的:您已经标记了一个答案,但请检查其他答案,这样您就不会对SQL server如何存储临时数据留下任何错误印象。