Sql server 2005 sql临时表@tmp vs#tmp
SQL2005中@tmp和#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,如果
谢谢
@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数据库中创建的表变量与临时表类似。如果内存可用,则在内存(数据缓存)中创建和处理表变量和临时表李>