在SQL 2005中,@tmp和#tmp这两种类型的临时表有什么不同?还有我不知道的其他类型吗?
谢谢
发布于 2010-11-05 04:51:18
#tmp是一个临时表,在很大程度上就像一个真实的表。它可以有索引,可以有统计数据,可以参与事务,优化器将计算出正确的行估计
@tmp是一个表变量。没有索引,没有统计数据,没有事务感知,优化器总是假设只有1行
否则,它们都是作用域(略有不同),在内存/缓存中,但上下文是临时数据库,如果太大,将溢出到磁盘等
编辑:
关于表变量上的键。他们没有什么不同。没有统计数据,假设只有一行。它会将表扫描更改为聚集索引扫描,这是相同的。检查所有查询计划和估计行。
另外,只需阅读这段What a difference a temp table makes over a table variable
我做的第一件事是在@ComputersToProcess表变量上放置一个主键。这将表扫描转换为聚集索引扫描,但对性能没有任何影响。
发布于 2010-11-05 05:45:31
请参阅http://support.microsoft.com/kb/305977
与临时表相比,表变量具有以下优点:
正如SQL Server联机丛书“
事务回滚不会影响
与临时表相比,以下是一些缺点:
除了为PRIMARY或UNIQUE约束创建的系统索引之外,不能对表变量创建
与临时表或永久表相比,确保性能更好的表变量是否仅限于内存结构,因为它们是在驻留在物理磁盘上的数据库中维护的?
有关实际性能比较,另请参阅:
发布于 2010-11-05 05:20:36
只是在现有答案的基础上进行添加。实际上有3类型的临时表。除了其他答案之外,您还可以像这样创建全局临时表##globalTempTable
它们对所有sql server连接都是可见的,并且很少使用,但对于指出它们确实存在很有用。
下面是关于标准临时表和全局临时表http://www.codeproject.com/KB/database/TempTable.aspx之间的区别的很好的读物
https://stackoverflow.com/questions/4101215
复制相似问题