#myTable 与声明@myable表
之间有什么区别?答案 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)