我从未清楚地理解MAXDOP的用法.我知道它使查询更快,并且它是我可以用于查询优化的最后一项.
但是,我的问题是,何时何地最适合在查询中使用?
正如Kaboing所提到的,MAXDOP(n)
实际上控制了查询处理器中使用的CPU核心数.
在完全空闲的系统上,SQL Server将尝试尽快将表拉入内存,并在内存中将它们连接起来.可能是,在您的情况下,最好使用单个CPU执行此操作.这可能与使用OPTION (FORCE ORDER)
强制查询优化器使用您指定的连接顺序的效果相同.在某些情况下,我已经看到OPTION (FORCE PLAN)
将查询从26秒减少到1秒执行时间.
在线书籍继续说可能的值MAXDOP
是:
0 - 根据当前系统工作负载使用实际可用CPU数.这是默认值和推荐设置.
1 - 禁止并行计划生成.该操作将连续执行.
2-64 - 将处理器数量限制为指定值.根据当前的工作量,可以使用更少的处理器.如果指定的值大于可用CPU的数量,则使用实际可用CPU数.
我不确定最佳用法MAXDOP
是什么,但我会猜测并说如果你有一个包含8个分区的表,你会想要指定MAXDOP(8)
由于I/O限制,但我可能是错的.
以下是我发现的一些快速链接MAXDOP
:
在线书籍:并行度
用于配置MAXDOP选项的一般准则
这是SQL Server中并行性的一般漫无边际,它可能无法直接回答您的问题.
来自联机丛书,关于MAXDOP:
设置查询处理器可用于执行单个索引语句的最大处理器数.根据当前系统工作负载,可以使用更少的处理器.
请参阅Rickie Lee关于并行性和CXPACKET等待类型的博客.这很有趣.
通常,在OLTP数据库中,我的观点是,如果查询成本太高,需要在多个处理器上执行,则需要将查询重写为更高效的内容.
添加MAXDOP(1)为什么会有更好的结果?没有实际执行计划很难说,但它可能是如此简单,执行计划完全不同于没有OPTION,例如使用不同的索引(或更可能)使用MERGE或HASH连接以不同的方式加入.
作为一个例外,MAXDOP显然可以用作一个可能令人讨厌的bug的变通方法:
返回的标识值并不总是正确的