簡體   English   中英

讀取表變量的查詢是否可以在SQL Server 2008中生成並行執行計划?

[英]Can queries that read table variables generate parallel exection plans in SQL Server 2008?

首先,來自BOL

修改變量的查詢不會生成並行查詢執行計划。 當修改非常大的變量或復雜查詢中的變量時,性能會受到影響。 在這些情況下,請考慮使用臨時表。 有關更多信息,請參見CREATE TABLE(Transact-SQL)。 讀取變量而不修改它們的查詢仍然可以並行化。

這看起來很清楚。 讀取表變量而不修改它們的查詢仍然可以並行化。

但是在Sun Server Agarwal在2008年3月30日的一篇關於tempdb的文章中說,這是一個聲譽卓着的SQL Server存儲引擎

涉及表變量的查詢不會生成並行計划。

Sunil是否解釋了BOL:INSERT,或者FROM子句中是否存在表變量會阻止並行性? 如果是這樣,為什么?

我正在考慮控制表用例,其中有一個小控件表連接到一個更大的表,映射值,充當過濾器,或兩者兼而有之。

謝謝!

好的,我有一個並行選擇但不在表變量上

我已將其匿名化並:

  • BigParallelTable是900k行和寬
  • 由於遺留原因,BigParallelTable被部分非規范化(我將修復它,稍后,承諾)
  • BigParallelTable經常生成並行計划,因為它不理想並且“昂貴”
  • SQL Server 2005 x64,SP3,內置4035,16個內核

查詢+計划:

DECLARE @FilterList TABLE (bar varchar(100) NOT NULL)

INSERT @FilterList (bar)
SELECT 'val1' UNION ALL 'val2' UNION ALL 'val3'

--snipped

SELECT
     *
FROM
    dbo.BigParallelTable BPT
    JOIN
    @FilterList FL ON BPT.Thing = FL.Bar

StmtText
  |--Parallelism(Gather Streams)
       |--Hash Match(Inner Join, HASH:([FL].[bar])=([BPT].[Thing]), RESIDUAL:(@FilterList.[bar] as [FL].[bar]=[MyDB].[dbo].[BigParallelTable].[Thing] as [BPT].[Thing]))
            |--Parallelism(Distribute Streams, Broadcast Partitioning)
            |    |--Table Scan(OBJECT:(@FilterList AS [FL]))
            |--Clustered Index Scan(OBJECT:([MyDB].[dbo].[BigParallelTable].[PK_BigParallelTable] AS [BPT]))

現在,考慮一下,表變量幾乎總是一個表掃描,沒有統計數據,並假設一行“估計行數= 1”,“實際.. = 3”。

我們可以聲明表變量不是並行使用的,但是包含計划可以在其他地方使用並行嗎? 所以BOL是正確的,SQL存儲文章是錯誤的

簡單示例顯示表變量本身的並行運算符。

DECLARE @T TABLE
(
X INT
)
INSERT INTO @T
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1,master..spt_values v2;

WITH E8(N)
     AS (SELECT 1
         FROM   @T a,
                @T b),
     Nums(N)
     AS (SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
         FROM   E8)
SELECT COUNT(N)
FROM   Nums
OPTION (RECOMPILE)  

計划

我的理解是對於UPDATE / DELETE / INSERT操作的表變量阻塞了並行性,但對於SELECTs則沒有。 當然,證明這比假設更困難。 :-)

[在這里回答我自己的問題,所以我可以適當地提出相關的引用....]

Boris B,來自MSDN SQL Server論壇的一個主題

使用表變量的只讀查詢仍然可以並行化。 涉及已修改的表變量的查詢以串行方式運行。 我們將更正聯機叢書中的聲明。 (增加)

和:

請注意,有兩種並行支持:

A.操作員可以/不能處於並行線程中

B.查詢可以/不能並行運行,因為該運算符存在於樹中。

B是A的超集。

我可以說,表變量不是 B, 可能是 A.

另一個相關的引用,re:非內聯T-SQL TVF:

如果TVF輸入是運行時常數,例如變量和參數,則非內聯T-SQL TVF ...被認為是並行的。 如果輸入是一列(來自交叉應用),則對整個語句禁用並行性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM