与临时表并行但不是表变量?

K. *_*R. 3 sql-server parallelism temporary-tables table-variable

第一个查询(插入表变量)的时间是第二个查询的两倍。它在执行计划中不使用并行性。

第二个查询(插入临时表)在其执行计划中使用并行性,并且能够在几乎一半的时间内实现结果。

我试图从表函数运行它,因此需要表变量而不是临时表。

执行计划非常复杂,我宁愿不朝那个方向深入(目前)。我想知道是否有人解释或假设为什么第一个 SQL 不使用并行性,而第二个是。

第一的:

DECLARE @TableVar as TABLE (
    [Date] [date] NULL,
    [B] [int] NULL,
    [C] [decimal](5, 3) NULL)

INSERT INTO 
    @TableVar
SELECT 
    [Date]        = CAST(LO.Dt as Date)
  , [B]           = DMC.[B]
  , [C]           = DMC.[C]
FROM                  
                 dbo.fnTblFunc1(@DateStart, @DateEnd) AS DMC 
    INNER JOIN   dbo.fnTblFunc2(@DateStart, @DateEnd) AS LO ON DMC.Date = LO.Dt
OPTION (FORCE ORDER  )
Run Code Online (Sandbox Code Playgroud)

第二:

CREATE TABLE #TempTbl(
    [Date] [date] NULL,
    [B] [int] NULL,
    [C] [decimal](5, 3) NULL)

INSERT INTO 
    #TempTbl
SELECT 
    [Date]        = CAST(LO.Dt as Date)
  , [B]           = DMC.[B]
  , [C]           = DMC.[C]
FROM                  
                 dbo.fnTblFunc1(@DateStart, @DateEnd) AS DMC 
    INNER JOIN   dbo.fnTblFunc2(@DateStart, @DateEnd) AS LO ON DMC.Date = LO.Dt
OPTION (FORCE ORDER  )

DROP TABLE #TempTbl
Run Code Online (Sandbox Code Playgroud)

Ken*_*her 6

下面从这个问题中引用table variables 和 temp tables 之间差异。查看并行性部分。

插入(或以其他方式修改)@table_variables 的查询不能有并行计划,#temp_tables 不受这种方式的限制。