ОК, у меня есть параллельный выбор, но нет в табличной переменной
Я анонимизировал это и:
- BigParallelTable имеет ширину 900 тыс. Строк и ширину
- По устаревшим причинам 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 неверна