使用临时表(#table)而不是持久表(表)有什么好处?

时间:2011-07-06 11:41:50

标签: sql-server-2005 temp-tables

我可以想到两个主要的好处:

  1. 避免并发问题,如果您有许多创建/删除表的进程,您可能会遇到麻烦,因为一个进程尝试创建一个已存在的表。
  2. 性能,我认为创建临时表(使用#)比常规表更高效。
  3. 还有其他原因,我的理由是假的吗?

3 个答案:

答案 0 :(得分:1)

您无法比较临时表和持久表:

  • 持久表保存您的数据,可供任何进程使用。
  • 临时的内容被丢弃,而#ones仅对该连接可见

您可以使用临时表来调整结果以进行进一步处理等。

两种类型的表之间的性能(无论哪种方式)都没有什么区别。

你不应该一直放弃并创建表格......任何依赖于此的应用程序都会出错,尤其是SQL调用过多。

答案 1 :(得分:0)

(1)临时表是在SQL Server TEMPDB数据库中创建的,因此需要更多的IO资源和锁定。表变量和派生表在内存中创建。

(2)临时表对于可以使用并行性处理的大量数据通常表现更好,而表变量最适用于少量数据(我使用100或更少行的经验法则),其中并行性不会提供显着的性能提升。

(3)您不能使用存储过程将数据插入表变量或派生表。例如,以下内容将起作用:INSERT INTO #MyTempTable EXEC dbo.GetPolicies_sp,而以下内容将生成错误:INSERT INTO @MyTableVariable EXEC dbo.GetPolicies_sp。

(4)派生表只能从SELECT语句创建,但可以在Insert,Update或Delete语句中使用。

(5)按照范围耐久性的顺序,临时表扩展范围最远,后面是表变量,最后是派生表。

答案 2 :(得分:0)

1) 表变量的生命周期仅适用于它运行的事务的持续时间。如果我们首先执行DECLARE语句,然后尝试将记录插入到@temp表变量中,我们收到错误,因为表变量已经不存在。如果我们在一个事务中声明并将记录插入@temp然后尝试查询表,结果是相同的。如果您注意到,我们需要针对#temp执行DROP TABLE语句。这是因为表会一直存在,直到会话结束或表被删除。

2) 表变量有一定的明确限制。

- 表变量不能包含非聚簇索引 - 您无法在表变量中创建约束 - 您无法在表变量列上创建默认值 - 无法针对表变量创建统计信息 - 临时表的相似之处包括:

与临时表的相似之处包括:

- 在tempdb中实例化 可以在表变量和临时表上创建聚簇索引 - 两者都记录在事务日志中 - 就像临时表和常规表一样,用户可以对表变量执行所有数据修改语言 - (DML)查询:SELECT,INSERT,UPDATE和DELETE。