临时表还是永久表?

时间:2011-06-24 11:16:04

标签: sql sql-server sql-server-2008

对于我的公司,我正在重新设计一些存储过程。原始过程使用大量永久表,这些表在过程执行期间填充,最后删除值。行数可以从100行扩展到50,000行,用于计算聚合。

我的问题是,如果我用临时表替换这些表会有严重的性能问题吗?使用临时表是否可行?

7 个答案:

答案 0 :(得分:1)

这取决于您使用它们的频率,处理时间,以及您在写入时是否同时从表中访问数据。

如果您使用临时表,它将不会等待索引和缓存,而不使用它。所以它应该在那里节省一点点资源。但是,您将使用临时表(即创建和销毁)产生开销。

我会重新检查你的查询如何在过程中起作用,并考虑在过程CURSOR操作中使用更多,而不是将所有内容加载到表中并删除它们。

但是,数据库用于存储信息和检索信息。我会回避使用永久表进行常规临时工作并坚持使用临时表。

整体性能不会对您在问题中指定的用例产生任何影响。

希望这有帮助,

Jeffrey Kevin Pry

答案 1 :(得分:0)

是的,这当然是可能的,您可能需要检查永久表是否有任何索引来加速连接等等。

答案 2 :(得分:0)

我同意杰弗里的观点。它总是取决于。 由于您使用的是Sql Server 2008,因此可以查看table variables 它们应该比TEMP表更轻。

我定义了一个用户定义的函数,它返回一个像这样的表变量:

    CREATE FUNCTION .ufd_GetUsers ( @UserCode INT )
    RETURNS @UsersTemp TABLE
        (
        UserCode INT NOT NULL,
        RoleCode INT NOT NULL
        )
    AS
    BEGIN
        INSERT @RolesTemp
            SELECT     
                dbo.UsersRoles.Code, Roles.Code
            FROM    
                dbo.UsersRoles 
                INNER JOIN
                                    dbo.UsersRolesRelations ON dbo.UsersRoles.Code = dbo.UsersRolesRelations.UserCode 
                INNER JOIN
                                    dbo.UsersRoles Roles ON dbo.UsersRolesRelations.RoleCode = Roles.Code
            WHERE dbo.UsersRoles.Code = @UserCode

        INSERT @UsersTemp VALUES(@UserCode, @UserCode)



RETURN
END

答案 3 :(得分:0)

一个很大的问题是,一次只能有一个人运行其中一个存储过程吗?我经常看到这些表从旧的单个用户数据库(或者从无法执行子查询的程序员或者SELECT * FROM之外的任何东西)中继承而来。如果超过一个用户尝试运行相同的过程会发生什么,如果它在中途崩溃会发生什么 - 表是否被清理干净?使用临时表或表变量,您可以将表正确地范围限定为当前连接。

答案 4 :(得分:0)

绝对使用临时表,特别是因为你提到了它的目的是协助计算和聚合这一事实。如果您在数据库的一个模式中使用了一个表,那么所有工作都将被记录 - 编写,备份等等。使用临时表可以消除最终您可能不关心的数据的开销。

答案 5 :(得分:0)

实际上,您可以节省一些时间,因为您可以在最后删除临时表而不是删除行(您说您有多个用户,因此您必须删除而不是截断)。删除是一项记录操作,可以为流程增加相当长的时间。如果永久表已编制索引,则创建临时表并将其编入索引。我敢打赌,你会看到性能提升,因为你的临时数据库已经接近空间。

表变量也可能有效,但无法对其进行索引,对于较小的数据集,它们通常只会更快。因此,您可以尝试使用临时表的组合,这些内容将足够大,以便为较小的项目提供表单索引和表格变量。

使用临时表和表变量的一个优点是,您可以保证一个用户进程胜出;干扰另一个用户的进程。你说他们目前有办法识别哪些记录,但是所有这些记录都是在使用永久表时引入的一个错误。临时处理的永久表是一个非常危险的选择。临时表和表变量标签永远不会从其他人的进程中看到数据,因此作为选择更加安全。

答案 6 :(得分:0)

表变量通常是要走的路。 如果有许多临时表被操作,SQL2K及以下版本可能会遇到严重的性能瓶颈 - 问题是系统表上的阻塞DDL。

  

Sql2005更好,但是表变量通过根本不使用那些系统表来避免整个问题,因此可以在没有用户间锁定问题的情况下执行(除了与源数据有关的问题)。

问题是表格变量只存在于范围内,因此如果存在大量需要重复处理的数据,那么需要持续一段(相对)长的持续时间,然后“静态”工作表实际上可能更快 - 它确实需要某种类型的用户密钥。定期清洁。真的是最后的手段。