如何避免“SQLServerException:查询处理器耗尽内部资源,无法生成查询计划。”

问题描述 投票:0回答:1

我通过 java.sql.Statement.executeQuery() 发出以下查询:

SELECT columns  FROM Table1, Table2
WHERE ( ColX IN (...) OR ColX IN (...) OR ... OR ColX IN (...) )
  AND Table1.Col1 = Table2.Col2

有 89 个(……);每个 (…) 包含 1000 个整数 ID,最后一个除外,后者包含 476 个。因此,查询中有 89,476 个整数 ID。

我回来了:

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

我在这里看到了使用#temp 表或表值参数的建议。 但是,如果我将查询粘贴到 SSMS 中,它运行正常并且返回 1937 行。 所以,这似乎在某些情况下可行。

因此,我的问题是:是否可以进行任何调整以允许从 Java 发出查询时运行?

背景:我有一位客户正在运行我们产品的后台版本。 我们支持多个 DBMS。 虽然我们可以考虑更改代码以在未来版本中使用 #temp 表或 TVP,但我们需要对旧版本进行最小的更改来解决它。 我正在使用 SQL Server 2022;不确定客户正在运行什么。

java sql-server
1个回答
0
投票
  1. 增加
    max server memory
    设置
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory', <new_memory_limit>;
RECONFIGURE;
  1. 使用查询提示
SELECT * FROM YourTable
WHERE ...
OPTION (RECOMPILE);
  1. 分析和优化您的索引

希望其中一些可以有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.