如何检查 SQL Server 现在是否内存或 CPU 资源不足?

Faj*_*iya 0 performance sql-server memory cpu

我最近注意到 SQL Server 错误日志中的一条错误消息显示“查询处理器耗尽了内部资源,无法生成查询计划”。我怀疑我的服务器可能内存或 CPU 资源不足。但是,我不确定如何确认这一点。

我知道 sysprocesses 和 sp_whoisactive 命令,但我不确定它们是否可以告诉我我的服务器目前是否耗尽了资源。

有人可以为我提供一些关于如何检查我的 SQL Server 当前是否内存或 CPU 资源不足的指导吗?任何帮助,将不胜感激。

Joh*_* N. 5

完整的错误消息可能是:

\n
\n

查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于极其复杂的查询或引用大量表或分区的查询。请简化查询。如果您认为您错误地收到了此消息,请联系客户支持服务以获取更多信息。

\n
\n

这可能不是由于缺乏传统意义上的资源(RAM、CPU、IO...),而更多的是由于查询的一个孤立问题,该问题对 SQL Server 数据库引擎的内部处理资源有影响。 。

\n

可能的原因

\n

您可能会收到此类错误消息的原因有多种。我将列出几个:

\n
    \n
  1. 您的查询太复杂并且包含多个UNION子句,这些子句将多个结果集连接到一个必须返回给客户端的大表中。\xc2\xa8

    \n

    例如

    \n
    SELECT <column> FROM <table> WHERE <predicate>\nUNION\nSELECT <column> FROM <table> WHERE <predicate>\nUNION\n....\nSELECT <column> FROM <table> WHERE <predicate> as RESULTSET;\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 您的查询包含多个子查询,并且正在耗尽内部资源。

    \n

    例如

    \n
    SELECT <column> FROM <table> WHERE <column> = \n    (SELECT <column> FROM <table> WHERE <search_predicate> AND <column>\n        (SELECT <column> FROM <table> WHERE <search_predicate>)\n    );\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
  5. 在 IN 子句中的括号内显式包含大量值(数千个用逗号分隔的值)可能会消耗资源并返回错误 8623 或 8632。要解决此问题,请将 IN 列表中的项目存储在表,并在 IN 子句中使用 SELECT 子查询。

    \n

    参考: IN (Transact-SQL) (Microsoft Learn | SQL)

    \n
  6. \n
\n

解决方案

\n
    \n
  1. 减少 UNION 子句的数量。

    \n
  2. \n
  3. 减少复杂语句中子查询的数量。

    \n
  4. \n
  5. 减少子句中的元素数量WHERE <column> IN (<value1>, <value2>, ... <value999>)。另请考虑 Microsoft 给出的建议:

    \n
    \n

    通过沿最大维度将查询分解为多个查询来简化查询。首先,删除所有不需要的查询元素,然后尝试添加临时表并将查询一分为二。请注意,如果将查询的一部分移至子查询、函数或公用表表达式,这是不够的,因为它们会被编译器重新组合成单​​个查询。您还可以尝试添加提示以提前强制执行计划,例如选项(强制订单)。
    \n参考: MSSQLSERVER_8623(Microsoft Learn | SQL)

    \n
    \n
  6. \n
\n

回答您的(其他)问题

\n
\n

有人可以为我提供一些关于如何检查我的 SQL Server 当前是否内存或 CPU 资源不足的指导吗?

\n
\n
    \n
  1. 这是一个非常普遍的问题。找到耗尽内部资源的语句可能是您更好的选择。(请参阅顶部我最初的起始解释)

    \n
  2. \n
  3. 如果您没有 SQL Server 正常执行情况以及正在使用哪些资源的基线,那么您如何知道 SQL Server 是否正在耗尽任何资源?考虑看看基线SQLSkills 上的

    \n
  4. \n
  5. 好的。RAM 配置可能是一个问题。

    \n\n
  6. \n
  7. 尝试急救人员套件,看看现在到底发生了什么!

    \n
      \n
    • sp_BlitzFirst :为什么我的 SQL Server 现在很慢?
    • \n
    • sp_BlitzCache:哪些查询使用了最多的资源?
    • \n
    • sp_BlitzWho :谁现在正在运行什么查询?
    • \n
    \n
  8. \n
  9. 在您的问题中发布更多详细信息。为了提供更详细的答复,我们需要您的问题提供更多信息。

    \n
      \n
    • SQL Server 版本
    • \n
    • SQL服务器版
    • \n
    • 数据库大小
    • \n
    • 桌子尺寸
    • \n
    • 内存/CPU
    • \n
    • 最大并行度设置(SQL Server 属性)
    • \n
    • 并行度设置的成本阈值(SQL Server 属性)
    • \n
    \n
  10. \n
  11. 考虑聘请一名顾问。不,不是我...

    \n
  12. \n
\n