【问题标题】:Is using Table variables faster than temp tables使用表变量比使用临时表快
【发布时间】:2012-02-22 03:23:56
【问题描述】:

我是否可以安全地假设我使用 tempdb 编写临时表的存储过程,我最好将这些转换为表变量以获得更好的性能?

【问题讨论】:

标签: sql-server-2008-r2 table-variable temp-tables


【解决方案1】:

@Tables 没有统计信息,因此执行计划需要更多的猜测。因此建议的上限为 1000 行。 #Tables 有统计信息,但这些 can be cached 在调用之间。如果每次 SP 运行时您的基数都显着不同,您希望每次都使用 REBUILDRECOMPILE。当然,这是一项开销,但必须与垃圾计划的成本相平衡。

两种类型都可以IO to TempDB

所以不,@Tables 不是灵丹妙药。

【讨论】:

    【解决方案2】:

    @Table 可以更快,因为“设置时间”更少,因为对象仅在内存中。

    @Tables 虽然有很多问题。

    您可以在@Table 上拥有一个主键,仅此而已。列组合的其他索引 Clustered NonClustered 是不可能的。

    此外,如果您的表要包含任何实际数据量(超过 200 行或 1000 行),那么访问该表的速度会更慢。尤其是当您可能没有有用的索引时。

    #Tables 在 procs 中很痛苦,因为在调试时需要删除它们,创建它们需要更长的时间。并且它们需要更长的时间来设置,因为您需要添加索引作为第二步。但是,如果您有大量数据,那么每次都会使用 #tables。

    即使在表中的数据行少于 100 行的情况下,您仍可能希望使用 #Tables,因为您可以在表上创建有用的索引。

    总的来说,我在做简单的过程等时大部分时间都使用@Tables。但是任何需要执行的东西都应该是#Table。

    【讨论】:

    • 我曾经也相信这个寓言,直到最近我被困在清理查询并且(我做的最后一件事)完全相同的查询(测试运行多次,使用相同的参数)返回使用 #TempTable 只需 5 秒,而使用 @TableVar 则需要 16 秒
    【解决方案3】:

    临时表的性能更好。如果使用表变量并且变量中的数据太大,SQL Server 会自动将变量转换为临时表。

    与几乎所有与数据库相关的问题一样,这取决于您尝试做什么。因此,如果没有更多信息,很难回答。

    所以我的回答是,试试看,看看执行计划。以最低的成本使用最快的方式。

    【讨论】:

    • 我在顶部的评论是否有意义,我应该切换吗?
    • 很难说,切换与否。如果你想返回一个表变量并且你的操作在这两种方式上都很快,是的,我会切换。你真的应该试试。例如,上周我优化了一个变得很慢的查询。 20 小时前,现在 2 分钟。我只是从表变量更改为临时表。返回的数据不大,只有2000行,但是操作和过滤器很多。
    • "如果您使用表变量并且变量中的数据太大,SQL Server 会自动将变量转换为临时表。"这种说法是完全错误的。
    • @MitchWheat 我没有看到选择的替代方案(?)你建议没有选择的答案?
    猜你喜欢
    • 2013-07-11
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多