我有一个脚本需要临时提取数据以对其执行额外操作,但是在脚本运行后不需要再存储它。我目前在一系列临时本地表(CREATE TABLE #table)中有相关数据,然后在使用完成时将其删除。我正在考虑切换到物理表,以相同的方式处理(CREATE TABLE表),如果脚本的速度有所提高(或者其他优点,可能?)。
...那么,临时表和物理表之间的性能是否存在差异?从我正在阅读的内容来看,临时表只是物理表,只有运行脚本的会话才能查看(减少锁定问题)。
编辑:我应该指出我正在谈论物理表与临时表。有很多关于临时表与表变量的信息,例如: http://sqlnerd.blogspot.com/2005/09/temp-tables-vs-table-variables.html
答案 0 :(得分:1)
临时表在SQL Server中是一个很大的NO。
您的另一种方法:创建然后删除常规表只会产生相同的开销。
另一种方法:使用现有表,使用附加列扩充行以区分哪些行属于每个用户/会话。消除了创建/删除表的负担,但是,您需要对生成用于区分行的值的代码产生偏执,并且您必须开发一种方法来维护表,以用于会话过早结束的情况并且有剩余物(处理结束时未删除的行)。
我建议您重新考虑处理策略。一些替代方法与使用相关查询,派生表或表变量一样简单。看看:http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx
编辑:创建和删除常规表的方法以及重用使用附加字段扩充的常规表的方法:两者都将生成查询计划重新编译,因为更改的数据量将触发重新评估表统计。同样,您最好的方法是找到处理数据的其他方法。
答案 1 :(得分:1)
您在做什么样的数据操作,以及您使用了多少数据?
我会坚持使用临时表 - 对于大型数据集,我总是发现它是迄今为止最好的方法,而不仅仅是在SQL Server中。您可以尝试一个全局临时表(CREATE TABLE ## tablename),它不仅仅是create语句的范围。
从SQL Server联机丛书(2005):
如果您创建全局临时 表##员工,中的任何用户 数据库可以使用此表。如果 没有其他用户使用此表 创建它之后,表就是 断开连接时删除。如果 另一个用户使用该表 在您创建它之后,SQL Server 断开连接后删除它 在所有其他会话不再 积极使用它。
答案 2 :(得分:1)
要考虑的一件事是,您是否一次只能依靠一个运行此proc的用户。如果您有并发用户,则常规表选项可能会产生干扰。临时表可以是用户唯一的。
答案 3 :(得分:0)
至少对于MySql来说,节省的唯一时间是实际创建临时表所节省的时间。 AFAIK所有表在磁盘上都被视为相同,它们恰好在会话结束时消失。这也是我在实践中看到的。同样,这是mysql 4.x和5.x
答案 4 :(得分:0)
我对此并不是100%肯定,但我相信表变量严格在内存中,但临时表驻留在tempdb中,tempdb存储在磁盘上。这是使用SQL Server,我不确定不同的RDMS是如何一致的。