[英]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子句中是否存在表變量會阻止並行性? 如果是這樣,為什么?
我正在考慮控制表用例,其中有一個小控件表連接到一個更大的表,映射值,充當過濾器,或兩者兼而有之。
謝謝!
好的,我有一個並行選擇但不在表變量上
我已將其匿名化並:
查詢+計划:
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.