这两种表有什么区别? (#和@)

时间:2009-10-15 11:34:51

标签: sql-server

#myTable 声明@myable表

之间有什么区别?

5 个答案:

答案 0 :(得分:3)

  

在存储过程中,您经常拥有   需要存储一组数据   在程序内,没有   一定需要那些数据   坚持超出范围   程序。如果你真的需要一个   表结构,基本上有   有四种方法可以“存储”这些数据:   本地临时表(#table_name),   全局临时表   (## table_name),永久表   (table_name)和表变量   (@table_name)。

Should I use a #temp table or a @table variable?

  

本地和全局临时表   是tempdb中的物理表   数据库,可以创建索引   。因为临时表是物理的   表,您还可以创建主要   通过CREATE TABLE键入它们   命令或通过ALTER TABLE   命令。您可以使用ALTER TABLE   命令添加任何默认值,new   您需要的列或约束   在你的代码中。

     

与本地和全球临时不同   表,表变量不能有   在它们上创建的索引。例外   是表变量可以有一个   创建时定义的主键   使用DECLARE @variable TABLE   命令。然后这将创建一个   群集或非群集索引   表变量。 CREATE INDEX   命令无法识别表   变量。因此,唯一的指标   可用的是索引   伴随主键,是   在表变量上创建   宣言。此外,不会为表变量记录事务日志。因此,它们超出了交易机制的范围

答案 1 :(得分:1)

请参阅:

通常说@table变量保存在内存中而不是tempdb; 这不一定正确。

表变量没有统计信息,这可能会影响某些情况下的性能。

答案 2 :(得分:1)

在处理相对较小的数据集时,表变量都很好,但要注意它们不能很好地扩展。特别是,SQL Server 2000和SQL Server 2005之间的行为改变导致性能下降到大数据集。

对于我来说,在SQL Server 2000上使用非常复杂的存储过程,这对我来说是一个特别讨厌的问题。研究和测试表明,使用表变量是更高效的方法。但是,升级到SQL Server 2008后性能降低相当。使用表变量作为罪魁祸首需要一段时间,因为所有先前的测试等都排除了临时表更快。但是,由于SQL Server版本之间的这种变化,现在情况正好相反,经过重大的重构,完成后需要几个小时才能完成,几分钟就完成了!

请注意,没有明确的答案,哪个最好 - 您需要评估您的情况,进行自己的测试,并根据您的发现做出决定。并且始终在服务器升级后重新评估。

阅读本文以获取更多详细信息和示例时间 - http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx

更新:另外请注意,还有第三种类型的临时表 - ## xyz。这些是全局的,对所有SQL Server连接都是可见的,并且不像常规临时表那样限定为当前连接。它们仅在访问它的最终连接关闭时被删除。

答案 3 :(得分:0)

'#myTable是一个临时表,可以使用约束和索引等并使用更多资源。

@myTable是一个表变量,您可以将其定义为包含一列或多列。它们使用较少的资源,并且限定在您使用它们的过程中。

在大多数使用临时表的情况下,可以使用表变量代替,这可以提供性能优势。

答案 4 :(得分:0)

#tabel1是存储在tempdb中的本地临时表。 ##table1是存储在tempdb中的全局临时表。

@table是表变量。

检查link的差异