【问题标题】:What is the comparative speed of temporary tables to physical tables in SQL?SQL中临时表和物理表的比较速度是多少?
【发布时间】:2008-10-20 22:22:53
【问题描述】:
【问题讨论】:
标签:
sql
sql-server
sql-server-2005
tsql
【解决方案1】:
临时表在 SQL Server 中是个大问题。
- 它们会引发查询计划重新编译,代价高昂。
- 创建和删除表也是您要添加到流程中的昂贵操作。
- 如果有大量数据进入临时数据,您的操作将因缺少索引而变慢。您可以在临时表上创建索引。但我绝不会推荐任何记录大量记录的临时表。
您的其他方法:创建然后删除常规表只会产生相同的开销。
另一种方法:使用现有表,用附加列扩充行,以区分可以使用哪些行与每个用户/会话相关。消除了创建/删除表的负担,但是,您将需要对生成值以区分行的代码保持偏执,并且您必须开发一种方法来维护表以应对会话过早结束的情况并且有剩余(在处理结束时未删除的行)。
我建议您重新考虑您的处理策略。一些替代方法与使用相关查询、派生表或表变量一样简单。看一看:http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx
编辑:创建和删除常规表的方法和重用带有附加字段的常规表的方法:两者都会生成查询计划重新编译,因为更改的数据量会触发重新评估的表统计。同样,您最好的方法是找到处理数据的替代方法。
【解决方案2】:
你在做什么样的数据操作,你在处理多少数据?
我会坚持使用临时表 - 对于大型数据集,我一直发现它是迄今为止最好的方法,而不仅仅是在 SQL Server 中。您可以尝试一个全局临时表 (CREATE TABLE ##tablename),它的持续时间超出了 create 语句的范围。
来自 SQL Server 联机丛书 (2005):
如果您创建全局临时
表 ##employees,该表中的任何用户
数据库可以使用此表。如果
没有其他用户使用此表
创建后,表是
断开连接时删除。如果
另一个用户使用该表
创建后,SQL Server
断开连接后将其删除并
在所有其他会话不再
积极使用它。
【解决方案3】:
要考虑的一件事是您是否可以指望一次只运行一个用户运行此过程。如果您同时有用户,那么常规表选项可能会产生干扰。临时表对用户来说可能是唯一的。
【解决方案4】:
至少对于 MySql,您将获得的唯一时间节省是实际创建临时表的时间节省。 AFAIK 所有表格在磁盘上的处理方式都是一样的,它们只是在会话结束时消失了。这也是我在实践中看到的。同样,这是 mysql 4.x 和 5.x
【解决方案5】:
我对此不是 100% 确定,但我相信表变量严格存储在内存中,但临时表驻留在存储在磁盘上的 tempdb 中。这是使用 SQL Server,我不确定不同 RDMS 的一致性如何。