Faj*_*iya 0 performance sql-server memory cpu
我最近注意到 SQL Server 错误日志中的一条错误消息显示“查询处理器耗尽了内部资源,无法生成查询计划”。我怀疑我的服务器可能内存或 CPU 资源不足。但是,我不确定如何确认这一点。
我知道 sysprocesses 和 sp_whoisactive 命令,但我不确定它们是否可以告诉我我的服务器目前是否耗尽了资源。
有人可以为我提供一些关于如何检查我的 SQL Server 当前是否内存或 CPU 资源不足的指导吗?任何帮助,将不胜感激。
完整的错误消息可能是:
\n\n\n查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于极其复杂的查询或引用大量表或分区的查询。请简化查询。如果您认为您错误地收到了此消息,请联系客户支持服务以获取更多信息。
\n
这可能不是由于缺乏传统意义上的资源(RAM、CPU、IO...),而更多的是由于查询的一个孤立问题,该问题对 SQL Server 数据库引擎的内部处理资源有影响。 。
\n您可能会收到此类错误消息的原因有多种。我将列出几个:
\n您的查询太复杂并且包含多个UNION
子句,这些子句将多个结果集连接到一个必须返回给客户端的大表中。\xc2\xa8
例如
\nSELECT <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您的查询包含多个子查询,并且正在耗尽内部资源。
\n例如
\nSELECT <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在 IN 子句中的括号内显式包含大量值(数千个用逗号分隔的值)可能会消耗资源并返回错误 8623 或 8632。要解决此问题,请将 IN 列表中的项目存储在表,并在 IN 子句中使用 SELECT 子查询。
\n参考: IN (Transact-SQL) (Microsoft Learn | SQL)
\n减少 UNION 子句的数量。
\n减少复杂语句中子查询的数量。
\n减少子句中的元素数量WHERE <column> IN (<value1>, <value2>, ... <value999>)
。另请考虑 Microsoft 给出的建议:
\n\n通过沿最大维度将查询分解为多个查询来简化查询。首先,删除所有不需要的查询元素,然后尝试添加临时表并将查询一分为二。请注意,如果将查询的一部分移至子查询、函数或公用表表达式,这是不够的,因为它们会被编译器重新组合成单个查询。您还可以尝试添加提示以提前强制执行计划,例如选项(强制订单)。
\n
\n参考: MSSQLSERVER_8623(Microsoft Learn | SQL)
\n\n有人可以为我提供一些关于如何检查我的 SQL Server 当前是否内存或 CPU 资源不足的指导吗?
\n
这是一个非常普遍的问题。找到耗尽内部资源的语句可能是您更好的选择。(请参阅顶部我最初的起始解释)
\n如果您没有 SQL Server 正常执行情况以及正在使用哪些资源的基线,那么您如何知道 SQL Server 是否正在耗尽任何资源?考虑看看基线SQLSkills 上的
\n好的。RAM 配置可能是一个问题。
\n尝试急救人员套件,看看现在到底发生了什么!
\n在您的问题中发布更多详细信息。为了提供更详细的答复,我们需要您的问题提供更多信息。
\n考虑聘请一名顾问。不,不是我...
\n