gpt4 book ai didi

java - 使用 IN 子句优化 oracle 查询

转载 作者:行者123 更新时间:2023-11-30 06:17:56 25 4
gpt4 key购买 nike

我有两个查询,我在其中使用了参数,并且我正在使用 setLongsetString 操作填充 PreparedStatement

查询 1

SELECT A, B FROM TABLE1 WHERE A in  (SELECT A FROM TABLE2 WHERE C in (?,?,?) )

查询 2

SELECT A, B FROM TABLE1 WHERE A in (?,?)

有人告诉我,它为每个可能的集合大小创建了一个唯一的查询,并污染了 Oracle 的 SQL 缓存。此外,Oracle 可以为每个查询选择不同的执行计划,因为大小不固定。

可以应用哪些优化来使其变得更好?

如果我创建大小为 50 的 in-clause 列表并使用虚拟/冗余变量填充剩余的列表会好吗?

如果我没记错的话,in-clause 中的 select-statement 将很难优化,除非将其提取出来并再次用作语句列表。

最佳答案

I am being told that it creates a unique query for each possible set size and pollutes Oracle's SQL cache.

这是正确的,假设 IN 列表中的项目数可以在请求之间改变。如果 IN 列表中的问号数量保持不变,就不会对缓存造成“污染”。

Also, oracle could choose different execution plans for each query here as size is not fixed.

这也是对的。不过,这是一件好事。

What optimizations could be applied to make it better? Would it be fine if I create in-clause list of size 50 and populate remaining ones using dummy/redundant variables?

当然。我多次使用这个技巧:我没有生成一个精确大小的列表,而是生成了长度可以被某个数字整除的列表(我使用了 16,但 50 也可以)。如果实际列表的大小不能被 16 整除,我会根据需要多次添加最后一项以达到正确的长度。

此实现的唯一优化是减少查询计划缓存中的项目。

关于java - 使用 IN 子句优化 oracle 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com