在SQL Server中使用OPTION(MAXDOP 1)的目的是什么?
我从未清楚地了解过MAXDOP的用法。我确实知道它可以使查询速度更快,并且这是我可以用于查询优化的最后一项。
但是,我的问题是,何时何地最适合在查询中使用它?
解决方案
这是对SQL Server中并行性的一般性杂乱,它可能无法直接回答问题。
在MAXDOP上的在线丛书中:
Sets the maximum number of processors the query processor can use to execute a single index statement. Fewer processors may be used depending on the current system workload.
请参阅Rickie Lee的有关并行性和CXPACKET等待类型的博客。这很有趣。
通常,在OLTP数据库中,我的意见是,如果查询的成本如此之高,则需要在多个处理器上执行该查询,则需要将该查询重新编写为更有效的内容。
为什么添加MAXDOP(1)会得到更好的结果?没有实际的执行计划很难说,但是它可能是如此简单,以至于执行计划与没有OPTION的情况完全不同,例如使用不同的索引(或者更可能)使用MERGE或者HASH连接进行不同的联接。
正如Kaboing提到的那样," MAXDOP(n)"实际上控制着查询处理器中使用的CPU内核数量。
在完全空闲的系统上,SQL Server将尝试将表尽快拉入内存并在内存中将它们之间联接。在情况下,最好是使用单个CPU来执行此操作。这可能与使用" OPTION(FORCE ORDER)"的效果相同,后者会强制查询优化器使用我们指定的联接顺序。在某些情况下,我已经看到" OPTION(FORCE PLAN)"将查询从执行时间的26秒减少到1秒。
联机丛书继续说," MAXDOP"的可能值为:
0 - Uses the actual number of available CPUs depending on the current system workload. This is the default value and recommended setting. 1 - Suppresses parallel plan generation. The operation will be executed serially. 2-64 - Limits the number of processors to the specified value. Fewer processors may be used depending on the current workload. If a value larger than the number of available CPUs is specified, the actual number of available CPUs is used.
我不确定" MAXDOP"的最佳用法是什么,但是我猜测一下,如果我们有一个包含8个分区的表,由于I / I,我们将要指定" MAXDOP(8)" O的限制,但我可能是错的。
这是我发现的有关" MAXDOP"的一些快速链接:
在线丛书:并行度
用于配置MAXDOP选项的一般准则
SQL Server中有几个带有异常输入的并行化错误。 OPTION(MAXDOP 1)将避开它们。
编辑:老。我的测试主要是在SQL 2005上完成的。大多数似乎都不存在了,但是每隔一段时间,我们都会质疑SQL 2014做一些愚蠢的事情的假设,而我们又回到了原来的方法并且可以正常工作。尽管由于可以依赖SQL Server在新版本中正确使用旧方法,所以我们从未设法证明在最近的情况下这不仅仅是一个糟糕的计划生成。由于所有情况都是受IO约束的查询,因此MAXDOP 1不会受到影响。
顺便说一句,MAXDOP显然可以用作解决潜在的令人讨厌的错误的方法:
返回的标识值并不总是正确的