我从未清楚地理解MAXDOP的用法。我知道它使查询更快,并且它是我可以用于查询优化的最后一项。
但是,我的问题是,何时何地最适合在查询中使用?
答案 0 :(得分:23)
正如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
的一些快速链接:
答案 1 :(得分:19)
这是对SQL Server中Parallelism的一般性说法,它可能无法直接回答您的问题。
来自联机丛书,关于MAXDOP:
设置最大处理器数 查询处理器可以用来执行 一个索引语句。更少 可以使用处理器,具体取决于 当前的系统工作量。
有关并行性和CXPACKET等待类型的信息,请参阅Rickie Lee's blog。这很有趣。
通常,在OLTP数据库中,我的观点是,如果查询成本太高,需要在多个处理器上执行,则需要将查询重写为更高效的内容。
为什么添加MAXDOP(1)会获得更好的效果?没有实际的执行计划很难说,但它可能是如此简单,执行计划完全不同于没有OPTION,例如使用不同的索引(或更可能)使用MERGE或HASH连接以不同的方式加入。
答案 2 :(得分:6)
除此之外,MAXDOP显然可以用来解决潜在的恶意错误:
答案 3 :(得分:3)
SQL Server中存在一些具有异常输入的并行错误。选项(MAXDOP 1)将回避它们。
编辑:老。我的测试很大程度上是基于SQL 2005进行的。其中大多数似乎不再存在,但每隔一段时间我们就会质疑SQL 2014做一些愚蠢的事情并且我们回到原来的方式并且它有效。我们从来没有设法证明它不仅仅是在最近的情况下生成糟糕的计划,因为可以依赖SQL服务器在新版本中获得旧方法。由于所有情况都是IO绑定查询,因此MAXDOP 1不会受到伤害。答案 4 :(得分:0)
根据我观察到的性能问题,加上我的两分钱。
如果简单的查询不必要地进行了分析,那么它可能会带来比解决问题更多的问题。但是,在将MAXDOP作为“knee-jerk”修复程序添加到查询中之前,需要检查一些服务器设置。
在Jeremiah Peschka - Five SQL Server Settings to Change中,MAXDOP和“并行成本阈值”(CTFP
)被视为要检查的重要设置。
注意:Paul White在回复Performance problem after migration from SQL Server 2005 to 2012时提到了max server memory
作为要检查的设置。一篇好的kb文章是Using large amounts of memory can result in an inefficient plan in SQL Server
Jonathan Kehayias - Tuning ‘cost threshold for parallelism’ from the Plan Cache有助于找出CTFP
的良好价值。
Why is cost threshold for parallelism ignored?
Aaron Bertrand - Six reasons you should be nervous about parallelism讨论了MAXDOP是解决方案的一些场景。
中提到了并行性抑制组件