为什么临时表的性能比普通表更好,即使它们存储在不同的数据库中,即tempdb中

时间:2015-06-04 13:05:49

标签: c# sql asp.net .net sql-server

当我们使用临时表时,它会在另一个数据库tempdb中创建,这是一个性能开销。但是如果我们在存储过程中创建普通表来代替临时表,那么它将在自己的数据库中创建。

所以我的问题是为什么我们在程序中使用临时表?

这只是表格的范围吗?

4 个答案:

答案 0 :(得分:6)

我们使用临时表 1 我们想要存储一组行并使用它们但不想干扰同一段代码的任何其他实例,在不同的连接上运行

如果我们使用永久表,我们必须做额外的工作来防止干扰(例如总是过滤@@SPID)或者必须将我们的代码限制为仅由单个连接执行一段时间。

当临时表超出范围时,我们也会受益于自动清理。

1 或表变量。它们大致相同,只是采用不同的范围规则。

答案 1 :(得分:1)

创建临时表和创建与常规(非临时)表相同的表之间的任何性能差异都可以忽略不计。实际上,我希望看到临时表的性能更好,因为它们被视为表变量(缓存使用,miminal锁定输出)。对于关于临时表的真正好的讨论,我会去here。那篇文章是临时表和表变量之间的精彩比较,如果您想了解临时表及其处理方式,这是非常有启发性的。

答案 2 :(得分:0)

以下是使用临时表或变量表的几个原因:

  1. 它们仅存在于当前查询的范围内。
  2. 它们存储在tempdb中;根据您的硬件配置,它位于更快的驱动器上。
  3. 我对除小数据集以外的任何东西的偏好是在变量表上使用临时表,因为:

    1. 您可以更自由地使用临时表上的索引。
    2. SQL Server查询优化器通常假定变量表只包含1行。

答案 3 :(得分:0)

这个好处的主要原因是编程和管理的简单性。 因为你不需要编写任何东西来创建临时表,你可以直接选择.... #tbl,

其次对会话进行动态隔离,你不需要为会话共享避免做任何事情。假设如果相同的SP从两个不同的会话运行,则将创建表的两个隔离实例。 从1个查询板(管理工作室)

运行以下代码

SELECT'ASP.Net'主题INTO #test SELECT * FROM #test

和其他,

SELECT'C#'subject INTO #test SELECT * FROM #test

会创建表的两个不同实例,表名不只是#test,而是像

测试__________________________________ 000000000EEC

测试__________________________________ 000000000EEE

现在运行以下查询来实现它

USE TEMPDB

SELECT name FROM sys.tables WHERE name LIKE'#test%';

数据库也会进一步处理清理过程。

谢谢和问候,

Rk_Hirpara