sql temp tables @tmp vs #tmp

kac*_*apy 4 sql-server-2005

什么是SQL 2005中两种类型的临时表@tmp vs #tmp之间的区别?他是我不知道的其他类型?

谢谢

gbn*_*gbn 10

#tmp是一个临时表,主要表现为一个真正的表.它可以有索引,可以有统计信息,参与事务,优化器会计算出正确的行估计值

@tmp是一个表变量.没有索引,没有统计信息,没有事务感知,优化器总是假定只有1行

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

编辑:

关于表变量的键.他们没有任何区别.没有统计数据,假设有一行.它会将表扫描更改为聚集索引扫描,这是相同的.检查任何查询计划和估计的行.

另外,请阅读本文读取临时表与表变量的区别

我做的第一件事是在@ComputersToProcess表变量上放置一个主键.这将表扫描转换为聚集索引扫描,但没有为性能做任何事情.


Bra*_*adC 5

请参阅http://support.microsoft.com/kb/305977:

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

  • 正如SQL Server联机丛书"表"一文中所提到的,表变量(如局部变量)具有明确定义的范围,最后会自动清除它们.
  • 与临时表相比,表变量导致存储过程的重新编译更少.
  • 涉及表变量的事务仅在表变量更新期间持续存在.因此,表变量需要较少的锁定和日志记录资源.由于表变量的范围有限且不属于持久性数据库,因此事务回滚不会影响它们.

与临时表相比,这些是一些缺点:

  • 除了为PRIMARY或UNIQUE约束创建的系统索引之外,无法在表变量上创建非聚簇索引.与具有非聚集索引的临时表相比,这会影响查询性能.
  • 表变量不像临时表那样维护统计信息.无法通过自动创建或使用CREATE STATISTICS语句在表变量上创建统计信息.因此,对于大型表上的复杂查询,缺少统计信息可能会阻止优化程序确定查询的最佳计划,从而影响该查询的性能.
  • 在初始DECLARE语句之后,无法更改表定义.
  • 表变量不能在INSERT EXEC或SELECT INTO语句中使用.
  • 表类型声明中的CHECK约束,DEFAULT值和计算列不能调用用户定义的函数.
  • 如果表变量是在EXEC语句或sp_executesql存储过程之外创建的,则不能使用EXEC语句或sp_executesql存储过程来运行引用表变量的动态SQL Server查询.由于表变量只能在其本地作用域中引用,因此EXEC语句和sp_executesql存储过程将超出表变量的作用域.但是,您可以创建表变量并在EXEC语句或sp_executesql存储过程中执行所有处理,因为表变量本地作用域位于EXEC语句或sp_executesql存储过程中.

表变量是仅内存结构,与临时表或永久表相比,可以确保更好的性能,因为它们是在驻留在物理磁盘上的数据库中维护的吗?

  • 表变量不是仅内存结构.由于表变量可能包含的数据超出内存容量,因此必须在磁盘上放置一个存储数据的位置.表变量在tempdb数据库中创建,类似于临时表.如果内存可用,则在内存(数据高速缓存)中创建和处理表变量和临时表.

有关实际性能比较,另请参阅: