2

我有以下形状的查询:

A
UNION ALL
B
UNION ALL
C
UNION ALL
D

并希望通过并行调用 A、B、C 和 D 来并行化它,然后在 .Net 中合并它们。这 4 个查询都在同一个表池中读取数据。

我尝试的第一步是在 SSMS 的一个选项卡中执行 A,在第二个选项卡中执行 B。A 和 B 各持续约 1 分钟,所以我有时间启动 A,然后转到选项卡 B 并启动它。

但是当我查看 CPU 使用率时,它停滞在 13%(我在 8 核 CPU @ Windows 上),这对应于一个内核的 100%。

我的问题:-“锁定”机制是否允许对给定表集的两个查询并行运行?- 如果并行性是可能的,我会通过尝试在两个 SSMS 选项卡中并行运行 A 和 B 来注意到它,还是我的测试有缺陷?- 最终如何提高 UNION ALL 系列的性能?

4

1 回答 1

3

你根本不强制并行。引擎根据查询成本决定

了解如何在 sql server 2008 上运行并行查询?

在这种情况下,您可以打开 4 个与数据库的连接并运行 4 个查询并附加结果。您将使用 .net 并行处理来加入结果集。

但是,在数据库中使用 UNION 几乎总是更高效、更简单。

从同一个表池中读取不会促进或阻止并行性:发出不会阻塞其他读取器的共享锁。并且数据将被缓存,因此使用的 IO 更少。

如果每个 UNION 子句花费的时间太长,那么您还有其他问题,例如索引不佳、旧/无统计信息、RAM 太少、查询结构错误、tempdb 问题……以及许多其他可能性

tl;博士

修复查询。不要在他们周围工作。

于 2012-10-31T09:42:40.477 回答