【问题标题】:Why are temporary tables faster than table variables for joins?为什么临时表比连接的表变量快?
【发布时间】:2013-07-11 07:53:12
【问题描述】:

在 SQL Server 中,为什么临时表比表变量快?

注意:在这两种情况下,表都有 PK,并且这些表通过 PK 与其他“物理”表连接。

【问题讨论】:

    标签: sql-server join table-variable temp-tables


    【解决方案1】:

    两者都保存在 Tempdb 中;然而,性能问题开始发挥作用,因为优化器不维护表变量的统计信息。这是有问题的,因为优化器总是会假设您的表变量中有 1 行。显然,这确实会搞砸查询计划,尤其是当表变量中有很多行时。我不会使用表变量来存储超过 1000 行左右的内容;否则,性能可能无法预测。

    【讨论】:

    • 没有为表变量维护统计信息,但行数是。优化器通常假定表变量基数为 0 行,因为该语句是在填充表变量之前编译的。如果语句需要重新编译,它可以使用实际的行数。
    【解决方案2】:

    临时表与表类似,但在创建时存储在 tempdb 中,这意味着优化器可以对其创建统计信息,而表变量与变量类似,并且没有统计信息。通常在比较 tmp 表与表时变量,临时表排在首位。 原因是查询优化器有时会为表变量生成糟糕的计划。当有大量数据时,通常可以看到这一点。我能说的最重要的一点是,与为临时表生成的计划相比,表变量更有可能导致不可预测的执行计划。另一方面,临时表会导致更多的重新编译。

    【讨论】:

      猜你喜欢
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2014-02-20
      • 2017-06-17
      • 1970-01-01
      • 2011-01-20
      • 2018-07-31
      相关资源
      最近更新 更多