我可以想到两个主要的好处:
还有其他原因,我的理由是假的吗?
答案 0 :(得分:1)
您无法比较临时表和持久表:
您可以使用临时表来调整结果以进行进一步处理等。
两种类型的表之间的性能(无论哪种方式)都没有什么区别。
你不应该一直放弃并创建表格......任何依赖于此的应用程序都会出错,尤其是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。