【问题标题】:SQL - MAXDOP - From VariableSQL - MAXDOP - 从变量
【发布时间】:2018-04-17 13:20:08
【问题描述】:

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

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

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

我使用的是 SQL Server 2014

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

【问题讨论】:

  • MAXDOP 更适合在服务器级别设置。在每个语句级别上动态更改它不是一个好主意...您可能有一个 XY 问题....实际问题是什么,而不是您认为的解决方案...?顺便说一句,不是我的反对
  • “我们需要能够在不同的区域运行 MAXDOP”——这不是真正的问题!这是您尝试的解决方案....
  • 那些对问题评分的人,请解释原因?
  • DV 可能来自没有阅读问题恕我直言的人
  • 不是我的反对意见,但如果有过 xy 问题,就是这样。 xyproblem.info

标签: sql-server performance tsql


【解决方案1】:

我的疯狂背后还有更多原因。我们想看看 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。计划指南适用于相同查询文本的每次执行。我认为资源治理在各个方面都是优越的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      嗯。常规变量不起作用。 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多