在SQL Server中使用OPTION(MAXDOP 1)的目的是什么?

我从来没有清楚地了解MAXDOP的用法。 我知道它使查询更快,并且它是我可以用于查询优化的最后一个项目。

但是,我的问题是,何时何地最适合在查询中使用?

正如Kaboing所述, MAXDOP(n)实际上控制着查询处理器中正在使用的CPU核心的数量。

在一个完全空闲的系统上,SQL Server将尽可能快地将表拉入内存,并在内存之间进行连接。 这可能是,在你的情况下,最好用一个CPU做到这一点。 这可能与使用OPTION (FORCE ORDER)强制查询优化器使用您指定的连接顺序相同。 在某些情况下,我看到OPTION (FORCE PLAN)将查询从26秒减less到1秒的执行时间。

联机丛书继续说, MAXDOP可能值是:

0 – 根据当前系统工作负载使用可用CPU的实际数量。 这是默认值和推荐设置。

1 – 禁止并行计划生成。 该操作将被连续执行。

2-64 – 将处理器数量限制为指定值。 根据当前的工作量,可以使用更less的处理器。 如果指定了大于可用CPU数的值,则使用实际可用CPU数。

我不确定MAXDOP的最佳用法是什么,但是我会猜测,如果你有一个有8个分区的表格,你可能会因为I / O的限制而指定MAXDOP(8) ,但是我可能是错的。

以下是我发现的有关MAXDOP的几个快速链接:

在线书籍:并行度

一般准则,用来configurationMAXDOP选项

这是一个在SQL Server中的并行性泛泛而谈,它可能不会直接回答你的问题。

来自联机丛书,在MAXDOP上:

设置查询处理器可用于执行单个索引语句的处理器的最大数量。 根据当前的系统工作量,可以使用更less的处理器。

请参阅Rickie Lee的关于并行性和CXPACKET等待types的博客 。 这很有趣。

一般来说,在一个OLTP数据库中,我的观点是,如果一个查询如此昂贵,需要在多个处理器上执行,则查询需要被重写成更有效率的东西。

为什么添加MAXDOP(1)可以获得更好的结果? 很难说没有实际的执行计划,但它可能是如此简单,因为执行计划是完全不同的,没有OPTION,例如使用不同的索引(或更可能)join不同,使用MERGE或HASH联接。

除此之外,MAXDOP显然可以用来解决一个潜在的问题:

返回的身份值并不总是正确的

SQL Server中有几个parallization错误,inputexception。 选项(MAXDOP 1)将避开它们。

编辑:老。 我的testing很大程度上是在SQL 2005上完成的。大部分这些似乎都不存在了,但是每隔一段时间我们就会质疑SQL 2014做了些什么愚蠢的假设,而我们又回到了旧的方式并且工作。 我们从来没有设法certificate,尽pipeSQL server可以依靠在新版本中得到旧的方式,但它不仅仅是最近发生的错误计划。 由于所有的情况都是IO绑定查询MAXDOP 1不会伤害。

根据我观察到的性能问题添加我的两分钱。

如果简单的查询不必要地相互混淆,它可能带来更多的问题,而不是解决问题。 但是,在将MAXD​​OP添加到查询中作为“拐点”修复之前,需要检查一些服务器设置。

在Jeremiah Peschka – 要改变的五个SQL Server设置 ,MAXDOP和“并行性的成本CTFP ”( CTFP )被提及作为重要的设置来检查。

注意:Paul White提到了max server memory作为一个设置来检查, 从SQL Server 2005迁移到2012之后,对性能问题做出响应。 要阅读的一个很好的kb的文章是使用大量的内存可能会导致SQL Server中一个低效的计划

Jonathan Kehayias – 从计划caching中调整“并行性成本阈值”有助于为CTFPfind合适的价值。

为什么忽略并行性的成本门槛?

Aaron Bertrand – 你应该对平行性感到紧张的六个原因是关于 MAXDOP是解决scheme的一些场景的讨论。

并行性抑制组件在Paul White提出 – 强制执行并行查询执行计划