0

如果查询需要临时结果,SQL Server 2008 中有 3 个选项:

  1. 在查询中使用它作为动态结果,比如

    select * from tab1 a join (select * from tab2) b on a.ID = b.ID

  2. 使用临时表:

    select * int #tmptab from tab2

    Select * from tab1 a join #tmptab b on a.ID = b.ID

  3. 使用制表符表达式:

    使用 myTab as (select * from tab2)
    Select * from tab1 a join myTab b on a.ID = b.ID

问题是:哪一个是性能最好的最佳解决方案?

4

1 回答 1

2

SQL Server 实际上将一些join结果存储在一个临时表中,即使您没有要求它。在这些情况下,临时表与表表达式相同,并且没有性能差异。

临时表确实会降低查询优化器的自由度。例如:

select * into #tmptab from tab2

select * from tab1 a join #tmptab b on a.ID = b.ID

在处理第一步时,查询优化器并不知道它只是tab2tab1. 在处理第二步时,查询优化器只有临时表可以使用。它不能使用tab2.

所以一般来说,表表达式是优越的,因为它给优化器更多的自由。但是,在某些情况下,您可以使用临时表来强制查询优化器以某种方式运行。在测试之后谨慎使用它,并且仅在确实需要时使用。

于 2013-05-24T13:27:08.693 回答