SQL中临时表与物理表的比较速度是多少?

Mar*_*ret 5 sql t-sql sql-server sql-server-2005

我有一个脚本需要临时提取数据以对其执行额外的操作,但是在脚本运行后不需要再存储它.我目前在一系列临时本地表(CREATE TABLE #table)中有相关数据,然后在使用完成时将其删除.我正在考虑切换到物理表,以相同的方式处理(CREATE TABLE表),如果脚本的速度有所提高(或者其他优点,可能?).

...那么,临时表和物理表之间的性能是否存在差异?从我正在阅读的内容来看,临时表只是物理表,只有运行脚本的会话才能查看(减少锁定问题).

编辑:我应该指出,我在谈论物理表与临时表.有很多关于临时表和表变量的信息,例如http://sqlnerd.blogspot.com/2005/09/temp-tables-vs-table-variables.html.

vma*_*uez 2

临时表是 SQL Server 中的一大禁忌。

  • 它们会引发查询计划重新编译,这是昂贵的。
  • 创建和删除表也是添加到流程中的成本高昂的操作。
  • 如果有大量数据进入临时数据,您的操作将因缺乏索引而变慢。您可以在临时表上创建索引。但我绝不会推荐任何有大量记录的临时表。

您的另一种方法:创建然后删除常规表只会产生相同的开销。

另一种方法:使用现有表,使用附加列来扩充行,以区分哪些行属于每个用户/会话。消除了创建/删除表的负担,但是,您将需要对生成值以区分行的代码保持偏执,并且您将必须开发一种方法来维护会话过早结束的情况下的表并且还有剩余的内容(在处理结束时未删除的行)。

我建议您重新考虑您的处理策略。有些替代方案就像使用相关查询、派生表或表变量一样简单。看一下:http ://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx


编辑:创建和删除常规表的方法以及重用通过附加字段增强的常规表的方法:两者都会生成查询计划重新编译,因为更改的数据量将触发表统计信息的重新评估。同样,最好的方法是找到处理数据的替代方法。

  • -1 #temp 表在这种情况下可能会更好。[请参阅此答案以获取解释](http://stackoverflow.com/questions/3175427/sql-server-temporary-vs-physical-tables/3175531#3175531)。此外,与常规数据库相比,“tempdb”具有日志记录优化。表变量的存储方式与临时表完全相同,因此该建议毫无意义。您链接到的那篇文章关于表变量的事务日志记录也是完全错误的。 (5认同)