OK, ik heb een parallelle selectie, maar niet op de tafelvariabele
Ik heb het geanonimiseerd en:
- BigParallelTable is 900k rijen en breed
- Om oude redenen is BigParallelTable gedeeltelijk gedenormaliseerd (ik zal het later oplossen, beloof het)
- BigParallelTable genereert vaak parallelle plannen omdat het niet ideaal is en "duur" is
- SQL Server 2005 x64, SP3, build 4035, 16 cores
Vraag + plan:
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]))
Als je er nu over nadenkt, is een tabelvariabele bijna altijd een tabelscan, heeft het geen statistieken en wordt aangenomen dat het één rij is "Geschat aantal rijen =1", "Werkelijk.. =3".
Kunnen we verklaren dat tabelvariabelen niet parallel worden gebruikt, maar dat het bevattende plan elders parallellisme kan gebruiken? Dus BOL is correct en het artikel over SQL Storage is fout