SQL - MAXDOP - 来自变量

时间:2018-04-17 13:20:09

标签: sql-server performance tsql

由于某种原因,您无法从变量设置MAXDOP数量。 有什么办法吗?

我不想使用动态SQL ....

DECLARE @int INT = 1
SELECT COUNT(*) AS MyCount FROM dbo.TableName
OPTION (MAXDOP @int);

我正在使用SQL Server 2014

更新: 我疯狂背后的原因还有很多。我们希望看看Purchases如何运行并从表中的值控制MAXDOP,如果它正在杀死我们想要减少MAXDOP的服务器而不更改代码。

3 个答案:

答案 0 :(得分:2)

  

我的疯狂背后还有更多的理由。我们想看看Purchases如何运行并从表中的值控制MAXDOP,如果它正在杀死我们想要在不改变代码的情况下减少MAXDOP的服务器。

您正在描述Resource Governor。您应该将这些查询分类到非关键资源池中,并限制它们可以使用的资源。链接有详细信息,因为这是一个冗长的主题。

对于记录,有一种方法可以控制查询的DOP而不改变SQL文本:plan guides

sp_create_plan_guide   
  @name = N'Guide2',   
  @stmt = N'SELECT COUNT(*) AS MyCount FROM dbo.TableName',  
  @type = N'SQL',  
  @module_or_batch = NULL,   
  @params = NULL,   
  @hints = N'OPTION (MAXDOP 1)';

@hints仍然是动态SQL。计划指南适用于同一查询文本的每次执行。我认为资源治理在各个方面都是优越的。

答案 1 :(得分:1)

虽然我认为前面的答案是最合适的,但如果你想避免使用动态SQL,那么更合适的问题是为什么你的服务器资源如此之高以至于你想要或者需要减少单个查询的MAXDOP ?也许更好的方法是对数据库性能进行基准测试,并优化获取异常数量系统资源的查询或过程。

答案 2 :(得分:0)

嗯。常规变量不起作用。 SQLCMD变量不起作用。无法使用动态SQL ......这种暴行怎么样。

DECLARE @testVariable INT = 2;

IF @testVariable = 1 SELECT 1 OPTION (MAXDOP = 1);

IF @testVariable = 2 SELECT 1 OPTION (MAXDOP = 2);

IF @testVariable = 3 SELECT 1 OPTION (MAXDOP = 3);

IF @testVariable = 4 SELECT 1 OPTION (MAXDOP = 4);

或者,你可以弯曲,并使用动态SQL。