gpt4 book ai didi

sql - 读取表变量的查询可以在 SQL Server 2008 中生成并行执行计划吗?

转载 作者:行者123 更新时间:2023-12-02 22:43:13 24 4
gpt4 key购买 nike

首先,来自BOL :

Queries that modify table variables do not generate parallel query execution plans. Performance can be affected when very large table variables, or table variables in complex queries, are modified. In these situations, consider using temporary tables instead. For more information, see CREATE TABLE (Transact-SQL). Queries that read table variables without modifying them can still be parallelized.

这似乎很清楚。 读取表变量而不修改它们的查询仍然可以并行化。

然后就到了SQL Server Storage Engine Sunil Agarwal 在 2008 年 3 月 30 日关于 tempdb 的一篇文章中这样说道:

Queries involving table variables don't generate parallel plans.

Sunil 是否解释了 BOL re: INSERT,或者 FROM 子句中表变量的存在是否妨碍了并行性?如果是这样,为什么?

我正在特别考虑控制表用例,其中您有一个小的控制表连接到一个较大的表,以映射值,充当过滤器,或两者兼而有之。

谢谢!

最佳答案

好的,我有一个并行选择,但没有在表变量上

我已将其匿名化并且:

  • BigParallelTable 的行数和宽度为 900k
  • 由于遗留原因,BigParallelTable 已部分非规范化(我 promise 稍后会修复它)
  • 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 存储文章是错误的

关于sql - 读取表变量的查询可以在 SQL Server 2008 中生成并行执行计划吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1645846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com