SQL 2005中两种类型的临时表@tmp vs #tmp之间的区别是什么? 并且是我不知道的其他类型?
感谢
答案 0 :(得分:9)
#tmp
是一个临时表,主要表现为真实表。它可以有索引,可以有统计信息,参与事务,优化器可以计算出正确的行估计值
@tmp
是一个表变量。没有索引,没有统计信息,没有事务感知,优化器总是假定只有1行
否则,它们都是作用域(略有不同),在内存/缓存中,但上下文是tempdb,如果太大则会溢出到磁盘等
编辑:
关于表变量的键。他们使没有区别。没有统计数据,假设有一行。它会将表扫描更改为聚集索引扫描,这是相同的。检查任何查询计划和估计的行。
另外,请阅读此阅读What a difference a temp table makes over a table variable
我做的第一件事是在@ComputersToProcess表变量上放置一个主键。这使得表格扫描成为聚集索引扫描,但没有为性能做任何事情。
答案 1 :(得分:5)
请参阅http://support.microsoft.com/kb/305977:
与临时表相比,表变量具有以下优点:
与临时表相比,这些是一些缺点:
与临时表或永久表相比,表变量是仅限内存的结构可以确保更好的性能,因为它们是在驻留在物理磁盘上的数据库中维护的吗?
对于实际的性能比较,另见:
答案 2 :(得分:2)
只需添加现有答案。实际上有 3 类型的临时表。除了其他答案之外,您还可以创建全局临时表,如##globalTempTable
这些对所有sql server连接都是可见的,并且很少使用,但是在注意到它们确实存在时很有用。
这里有一个关于标准和全局临时表之间差异的很好的阅读 http://www.codeproject.com/KB/database/TempTable.aspx
答案 3 :(得分:1)
@tmp
是指存储在内存中的类型表变量,而#tmp
是指TEMP
数据库中的表。
答案 4 :(得分:0)
还有另一种类型的“临时表”我使用CTE就像创建临时表一样。