【发布时间】:2011-09-29 13:28:11
【问题描述】:
我能想到两个主要好处:
- 避免并发问题,如果您有许多进程创建/删除表,您可能会遇到麻烦,因为一个进程试图创建一个已经存在的表。
- 性能,我想创建临时表(带#)比常规表性能更高。
还有其他原因吗,我的任何原因是假的吗?
【问题讨论】:
标签: sql-server-2005 temp-tables
我能想到两个主要好处:
还有其他原因吗,我的任何原因是假的吗?
【问题讨论】:
标签: sql-server-2005 temp-tables
您无法比较临时表和持久表:
您可以使用临时表来后台处理结果以进行进一步处理等。
两种类型的表在性能(无论哪种方式)上几乎没有区别。
您不应该一直删除和创建表...任何依赖于此的应用程序都在做错事,尤其是太多的 SQL 调用。
【讨论】:
(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) 按作用域持久性排序,临时表的作用域扩展最远,其次是表变量,最后是派生表。
【讨论】:
1) 表变量的生命周期仅在它运行的事务期间。如果我们先执行 DECLARE 语句,然后尝试将记录插入到 @temp 表变量中,我们会收到错误,因为表变量已经不存在了。如果我们在一个事务中声明并插入记录到@temp,然后尝试查询表,结果是一样的。如果您注意到,我们需要针对#temp 执行 DROP TABLE 语句。这是因为该表一直存在到会话结束或该表被删除为止。
2) 表变量有一定的明确限制。
-表变量不能有非聚集索引 - 不能在表变量中创建约束 -您不能在表变量列上创建默认值 - 不能针对表变量创建统计信息 - 与临时表的相似之处包括:
与临时表的相似之处包括:
-在 tempdb 中实例化 - 可以在表变量和临时表上创建聚集索引 - 两者都记录在事务日志中 - 就像使用临时表和常规表一样,用户可以对表变量执行所有数据修改语言 (DML) 查询:SELECT、INSERT、UPDATE 和 DELETE。
【讨论】: