好的,我有一个并行选择,但不在表变量上
我已经匿名了,并且:
- 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 Storage那篇文章是错误的