我查询了以下形状:
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系列的性能?
答案 0 :(得分:3)
你根本不强迫并行。引擎根据查询成本决定它
请参阅how to run a parallel query on sql server 2008?
在这种情况下,您可以打开4个数据库连接并运行4个查询并附加结果。您将使用.net并行处理然后加入结果集。
但是,在数据库中,UNION几乎总是更有效,更简单。
从同一个表池中读取不会促进或阻止并行性:发布不会阻止其他读者的共享锁。并且数据将被缓存,因此使用的IO更少。
如果每个UNION子句花费的时间太长,那么您还有其他问题,例如索引不佳,旧/无统计,内存太少,查询结构错误,tempdb问题......以及许多其他可能性
<强> TL;博士强>
修复查询。不要在他们周围工作。