我通过 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;不确定客户正在运行什么。
max server memory
设置EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory', <new_memory_limit>;
RECONFIGURE;
SELECT * FROM YourTable
WHERE ...
OPTION (RECOMPILE);
希望其中一些可以有所帮助