OK, mam wybór równoległy, ale nie w zmiennej tabeli
Zanonimizowałem to i:
- BigParallelTable ma 900 tys. rzędów i jest szeroki
- Ze względów starszych, BigParallelTable jest częściowo zdenormalizowany (naprawię to później, obiecuję)
- BigParallelTable często generuje plany równoległe, ponieważ nie jest idealny i jest „drogi”
- SQL Server 2005 x64, SP3, kompilacja 4035, 16 rdzeni
Zapytanie + 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]))
Teraz, myśląc o tym, zmienna tabeli prawie zawsze jest skanem tabeli, nie ma statystyk i zakłada się, że jeden wiersz „Szacowana liczba wierszy =1”, „Rzeczywista.. =3”.
Czy możemy zadeklarować, że zmienne tabeli nie są używane równolegle, ale plan zawierający może używać równoległości gdzie indziej? Tak więc BOL jest poprawny, a artykuł o SQL Storage jest błędny