首先,从BOL http://msdn.microsoft.com/en-us/library/ms175010.aspx:
修改的查询table变量不生成并行查询执行计划。当非常大时,性能可能会受到影响table变量或复杂查询中的表变量被修改。在这些情况下,请考虑使用临时表。有关详细信息,请参阅创建表 (Transact-SQL)。读取的查询table不修改变量的情况仍然可以并行化。
这似乎很清楚了。查询read表变量在不修改的情况下仍然可以并行化。
但随后在SQL Server 存储引擎 http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspxSunil Agarwal 在 2008 年 3 月 30 日关于 tempdb 的一篇文章中这样说道:
涉及表变量的查询不会生成并行计划。
Sunil 是否解释了 BOL re: INSERT,或者 FROM 子句中表变量的存在是否妨碍了并行性?如果是这样,为什么?
我特别考虑控制表用例,其中您有一个小的控制表连接到一个更大的表,以映射值,充当过滤器,或两者兼而有之。
Thanks!
好的,我有一个并行选择,但是not在表变量上
我已经将其匿名化并且:
- Big ParallelTable 具有 900k 行和宽度
- 由于遗留原因,Big ParallelTable 部分非规范化(稍后我会修复它,保证)
- 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 文章是错误的
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)