Ber*_*fel 5 sql-server parallelism execution-plan
我有两个简单的查询:
SELECT TOP(20) * FROM Clients ORDER BY City
Run Code Online (Sandbox Code Playgroud)
SELECT TOP(20) Id, Name, City FROM Clients ORDER BY City
Run Code Online (Sandbox Code Playgroud)
在第一种情况下我得到这样的结果
ID | 姓名 | 城市 | 更多专栏 |
---|---|---|---|
6 | 6人 | 无效的 | ... |
2 | 2人 | 无效的 | ... |
3 | 3号人 | 无效的 | ... |
在第二种情况下,我得到这样的结果 在第一种情况下,我得到这样的结果
ID | 姓名 | 城市 |
---|---|---|
2 | 2人 | 无效的 |
3 | 3号人 | 无效的 |
6 | 6人 | 无效的 |
请注意,顺序不同。当然,我理解,因为 City 对于这三个人来说是 NULL,所以不一定能保证唯一的顺序。
第二个查询没有:
在阅读有关并行查询处理的文档后,它特别提到某些构造会抑制并行性,例如 TOP 运算符。
除了并行性之外,唯一显着的区别是并行计划的 Top N Sort 节点的估计 I/O 成本为 16,而非并行查询计划的 Top N Sort 节点仅具有估计 I/O 成本成本0.01
所以我的问题是:为什么当我使用 TOP 运算符时它仍然会使用并行性,即使微软声明它应该抑制该机制?
该部分的文档完全是一场灾难。
TOP 运算符仅在计划中引入一个消耗数据的串行区域。这正是您的计划所显示的内容,Gather Streams 运算符先于 TOP 运算符。
请注意,TOP N 排序运算符的限制方式与(演示)TOP 强制并行区域的方式不同。